From 702ec9c68def2982a74b13f0efc9bdcb786839fe Mon Sep 17 00:00:00 2001 From: Sudeep7353 <103890430+Sudeep7353@users.noreply.github.com> Date: Wed, 22 Jan 2025 17:41:47 +0530 Subject: [PATCH] MOSIP-39024 : Merge code from develop-pmp-revamp to release-1.3.x for 1.3.0-beta1 (#1118) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * updated pom version. (#789) Signed-off-by: sudeep * MOSIP-34711 : API Development: getAllSBIDetails() (#792) * MOSIP-34711 : API Development: getAllSBIDetails() Signed-off-by: sudeep * MOSIP-34711 : API Development: getAllSBIDetails() Signed-off-by: sudeep * MOSIP-34711 : API Development: getAllSBIDetails() Signed-off-by: sudeep * MOSIP-34711 : API Development: getAllSBIDetails() Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-34711 : Junit-getAllSBIDetails() (#793) Signed-off-by: sudeep * MOSIP-34823 : API Development: getAllApprovedDeviceProviderIds() (#794) Signed-off-by: sudeep * MOSIP-34823 : Junit: getAllApprovedDeviceProviderIds() (#797) * MOSIP-34823 : Junit: getAllApprovedDeviceProviderIds() Signed-off-by: sudeep * MOSIP-34823 : Junit: getAllApprovedDeviceProviderIds() Signed-off-by: sudeep * MOSIP-34823 : Junit: getAllApprovedDeviceProviderIds() Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-34623: updated the role in properties (#802) * MOSIP-34623: updated the role in properties Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-34623: updated the role in properties Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-34935 : API Development: getAllDevicesForSBI() (#805) Signed-off-by: sudeep * MOSIP-34935 : API Development: getAllDevicesForSBI() (#806) Signed-off-by: sudeep * MOSIP-34711 : API Development: getAllSBIDetails() (#807) * MOSIP-34711 : API Development: getAllSBIDetails() Signed-off-by: sudeep * MOSIP-34711 : API Development: getAllSBIDetails() Signed-off-by: sudeep * MOSIP-34711 : API Development: getAllSBIDetails() Signed-off-by: sudeep --------- Signed-off-by: sudeep * corrected exception handling (#808) * corrected exception handling Signed-off-by: sudeep * corrected exception handling Signed-off-by: sudeep --------- Signed-off-by: sudeep * corrected exception handling (#809) Signed-off-by: sudeep * MOSIP-34605 fixed date validation issues (#810) * MOSIP-34108, MOSIP-34276: OIDC update issues fixed Signed-off-by: Mayura Deshmukh * junit Signed-off-by: Mayura Deshmukh * updated method name Signed-off-by: Mayura Deshmukh * MOSIP-34430 checking status before deactivating API key Signed-off-by: Mayura Deshmukh * commented Signed-off-by: Mayura Deshmukh * MOSIP-34605 fixed date validation issues Signed-off-by: Mayura Deshmukh * fixed JUNIT Signed-off-by: Mayura Deshmukh --------- Signed-off-by: Mayura Deshmukh * MOSIP-34943 : API Development: addInactiveDeviceMappingToSbi() (#811) * MOSIP-34943 : API Development: addInactiveDeviceMappingToSbi() Signed-off-by: sudeep * MOSIP-34943 : API Development: addInactiveDeviceMappingToSbi() Signed-off-by: sudeep * MOSIP-34943 : API Development: addInactiveDeviceMappingToSbi() Signed-off-by: sudeep * MOSIP-34943 : API Development: addInactiveDeviceMappingToSbi() Signed-off-by: sudeep * MOSIP-34943 : API Development: addInactiveDeviceMappingToSbi() Signed-off-by: sudeep * MOSIP-34943 : API Development: addInactiveDeviceMappingToSbi() Signed-off-by: sudeep * MOSIP-34943 : API Development: addInactiveDeviceMappingToSbi() Signed-off-by: sudeep * MOSIP-34943 : API Development: addInactiveDeviceMappingToSbi() Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-34943 : API Development: addInactiveDeviceMappingToSbi() (#813) * MOSIP-34943 : API Development: addInactiveDeviceMappingToSbi() Signed-off-by: sudeep * MOSIP-34943 : API Development: addInactiveDeviceMappingToSbi() Signed-off-by: sudeep * MOSIP-34943 : API Development: addInactiveDeviceMappingToSbi() Signed-off-by: sudeep * MOSIP-34943 : API Development: addInactiveDeviceMappingToSbi() Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP:34944 - API Development: approveDeviceWithSbiMapping() (#817) * MOSIP:34944 - API Development: approveDeviceWithSbiMapping() Signed-off-by: sudeep * MOSIP:34944 - API Development: approveDeviceWithSbiMapping() Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP:34944 - Junits: approveDeviceWithSbiMapping() (#819) * MOSIP:34944 - Junits: approveDeviceWithSbiMapping() Signed-off-by: sudeep * Updated MultiPartnerAdminServiceContollerTest.java Signed-off-by: Sudeep7353 <103890430+Sudeep7353@users.noreply.github.com> --------- Signed-off-by: sudeep Signed-off-by: Sudeep7353 <103890430+Sudeep7353@users.noreply.github.com> * MOSIP:34944 - API Development: rejectDeviceWithSbiMapping() (#820) * MOSIP:34944 - API Development: rejectDeviceWithSbiMapping() Signed-off-by: sudeep * MOSIP:34944 - API Development: rejectDeviceWithSbiMapping() Signed-off-by: sudeep * MOSIP:34944 - API Development: rejectDeviceWithSbiMapping() Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-35264: Added isActive field in SbiDetailsDto (#821) Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35264: Updated the count of devices approved and pending_approval (#822) Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35262: API development - deactivateDevice (#823) * MOSIP-35262: API development - deactivateDevice Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35262: API development - deactivateDevice Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35262: API development - deactivateDevice Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35262: Added junit tests for deactivateDevice (#824) Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35319: Fixed the data validations (#825) Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-32075 dp1 properties refactoring (#827) * MOSIP-34108, MOSIP-34276: OIDC update issues fixed Signed-off-by: Mayura Deshmukh * junit Signed-off-by: Mayura Deshmukh * updated method name Signed-off-by: Mayura Deshmukh * MOSIP-34430 checking status before deactivating API key Signed-off-by: Mayura Deshmukh * commented Signed-off-by: Mayura Deshmukh * MOSIP-34605 fixed date validation issues Signed-off-by: Mayura Deshmukh * fixed JUNIT Signed-off-by: Mayura Deshmukh * MOSIP-32075 dp1 properties refactoring Signed-off-by: Mayura Deshmukh --------- Signed-off-by: Mayura Deshmukh * MOSIP-35264: API development - deactivateSbi (#829) * MOSIP-35264: API development - deactivateSBI Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35264: API development - deactivateSBI Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35264: Junit tests for deactivateSbi() (#830) Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35264: Added request id validations in deactivateSbi and deactivateDevice (#831) Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35355: Updated the validateSbiDeviceMapping() (#832) * MOSIP-35355: Updated the validateSbiDeviceMapping() Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35355: Updated the validateSbiDeviceMapping() Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * added definePolicyGroup test cases (#796) * added definePolicyGroup test cases Signed-off-by: ckesiraju * Added Activate and deactivate partner and Approvemapping test cases Signed-off-by: ckesiraju * Updated negative test cases Signed-off-by: ckesiraju * Updated negative test cases Signed-off-by: ckesiraju --------- Signed-off-by: ckesiraju * MOSIP-35355: Bug fixes (#834) * MOSIP-35355: Bug fixes Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35314: Updated the error message Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-34947: Deprecated Edit Sbi, Edit Device and Unmap device to SBI… (#838) * MOSIP-34947: Deprecated edit sbi, edit device and unmap device to sbi endpoints Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-34947: Deprecated edit sbi, edit device and unmap device to sbi endpoints Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-34947: Deprecated edit sbi, edit device and unmap device to sbi endpoints Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-34947: Deprecated edit sbi, edit device and unmap device to sbi endpoints Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35092: Added foreign key mapping in device_detail_sbi table (#840) * MOSIP-35092: Added foreign mapping in device_detail_sbi table Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35092: Added foreign mapping in device_detail_sbi table Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35092: Added foreign mapping in device_detail_sbi table Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35092: Added foreign mapping in device_detail_sbi table Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35092: Added foreign mapping in device_detail_sbi table Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * Rename 1.2.1.0_to_1.2.2.0_upgrade.sql to 1.2.1.0_to_1.3.0-dp.1_upgrade.sql.sql Signed-off-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> * Rename 1.2.1.0_to_1.2.2.0_rollback.sql to 1.2.1.0_to_1.3.0-dp.1_rollback.sql.sql Signed-off-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> * DSD-6112 Renamed the upgrade SH & properties file Signed-off-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> * Rename pms_release_db_deploy.sh to pms_old_release_db_deploy.sh Signed-off-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> * Rename pms_release_deploy.properties to pms_old_release_deploy.properties Signed-off-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> * Rename pms_revoke_db_deploy.sh to pms_old_revoke_db_deploy.sh Signed-off-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> * MOSIP-35330: Updated the SBI created date and expiry date validation (#847) * MOSIP-35092: Added foreign mapping in device_detail_sbi table Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35092: Added foreign mapping in device_detail_sbi table Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35092: Added foreign mapping in device_detail_sbi table Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35092: Added foreign mapping in device_detail_sbi table Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35092: Added foreign mapping in device_detail_sbi table Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35330: Updated the SBI created date and expiry date validation Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35330: Updated the SBI created date and expiry date validation Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * [MOSIP-35571, MOSIP-35560]: API Development of ftm-chip-details() & approved-ftm-provider-ids() (#852) * MOSIP-35571: API Development - ftm-chip-details() Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35571: API Development - ftm-chip-details() Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35560: API Development of approved-ftm-provider-ids() Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35560: API Development of approved-ftm-provider-ids() Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35571: API Development - ftm-chip-details() Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35571: Removed certificateName field (#855) Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * cleaned up Api Response codes. (#854) Signed-off-by: sudeep * MOSIP-35598 : PMP API: Response id is not as per the id given in request (#853) * MOSIP-35598 : PMP API: Response id is not as per the id given in request Signed-off-by: sudeep * MOSIP-35598 : PMP API: Response id is not as per the id given in request Signed-off-by: sudeep * MOSIP-35598 : PMP API: Response id is not as per the id given in request Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-34986: Junit tests (#857) Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35655 : The error message is not user-friendly fix. (#856) Signed-off-by: sudeep * MOSIP-35655 : The error message is not user-friendly fix. (#858) Signed-off-by: sudeep * MOSIP-35671 -Merging java21 with develop (#862) * MOSIP-35671 -Merging java21 with develop Signed-off-by: Mohanachandran S <165888272+mohanachandran-s@users.noreply.github.com> * MOSIP-35671 -Merging java21 with develop Signed-off-by: Mohanachandran S <165888272+mohanachandran-s@users.noreply.github.com> * MOSIP-35671 -Merging java21 Signed-off-by: Mohanachandran S <165888272+mohanachandran-s@users.noreply.github.com> --------- Signed-off-by: Mohanachandran S <165888272+mohanachandran-s@users.noreply.github.com> * MOSIP-34986: Removed partnerTypes field from ftm-chip-details() and approved-ftm-provider-ids() (#864) * MOSIP-34986: Removed partnerTypes field from ftm-chip-details() and approved-ftm-provider-ids() Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-34986: Removed partnerTypes field from ftm-chip-details() and approved-ftm-provider-ids() Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35689: added RequestWrapperV2 and ResponseWrapperV2. (#865) * MOSIP-35689: added RequestWrapperV2 and ResponseWrapperV2. Signed-off-by: sudeep * MOSIP-35689: added RequestWrapperV2 and ResponseWrapperV2. Signed-off-by: sudeep * MOSIP-35689: added RequestWrapperV2 and ResponseWrapperV2. Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-33115: renamed the Device Provider API endpoints (#869) * MOSIP-33115: renamed the API endpoints. Signed-off-by: sudeep * MOSIP-33115: renamed the API endpoints. Signed-off-by: sudeep * MOSIP-33115: renamed the API endpoints. Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-35533 (#868) Signed-off-by: Anup Nehe * MOSIP-33115: renamed the API endpoints. (#870) * MOSIP-33115: renamed the API endpoints. Signed-off-by: sudeep * MOSIP-33115: renamed the API endpoints. Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-35533 fix the failures for the pmp revamp. (#872) * MOSIP-35533 Signed-off-by: Anup Nehe * MOSIP-35533 Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe --------- Signed-off-by: Anup Nehe * MOSIP-35581: API development of deactivate-ftm() (#874) * MOSIP-35581: API development- deactivate-ftm() Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35581: API development- deactivate-ftm() Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35581: API development- deactivate-ftm() Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35690 : API endpoints update as per review. (#875) Signed-off-by: sudeep * MOSIP-35581: Junit tests (#877) Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35690 : API endpoints Ids and role update (#878) * MOSIP-35690 : API endpoints Ids and role update Signed-off-by: sudeep * MOSIP-35690 : API endpoints Ids and role update Signed-off-by: sudeep * MOSIP-35690 : API endpoints Ids and role update Signed-off-by: sudeep * MOSIP-35690 : API endpoints Ids and role update Signed-off-by: sudeep * MOSIP-35690 : API endpoints Ids and role update Signed-off-by: sudeep * MOSIP-35690 : API endpoints Ids and role update Signed-off-by: sudeep * MOSIP-35690 : API endpoints Ids and role update Signed-off-by: sudeep * MOSIP-35690 : API endpoints Ids and role update Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-35876: API development of original-ftm-certificate() (#880) * MOSIP-35876: API development of original-ftm-certificate() Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35876: API development of original-ftm-certificate() Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35876: API development of original-ftm-certificate() Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35788 : bug fix. (#881) * MOSIP-35788 : bug fix. Signed-off-by: sudeep * MOSIP-35788 : bug fix. Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-35541: Updated the SBI expiry date validation in UTC (#882) * MOSIP-35332: Updated the SBI expiry date validation in UTC Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35332: Updated the SBI expiry date validation in UTC Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35876: Junit test for original-ftm-certificate() (#883) Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35541: reverting the PR(882) (#884) Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-34432 negative testcase (#790) * negative testcase Signed-off-by: Likhitha R L * negative testcases Signed-off-by: Likhitha R L * Negative Testcases Signed-off-by: Likhitha R L * negative testcases Signed-off-by: Likhitha R L * negative testcase Signed-off-by: Likhitha R L * MOSIP-34432 Signed-off-by: Likhitha R L * MOSIP-34432 Signed-off-by: Likhitha R L * MOSIP-34432 negative testcase Signed-off-by: Likhitha R L * MOSIP-34432 negative testcases Signed-off-by: Likhitha R L * MOSIP-34432 negative testcases Signed-off-by: Likhitha R L --------- Signed-off-by: Likhitha R L Co-authored-by: Likhitha R L * MOSIP-35330: Added maximun year validation for SBI Created Date (#888) * MOSIP-35330: Added maximun year validation for SBI Created Date Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35330: Added maximun year validation for SBI Created Date Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-36023 (#889) Signed-off-by: Jayesh Kharode Co-authored-by: Jayesh Kharode * MOSIP-35916 - Renamed the apitest folder to api-test (#894) Signed-off-by: Mohanachandran S * MOSIP-35723: Added unique index for same make and model (#891) * MOSIP-35723: Added unique index for same make and model Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35723: Added unique index for same make and model Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35092: removed foreign key mapping in device_detail_sbi table (#898) Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-35895,MOSIP-35655 - updated error messages. (#899) Signed-off-by: sudeep * MOSIP-35416 (#904) Signed-off-by: Anup Nehe * ES-836 : Get oauth client endpoint should return client name language map. (#901) * ES-836 : Get oauth client endpoint should return client name language map. Signed-off-by: sudeep * ES-836 : Get oauth client endpoint should return client name language map. Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-35916 - Renamed the apitest folder to api-test (#906) Signed-off-by: Mohanachandran S * MOSIP-36037 : Sonar coverage. (#907) Signed-off-by: sudeep * MOSIP-36044: Updated the error message for inactive-mapping-device-to_sbi() (#908) * MOSIP-36044: Updated the error message for inactive-mapping-device-to-sbi() Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-36044: Updated the error message for inactive-mapping-device-to-sbi() Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-36089: partner admin role bug fix. (#909) Signed-off-by: sudeep * Revert "MOSIP-36089: partner admin role bug fix. (#909)" (#912) This reverts commit 438c422f4ee6cd3bff5d4f92498c76a4c9c0cef5. * MOSIP-35404 | Move component specific test code from common to component api test rigs (#918) * MOSIP-35916 - Renamed the apitest folder to api-test Signed-off-by: Mohanachandran S * MOSIP-35404 | Move component specific test code from common to component api test rigs Signed-off-by: Mohanachandran S --------- Signed-off-by: Mohanachandran S * MOSIP-36285 : The FTM Chip status is not updating in the Admin portal after re-uploading the FTM certificate. (#919) Signed-off-by: sudeep * MOSIP-35404 Signed-off-by: Nandhukumar * MOSIP-35404 Signed-off-by: Nandhukumar * MOSIP:35655, MOSIP:36406 - bug fixes. (#923) Signed-off-by: sudeep * MOSIP-35416 fix automation failure (#924) * MOSIP-35416 Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe --------- Signed-off-by: Anup Nehe * MOSIP-36411: Updated the field isActive in deactivate APIs (#926) Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP:36283-Partner is able to reupload the Certificate for Deactivated FTM. (#925) * MOSIP:36283-Partner is able to reupload the Certificate for Deactivated FTM. Signed-off-by: sudeep * MOSIP:36283-Partner is able to reupload the Certificate for Deactivated FTM. Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-35416 fix for automation (#927) * MOSIP-35416 Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * MOSIP-35416 Signed-off-by: Anup Nehe * MOSIP-35416 Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe --------- Signed-off-by: Anup Nehe * MOSIP-36089: PMS API-Error messages are not user friendly (#930) Signed-off-by: sudeep * MOSIP-36219 - The PMS (and eSignet) Create OIDC endpoints allow duplicate public key (#928) * MOSIP-36219 - The PMS (and eSignet) Create OIDC endpoints allow duplicate public key Signed-off-by: sudeep * MOSIP-36219 - The PMS (and eSignet) Create OIDC endpoints allow duplicate public key Signed-off-by: sudeep * MOSIP-36219 - The PMS (and eSignet) Create OIDC endpoints allow duplicate public key Signed-off-by: sudeep * MOSIP-36219 - The PMS (and eSignet) Create OIDC endpoints allow duplicate public key Signed-off-by: sudeep * MOSIP-36219 - The PMS (and eSignet) Create OIDC endpoints allow duplicate public key Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-36679 - Added db delete queries (#936) * MOSIP-36679 - Added db delete queries Signed-off-by: Mohanachandran S * MOSIP-36679 - Added db delete queries Signed-off-by: Mohanachandran S --------- Signed-off-by: Mohanachandran S * MOSIP-36506:Partners' details (Partner Admin) : API GET /partners/v3/{partnerId} (#935) * MOSIP-36506:Partners' details (Partner Admin) : API GET /partners/v3/{partnerId} (#937) Signed-off-by: sudeep * MOSIP-35797 : Unable to re upload a partner certificate for FTM partner (#940) Signed-off-by: sudeep * MOSIP-36467: Created new endpoint v3 to fetch all partners details (#942) * MOSIP-36467: Created new endpoint v3 to fetch all partners details Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-36467: Created new endpoint v3 to fetch all partners details Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-36506:Partners' details (Partner Admin) : API GET /partners/v3/{partnerId} (#943) Signed-off-by: sudeep * MOSIP-36321: Added validation for PARTNER_ADMIN role (#945) * MOSIP-36321: Added validation for PARTNER_ADMIN role Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-36321: Added validation for PARTNER_ADMIN role Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> * MOSIP-36810 Error message is not appropriate for mapping same device and same SBI details (#948) * MOSIP-36810: Error message is not appropriate for mapping same device and same SBI details Signed-off-by: sudeep * MOSIP-36810: Error message is not appropriate for mapping same device and same SBI details Signed-off-by: sudeep * MOSIP-36810: Error message is not appropriate for mapping same device and same SBI details Signed-off-by: sudeep --------- Signed-off-by: sudeep * [MOSIP-36516] : Automate PMS Revamp for FTM Provider services (#944) * MOSIP-35416 Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * MOSIP-35416 Signed-off-by: Anup Nehe * MOSIP-35416 Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * MOSIP-36516 Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * MOSIP-36516 Signed-off-by: Anup Nehe * MOSIP-36516 Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe --------- Signed-off-by: Anup Nehe * MOSIP:36804 - Filter related changes in API GET /partners/v3 (#950) Signed-off-by: sudeep * MOSIP:36804 - Filter related changes in API GET /partners/v3 (#952) * MOSIP:36804 - Filter related changes in API GET /partners/v3 Signed-off-by: sudeep * MOSIP:36804 - Filter related changes in API GET /partners/v3 Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-36423 - Automated Negative Scenarios for PMS (#939) * MOSIP-36423 Signed-off-by: Prathmesh Jadhav * [MOSIP-36423] - Automated GetAllDeviceListMappedWithSbi Signed-off-by: Prathmesh Jadhav * MOSIP-36423 - Automated Negative Scenarios for PMS Signed-off-by: Prathmesh Jadhav --------- Signed-off-by: Prathmesh Jadhav Signed-off-by: prathmeshj12 <166711249+prathmeshj12@users.noreply.github.com> * MOSIP:36804 - Filter related changes in API GET /partners/v3 (#953) * MOSIP:36804 - Filter related changes in API GET /partners/v3 Signed-off-by: sudeep * MOSIP:36804 - Filter related changes in API GET /partners/v3 Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-36506: removed isCertificateExpired in PartnerDetailsV3Dto (#954) Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-33297: Added a check to verify partner activation status before deactivating the API key. (#956) Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-33297: Added a check to verify partner activation status before deactivating the API key. (#958) Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-36219 - The PMS (and eSignet) Create OIDC endpoints allow duplicate public key (#959) Signed-off-by: sudeep * MOSIP:36506: Partners' details (Partner Admin) : API GET /partners/{partnerId}/v2 (#960) * MOSIP:36506: Partners' details (Partner Admin) : API GET /partners/{partnerId}/v2 Signed-off-by: sudeep * MOSIP:36506: Partners' details (Partner Admin) : API GET /partners/{partnerId}/v2 Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-36917,MOSIP-36916 : UI and Integration with API: Create Datashare Policy (#962) Signed-off-by: sudeep * MOSIP-37141: Created new v2 endpoint for policies (#963) * MOSIP-37141: Created new v2 endpoint for policies Signed-off-by: Swetha K * MOSIP-37141: Created new v2 endpoint for policies Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-36580: Handled missing 'Empty Array and Empty String' Schema Validation (#965) Signed-off-by: sudeep * MOSIP-37141: Junit tests (#966) Signed-off-by: Swetha K Co-authored-by: Swetha K * removed certificateIssuedTo field from /{partnerId}/v2 (#968) Signed-off-by: sudeep * MOSIP-36832 - Automated FTM Negative Scenarios (#967) * MOSIP-36423 Signed-off-by: Prathmesh Jadhav * [MOSIP-36423] - Automated GetAllDeviceListMappedWithSbi Signed-off-by: Prathmesh Jadhav * MOSIP-36423 - Automated Negative Scenarios for PMS Signed-off-by: Prathmesh Jadhav * MOSIP-36832 - Automated FTM Scenarios Signed-off-by: Prathmesh Jadhav --------- Signed-off-by: Prathmesh Jadhav Signed-off-by: prathmeshj12 <166711249+prathmeshj12@users.noreply.github.com> * MOSIP-37273 : API GET /partners/partner-policy-requests (#971) * MOSIP-37273 : API GET /partners/partner-policy-requests Signed-off-by: sudeep * MOSIP-37273 : API GET /partners/partner-policy-requests Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-37273 : API GET /partners/partner-policy-requests (#972) Signed-off-by: sudeep * changed length validation for create policy (#973) Signed-off-by: sudeep * MOSIP-37273 : API GET /partners/partner-policy-requests (#974) Signed-off-by: sudeep * MOSIP-35326: Updated time in LocalDateTime (#975) * MOSIP-35326: Updated time in LocalDateTime Signed-off-by: Swetha K * Update bootstrap.properties Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> --------- Signed-off-by: Swetha K Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> Co-authored-by: Swetha K * MOSIP-37012,MOSIP:37107 : bug fixes (#976) Signed-off-by: sudeep * MOSIP-37101: Added items per page in config (#978) * MOSIP-35326: Updated time in LocalDateTime Signed-off-by: Swetha K * MOSIP-37101: Added items per page in config Signed-off-by: Swetha K * MOSIP-37101: Added items per page in config Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-37017 : Disable the Download button in Partner Certificate (#980) * MOSIP-37017 : Disable the Download button in Partner Certificate Signed-off-by: sudeep * MOSIP-37017 : Disable the Download button in Partner Certificate Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-37434 : (Policy Manager): API PATCH /policies/{policyId} (#981) * MOSIP-37434 : (Policy Manager): API PATCH /policies/{policyId} Signed-off-by: sudeep * MOSIP-37434 : (Policy Manager): API PATCH /policies/{policyId} Signed-off-by: sudeep * MOSIP-37434 : (Policy Manager): API PATCH /policies/{policyId} Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-37476 - updated the docker file (#986) Signed-off-by: Mohanachandran S <165888272+mohanachandran-s@users.noreply.github.com> * MOSIP-37273: Added policy id field in filters (#988) * MOSIP-35326: Updated time in LocalDateTime Signed-off-by: Swetha K * MOSIP-37101: Added items per page in config Signed-off-by: Swetha K * MOSIP-37273: Added policy id field in filters Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-37409 : Statuses and Action Menus in Tabular View of Authentication and Datashare Policies (#989) * Statuses and Action Menus in Tabular View of Authentication and Datashare Policies Signed-off-by: sudeep * Statuses and Action Menus in Tabular View of Authentication and Datashare Policies Signed-off-by: sudeep * Statuses and Action Menus in Tabular View of Authentication and Datashare Policies Signed-off-by: sudeep * Statuses and Action Menus in Tabular View of Authentication and Datashare Policies Signed-off-by: sudeep * Statuses and Action Menus in Tabular View of Authentication and Datashare Policies Signed-off-by: sudeep --------- Signed-off-by: sudeep * [MOSIP-37383, MOSIP-37384, MOSIP-37373, MOSIP-37374]: corrected websub url in properties (#991) * MOSIP-35326: Updated time in LocalDateTime Signed-off-by: Swetha K * MOSIP-37101: Added items per page in config Signed-off-by: Swetha K * [MOSIP-37383, MOSIP-37384, MOSIP-37373, MOSIP-37374]: corrected websub url in properties Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-36832 Automated Negative scenarios for Deactivate FTM and Get Original FTM cert (#982) * MOSIP-36423 Signed-off-by: Prathmesh Jadhav * [MOSIP-36423] - Automated GetAllDeviceListMappedWithSbi Signed-off-by: Prathmesh Jadhav * MOSIP-36423 - Automated Negative Scenarios for PMS Signed-off-by: Prathmesh Jadhav * MOSIP-36832 - Automated FTM Scenarios Signed-off-by: Prathmesh Jadhav * MOSIP-36832 Automated Negative scenarios for Deactivate FTM and Get Original FTM cert Signed-off-by: Prathmesh Jadhav * MOSIP-36832 Automated Negative scenarios for Deactivate FTM and Get Original FTM cert Signed-off-by: Prathmesh Jadhav * MOSIP-36832 Automated Negative scenarios for Deactivate FTM and Get Original FTM cert Signed-off-by: Prathmesh Jadhav --------- Signed-off-by: Prathmesh Jadhav Signed-off-by: prathmeshj12 <166711249+prathmeshj12@users.noreply.github.com> * MOSIP-37636: API Development of oauth/partners/clients (#994) * MOSIP-35326: Updated time in LocalDateTime Signed-off-by: Swetha K * MOSIP-37101: Added items per page in config Signed-off-by: Swetha K * MOSIP-37636: API Development of oauth/partners/clients Signed-off-by: Swetha K * MOSIP-37636: API Development of oauth/partners/clients Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-37636: Added policyGroupDescription in partner details v2 endpoint (#995) * MOSIP-35326: Updated time in LocalDateTime Signed-off-by: Swetha K * MOSIP-37101: Added items per page in config Signed-off-by: Swetha K * MOSIP-37636: Added policyGroupDescription in partner details v2 endpoint Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-37636: renamed clientId and clientName (#996) * MOSIP-35326: Updated time in LocalDateTime Signed-off-by: Swetha K * MOSIP-37101: Added items per page in config Signed-off-by: Swetha K * MOSIP-37636: renamed clientId and clientName Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-37771 : API GET /partners/apikey/search/v2 (#997) * MOSIP-37771 : API GET /partners/apikey/search/v2 Signed-off-by: sudeep * MOSIP-37771 : API GET /partners/apikey/search/v2 Signed-off-by: sudeep * MOSIP-37771 : API GET /partners/apikey/search/v2 Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-37771 : API GET /partners/apikey/search/v2 (#998) Signed-off-by: sudeep * MOSIP-37771 : API GET /partners/apikey/search/v2 (#1000) Signed-off-by: sudeep * MOSIP-37326: Added user id and partner id validation in create, update and get oidc endpoints (#999) * MOSIP-35326: Updated time in LocalDateTime Signed-off-by: Swetha K * MOSIP-37101: Added items per page in config Signed-off-by: Swetha K * MOSIP-37326: Added user validation in create, update and get oidc endpoints Signed-off-by: Swetha K * MOSIP-37636: renamed clientId and clientName Signed-off-by: Swetha K * MOSIP-37326: Added user validation in create, update and get oidc endpoints Signed-off-by: Swetha K * MOSIP-37326: Added user validation in create, update and get oidc endpoints Signed-off-by: Swetha K * MOSIP-37326: Added user validation in create, update and get oidc endpoints Signed-off-by: Swetha K * MOSIP-37326: Added user validation in create, update and get oidc endpoints Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-37326: Added checks for partner deactivation in update oidc (#1001) Signed-off-by: Swetha K Co-authored-by: Swetha K * corrected PolicyGroupUpdateRequestDto (#1002) Signed-off-by: sudeep * MOSIP-37771 : removed apiKeyId field from dto (#1003) Signed-off-by: sudeep * MOSIP-36647 (#1005) Signed-off-by: Anup Nehe * MOSIP-37771 : Junit (#1004) Signed-off-by: sudeep * MOSIP-37875: Created v2 endpoint for ftpChipDetails (#1006) * MOSIP-37875: Created v2 endpoint for ftpChipDetails Signed-off-by: Swetha K * MOSIP-37875: Created v2 endpoint for ftpChipDetails Signed-off-by: Swetha K * MOSIP-37875: Created v2 endpoint for ftpChipDetails Signed-off-by: Swetha K * MOSIP-37875: Created v2 endpoint for ftpChipDetails Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-37601 : Deactivate FTM Chip details (#1007) * MOSIP-37601 : Deactivate FTM Chip details Signed-off-by: sudeep * MOSIP-37601 : Deactivate FTM Chip details Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-37875: Junit Tests (#1008) Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-37915 updated the db query (#1009) * MOSIP-36647 Signed-off-by: Anup Nehe * MOSIP-37915 Signed-off-by: Anup Nehe --------- Signed-off-by: Anup Nehe * MOSIP-37581 : added caSignedCertTimeOfUpload, caSignedCertExpiryDateTime fields (#1010) * MOSIP-37581 : added caSignedCertTimeOfUpload, caSignedCertExpiryDateTime fields Signed-off-by: sudeep * MOSIP-37581 : added caSignedCertTimeOfUpload, caSignedCertExpiryDateTime fields Signed-off-by: sudeep * MOSIP-37581 : added caSignedCertTimeOfUpload, caSignedCertExpiryDateTime fields Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-37581 : added CertExpiryDateTime, CertUploadDateTime fields for CA and MOSIP signed certs. (#1011) Signed-off-by: sudeep * MOSIP-37875 : handled sorting for status field (#1012) Signed-off-by: sudeep * MOSIP-37212 updated db query before and afte the suite (#1013) * MOSIP-36647 Signed-off-by: Anup Nehe * MOSIP-37915 Signed-off-by: Anup Nehe * MOSIP-34116 Signed-off-by: Anup Nehe --------- Signed-off-by: Anup Nehe * MOSIP-37875 : handled sorting for status field (#1014) Signed-off-by: sudeep * MOSIP-37854 : Deactivation of Policy Group is not allowed if there draft policies associated to it (#1015) Signed-off-by: sudeep * MOSIP-37854 : Deactivation of Policy Group is not allowed if there draft policies associated to it (#1017) Signed-off-by: sudeep * MOSIP-38077: created new search/v2 endpoint for SBI (#1016) * MOSIP-38077: created new search/v2 endpoint for SBI Signed-off-by: Swetha K * MOSIP-38077: created new search/v2 endpoint for SBI Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-38092 : Partner Admin: SBI - Device: API GET /devicedetail/search/v2 (#1018) * MOSIP-38092 : Partner Admin: SBI - Device: API GET /devicedetail/search/v2 Signed-off-by: sudeep * MOSIP-38092 : Partner Admin: SBI - Device: API GET /devicedetail/search/v2 Signed-off-by: sudeep * MOSIP-38092 : Partner Admin: SBI - Device: API GET /devicedetail/search/v2 Signed-off-by: sudeep * MOSIP-38092 : Partner Admin: SBI - Device: API GET /devicedetail/search/v2 Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-37854 : Deactivation of Policy Group is not allowed if there draft policies associated to it (#1019) Signed-off-by: sudeep * MOSIP-38077: Added sbiExpiryStatus in search v2 (#1020) Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-38077: Added sorting for countOfAssociatedDevices (#1021) * MOSIP-38077: Added sorting for countOfAssociatedDevices Signed-off-by: Swetha K * MOSIP-38077: Added sorting for countOfAssociatedDevices Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-37727, MOSIP-37728 : UI and Integration with API: Tabular View of Devices (#1022) Signed-off-by: sudeep * MOSIP-37748: Removed checks in deactivate SBI and device for PARTNER_ADMIN (#1024) Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-38077: Added countOfApprovedDevices and countOfPendingDevices fields (#1025) Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-38087 : Edit Authentication Policy/Data share policy is throwing a errror message -' Missing Input parameter (#1027) Signed-off-by: sudeep * MOSIP-38092 : Partner Admin: SBI - Device: API GET /devicedetail/search/v2 (#1026) Signed-off-by: sudeep * MOSIP-38077: removed partnerType field (#1028) Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-38077: Junit tests (#1029) Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-38092, MOSIP-37854 : added Junit (#1030) * MOSIP-38092, MOSIP-37854 : added Junit Signed-off-by: sudeep * MOSIP-38092, MOSIP-37854 : added Junit Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-37718: Updated the error message if the device doesn't have any SBI (#1031) Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-38092 : API GET /devicedetail/search/v2 (#1032) Signed-off-by: sudeep * MOSIP-38201: Added new getCaCertificates endpoint (#1033) * MOSIP-38201: Added new getCaCertificates endpoint Signed-off-by: Swetha K * MOSIP-38201: Added new getCaCertificates endpoint Signed-off-by: Swetha K * MOSIP-36642: getCaCertificates() moved to PartnerManagementController Signed-off-by: Swetha K * MOSIP-36642: getCaCertificates() moved to PartnerManagementController Signed-off-by: Swetha K * MOSIP-36642: getCaCertificates() moved to PartnerManagementController Signed-off-by: Swetha K * MOSIP-36642: Junit test Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-33206: Skip logged in user belongs to the partner check for PAR… (#1036) * MOSIP-33206: Skip logged in user belongs to the partner check for PARTNER_ADMIN Signed-off-by: Swetha K * MOSIP-33206: Fixed test case failures Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * Rename 1.3.0-DP.1_to_1.3.0_upgrade.sql to 1.3.0-dp.1_to_1.3.0_upgrade.sql Signed-off-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> * Rename 1.3.0-DP.1_to_1.3.0_rollback.sql to 1.3.0-dp.1_to_1.3.0_rollback.sql Signed-off-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> * updated README.md files (#1040) Signed-off-by: sudeep * MOSIP-36805 : Partners' details (Partner Admin) : First Name and Last Name of Partner to be displayed in View individual Partner detail (#1037) * MOSIP-36805 : Partners' details (Partner Admin) : First Name and Last Name of Partner to be displayed in View individual Partner detail Signed-off-by: sudeep * MOSIP-36805 : Partners' details (Partner Admin) : First Name and Last Name of Partner to be displayed in View individual Partner detail Signed-off-by: sudeep * MOSIP-36805 : Partners' details (Partner Admin) : First Name and Last Name of Partner to be displayed in View individual Partner detail Signed-off-by: sudeep * MOSIP-36805 : Partners' details (Partner Admin) : First Name and Last Name of Partner to be displayed in View individual Partner detail Signed-off-by: sudeep * MOSIP-36805 : Partners' details (Partner Admin) : First Name and Last Name of Partner to be displayed in View individual Partner detail Signed-off-by: sudeep * MOSIP-36805 : Partners' details (Partner Admin) : First Name and Last Name of Partner to be displayed in View individual Partner detail Signed-off-by: sudeep * MOSIP-36805 : Partners' details (Partner Admin) : First Name and Last Name of Partner to be displayed in View individual Partner detail Signed-off-by: sudeep * MOSIP-36805 : Partners' details (Partner Admin) : First Name and Last Name of Partner to be displayed in View individual Partner detail Signed-off-by: sudeep * MOSIP-36805 : Partners' details (Partner Admin) : First Name and Last Name of Partner to be displayed in View individual Partner detail Signed-off-by: sudeep * MOSIP-36805 : Partners' details (Partner Admin) : First Name and Last Name of Partner to be displayed in View individual Partner detail Signed-off-by: sudeep * MOSIP-36805 : Partners' details (Partner Admin) : First Name and Last Name of Partner to be displayed in View individual Partner detail Signed-off-by: sudeep * MOSIP-36805 : Partners' details (Partner Admin) : First Name and Last Name of Partner to be displayed in View individual Partner detail Signed-off-by: sudeep * MOSIP-36805 : Partners' details (Partner Admin) : First Name and Last Name of Partner to be displayed in View individual Partner detail Signed-off-by: sudeep * MOSIP-36805 : Partners' details (Partner Admin) : First Name and Last Name of Partner to be displayed in View individual Partner detail Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-37857 Partner Admin API automation (#1041) * MOSIP-37857 with correct branch merged * MOSIP-37857 Signed-off-by: Sohan Kumar Dey <72375959+Sohandey@users.noreply.github.com> * MOSIP-37857 Signed-off-by: Sohan Kumar Dey <72375959+Sohandey@users.noreply.github.com> * MOSIP-37857 Signed-off-by: Sohan Kumar Dey <72375959+Sohandey@users.noreply.github.com> * MOSIP-37857 Signed-off-by: Sohan Kumar Dey <72375959+Sohandey@users.noreply.github.com> * Delete et --soft d2d5be7e Signed-off-by: Sohan Kumar Dey <72375959+Sohandey@users.noreply.github.com> --------- Signed-off-by: Sohan Kumar Dey <72375959+Sohandey@users.noreply.github.com> * MOSIP-38211: Created new download-root-certificate endpoint (#1042) * MOSIP-38211: Created new download-root-certificate endpoint Signed-off-by: Swetha K * MOSIP-38211: Created new download-root-certificate endpoint Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-37889 updated invalid Token (#1034) * MOSIP-36647 Signed-off-by: Anup Nehe * MOSIP-37915 Signed-off-by: Anup Nehe * MOSIP-34116 Signed-off-by: Anup Nehe * MOSIP-37889 Signed-off-by: Anup Nehe --------- Signed-off-by: Anup Nehe * MOSIP-36422 - negative test case automation (#990) * MOSIP-36422 API PMP revamp negative test case automation Signed-off-by: gopalaswin * MOSIP-36422 - negative test case automation Signed-off-by: gopalaswin * MOSIP-36422 - negative test case automation Signed-off-by: gopalaswin * Update pmsApi.xml resolved conflicts Signed-off-by: gopalaswin <167510433+gopalaswin@users.noreply.github.com> --------- Signed-off-by: gopalaswin Signed-off-by: gopalaswin <167510433+gopalaswin@users.noreply.github.com> * MOSIP-38211: handled error cases for KM download certificate endpoint (#1043) * MOSIP-38211: handled code for KM error cases Signed-off-by: Swetha K * MOSIP-38211: handled code for KM error cases Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-37899: API Review Comments (#1045) * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP:37899 - API review comment changes (#1046) * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP:37899 - APi review comment changes (#1047) * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep --------- Signed-off-by: sudeep * [MOSIP-37899, MOSIP-35739]: created new API for add device to SBI (#1048) * MOSIP-37899: created new API for add device to SBI Signed-off-by: Swetha K * MOSIP-37899: created new API for add device to SBI Signed-off-by: Swetha K * MOSIP-37899: created new API for add device to SBI Signed-off-by: Swetha K * MOSIP-37899: created new API for add device to SBI Signed-off-by: Swetha K * MOSIP-37899: created new API for add device to SBI Signed-off-by: Swetha K * MOSIP-37899: created new API for add device to SBI Signed-off-by: Swetha K * MOSIP-37899: created new API for add device to SBI Signed-off-by: Swetha K * MOSIP-37899: created new API for add device to SBI Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-37899: Updated request dto for approve or reject device (#1049) Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP:37899 - APi review comment changes (#1051) * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep * MOSIP:37899 - APi review comment changes Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-37899: Added request body for deactivate PATCH endpoints (#1050) * MOSIP-37899: Added request body for deactivate PATCH endpoints Signed-off-by: Swetha K * MOSIP-37899: Added request body for deactivate PATCH endpoints Signed-off-by: Swetha K * MOSIP-37899: Added request body for deactivate PATCH endpoints Signed-off-by: Swetha K * MOSIP-37899: Added request body for deactivate PATCH endpoints Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-37899: Updated status as approved/rejected (#1052) * MOSIP-37899: Updated status as approved/rejected Signed-off-by: Swetha K * MOSIP-37899: Updated status as approved/rejected Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP:37899 - APi review comment changes (#1053) Signed-off-by: sudeep * [MOSIP-37899, MOSIP-38400, MOSIP-38393]: Bug fixes and Junit tests (#1055) * [MOSIP-37899, MOSIP-38400, MOSIP-38393]: Bug fixes and Junit tests Signed-off-by: Swetha K * [MOSIP-37899, MOSIP-38400, MOSIP-38393]: Bug fixes and Junit tests Signed-off-by: Swetha K * [MOSIP-37899, MOSIP-38400, MOSIP-38393]: Bug fixes and Junit tests Signed-off-by: Swetha K * [MOSIP-37899, MOSIP-38400, MOSIP-38393]: Bug fixes and Junit tests Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP:38478 - changed partnerTypeCode field to partnerType (#1056) Signed-off-by: sudeep * MOSIP:37899 - Junit for /v4 API (#1058) Signed-off-by: sudeep * MOSIP-36036: Sonar bug fixes (#1060) * MOSIP-36036: Sonar bug fixes Signed-off-by: Swetha K * MOSIP-36036: Sonar bug fixes Signed-off-by: Swetha K * MOSIP-36036: Sonar bug fixes Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-37547 incorporate new changes (#1059) * MOSIP-36647 Signed-off-by: Anup Nehe * MOSIP-37915 Signed-off-by: Anup Nehe * MOSIP-34116 Signed-off-by: Anup Nehe * MOSIP-37889 Signed-off-by: Anup Nehe * MOSIP-38558 Signed-off-by: Anup Nehe * reslove conflicts Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe --------- Signed-off-by: Anup Nehe * MOSIP-36037 : Sonar coverage (#1061) * MOSIP-36037 : Sonar coverage Signed-off-by: sudeep * MOSIP-36037 : Sonar coverage Signed-off-by: sudeep * MOSIP-36037 : Sonar coverage Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-36037 : Sonar coverage (#1064) Signed-off-by: sudeep * MOSIP-38409: Added partnerStatus field in partner-policy-request (#1067) * MOSIP-38409: Added partnerStatus field in partner-policy-request Signed-off-by: Swetha K * MOSIP-38409: Added partnerStatus field in partner-policy-request Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-35702 : Remove dependency with artifactory-ref-impl (#1066) * MOSIP-35702 : Remove dependency with artifactory-ref-impl Signed-off-by: sudeep * MOSIP-35702 : Remove dependency with artifactory-ref-impl Signed-off-by: sudeep * MOSIP-35702 : Remove dependency with artifactory-ref-impl Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-36037 : Sonar coverage (#1071) Signed-off-by: sudeep * MOSIP-37017: Added partnerStatus field in ftm list (#1070) Signed-off-by: Swetha K Co-authored-by: Swetha K * corrected upload ftm certificate. (#1072) Signed-off-by: sudeep * MOSIP-38031: Added filter for sbiId and ftmId (#1075) Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-35404 (#1076) Signed-off-by: Nandhukumar * MOSIP-38883 :Improve API documentation in swagger and deprecate endpoints (#1080) Signed-off-by: sudeep * MOSIP-38883 :Improve API documentation in swagger and deprecate endpoints (#1082) Signed-off-by: sudeep * MOSIP-38883 corrected swagger documentation (#1085) Signed-off-by: Mayura Deshmukh * MOSIP-38883 corrected swagger documentation (#1086) * MOSIP-38883 corrected swagger documentation Signed-off-by: Mayura Deshmukh * MOSIP-38883 corrected swagger documentation Signed-off-by: Mayura Deshmukh --------- Signed-off-by: Mayura Deshmukh Signed-off-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> * MOSIP-38450: Admin API review comments (#1087) * MOSIP-38450: Admin API review comments Signed-off-by: Swetha K * MOSIP-38450: Admin API review comments Signed-off-by: Swetha K * MOSIP-38450: Admin API review comments Signed-off-by: Swetha K * MOSIP-38450: Admin API review comments Signed-off-by: Swetha K * MOSIP-38450: Admin API review comments Signed-off-by: Swetha K * MOSIP-38450: Admin API review comments Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-38450: Removed SBI id belongs to the user for Partner Admin (#1088) Signed-off-by: Swetha K Co-authored-by: Swetha K * Revert "MOSIP-38450: Removed SBI id belongs to the user for Partner Admin (#1…" (#1089) This reverts commit 89384733b1a2dfbb9cf7cc7a31cfc25319947058. * MOSIP-38450: Renamed GET /devicedetail/v2 to /devicedetail (#1090) Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-38883: Updated API documentation (#1091) * MOSIP-38883: Updated API documentation Signed-off-by: Swetha K * MOSIP-38883: Updated API documentation Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-38449 - /partners/policy-requests - Admin API review comments (#1092) * MOSIP-38449 - Admin API review comments Signed-off-by: sudeep * MOSIP-38449 - Admin API review comments Signed-off-by: sudeep * MOSIP-38449 - Admin API review comments Signed-off-by: sudeep * MOSIP-38449 - /partners/policy-requests - Admin API review comments Signed-off-by: sudeep * MOSIP-38449 - /partners/policy-requests - Admin API review comments Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-38449 - /oauth/client - Admin API review comments (#1097) * MOSIP-38449 - /oauth/client - Admin API review comments Signed-off-by: sudeep * MOSIP-38449 - /oauth/client - Admin API review comments Signed-off-by: sudeep * MOSIP-38449 - /oauth/client - Admin API review comments Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-38449 - /partner-api-keys - Admin API review comments (#1099) * MOSIP-38449 - /partner-api-keys - Admin API review comments Signed-off-by: sudeep * MOSIP-38449 - /partner-api-keys - Admin API review comments Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-38437: negative scenarios (#1062) * mosip-38437-negative scenarios Signed-off-by: Likhitha R L * Mosip-38437 Signed-off-by: Likhitha R L * mosip-38437-negtive scenarios Signed-off-by: Likhitha R L * mosip-38437-negative scenarios Signed-off-by: Likhitha R L * mosip-38437-negative scenarios Signed-off-by: Likhitha R L --------- Signed-off-by: Likhitha R L Co-authored-by: Likhitha R L * MOSIP-38872 Added test cases and modified .hbs file for GetListOfApiKey endpoint (#1098) * MOSIP-38872 Added the test cases for getListOfApiKey apis Signed-off-by: Anuranjan14 <120705365+Anuranjan14@users.noreply.github.com> * MOSIP-38872 Added query param in GetListOfApiKey endpoint Signed-off-by: Anuranjan14 <120705365+Anuranjan14@users.noreply.github.com> * MOSIP-38872 Added two existing test cases to smoke Signed-off-by: Anuranjan14 <120705365+Anuranjan14@users.noreply.github.com> * MOSIP-38872 removed two scenarios from smoke Signed-off-by: Anuranjan14 <120705365+Anuranjan14@users.noreply.github.com> --------- Signed-off-by: Anuranjan14 <120705365+Anuranjan14@users.noreply.github.com> * MOSIP-38449 - /securebiometricinterface - Admin API review comments (#1100) * MOSIP-38449 - /securebiometricinterface - Admin API review comments Signed-off-by: sudeep * MOSIP-38449 - /securebiometricinterface - Admin API review comments Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-38953 Incorporate API changes for admin (#1093) * MOSIP-36647 Signed-off-by: Anup Nehe * MOSIP-37915 Signed-off-by: Anup Nehe * MOSIP-34116 Signed-off-by: Anup Nehe * MOSIP-37889 Signed-off-by: Anup Nehe * MOSIP-38558 Signed-off-by: Anup Nehe * reslove conflicts Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * MOSIP-38953 Signed-off-by: Anup Nehe --------- Signed-off-by: Anup Nehe Signed-off-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> Co-authored-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> * MOSIP-38449 - /ftpchipdetail/v2 - Admin API review comments (#1101) * MOSIP-38449 - /ftpchipdetail/v2 - Admin API review comments Signed-off-by: sudeep * MOSIP-38449 - /ftpchipdetail/v2 - Admin API review comments Signed-off-by: sudeep --------- Signed-off-by: sudeep * MOSIP-38489 - Generated single report with 2 sections (#1102) * MOSIP-35404 Signed-off-by: Nandhukumar * MOSIP-38489 - Generated single report with 2 sections Signed-off-by: Nandhukumar * MOSIP-38489 Signed-off-by: Nandhukumar * MOSIP-38489 Signed-off-by: Nandhukumar --------- Signed-off-by: Nandhukumar * DSD-7063 Updated upload artifact version push-trigger.yml Signed-off-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> * MOSIP-35546 : Test the upgrade scripts via upgrade.sh in 'develop-pmp-revamp' branch. (#1104) Signed-off-by: sudeep * MOSIP-35546 : Test the upgrade scripts via upgrade.sh in 'develop-pmp-revamp' branch. (#1107) Signed-off-by: sudeep * Update bootstrap.properties Signed-off-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> * Update bootstrap.properties Signed-off-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> * removed auth adapter property from bootstrap.properties file (#1108) Signed-off-by: sudeep * MOSIP-35736: Removed adding duplicate device (#1109) Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-39018: Bug fix (#1110) Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-39055 Incorporate all the API review comments changes into Automation (#1111) * MOSIP-36647 Signed-off-by: Anup Nehe * MOSIP-37915 Signed-off-by: Anup Nehe * MOSIP-34116 Signed-off-by: Anup Nehe * MOSIP-37889 Signed-off-by: Anup Nehe * MOSIP-38558 Signed-off-by: Anup Nehe * reslove conflicts Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * MOSIP-38953 Signed-off-by: Anup Nehe * MOSIP-39055 Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe --------- Signed-off-by: Anup Nehe Signed-off-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> Co-authored-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> * MOSIP-38973: Fixed the issue in Approve/Reject SBI (#1112) * MOSIP-38973: Fixed the issue in Approve/Reject SBI Signed-off-by: Swetha K * MOSIP-38973: Fixed the issue in Approve/Reject SBI Signed-off-by: Swetha K * MOSIP-38973: Updated CA signed partner cert upload and expiry date time Signed-off-by: Swetha K --------- Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-34977: Updated cert upload and expiry date time (#1113) Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-39055 fix automation issues (#1114) * MOSIP-36647 Signed-off-by: Anup Nehe * MOSIP-37915 Signed-off-by: Anup Nehe * MOSIP-34116 Signed-off-by: Anup Nehe * MOSIP-37889 Signed-off-by: Anup Nehe * MOSIP-38558 Signed-off-by: Anup Nehe * reslove conflicts Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * MOSIP-38953 Signed-off-by: Anup Nehe * MOSIP-39055 Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * resolve conflicts Signed-off-by: Anup Nehe * MOSIP-39055 Signed-off-by: Anup Nehe * MOSIP-39055 Signed-off-by: Anup Nehe --------- Signed-off-by: Anup Nehe Signed-off-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> Co-authored-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> * MOSIP-39071 - Rename the api endpoints and fix the automation failures (#1115) * MOSIP-36679 - Added db delete queries Signed-off-by: Mohanachandran S * MOSIP-36679 - Added db delete queries Signed-off-by: Mohanachandran S * MOSIP-39071 - Rename the api endpoints and fix the automation failures Signed-off-by: Mohanachandran S --------- Signed-off-by: Mohanachandran S * MOSIP-39071 - Fixed the automation failures (#1116) * MOSIP-36679 - Added db delete queries Signed-off-by: Mohanachandran S * MOSIP-36679 - Added db delete queries Signed-off-by: Mohanachandran S * MOSIP-39071 - Rename the api endpoints and fix the automation failures Signed-off-by: Mohanachandran S * MOSIP-39071 - Fixed the automation failures Signed-off-by: Mohanachandran S --------- Signed-off-by: Mohanachandran S * Revert "MOSIP-39071 - Fixed the automation failures (#1116)" (#1117) This reverts commit 060e8c622b3e077ae856d5f597e8f77c730a7546. * MOSIP-39054 : Merge code from develop-pmp-revamp to release-1.3.x for 1.3.0-beta1 Signed-off-by: sudeep * MOSIP-38947: Added separate error codes based on the SBI status (#1119) Signed-off-by: Swetha K Co-authored-by: Swetha K * MOSIP-39054 : Merge code from develop-pmp-revamp to release-1.3.x for 1.3.0-beta1 Signed-off-by: sudeep * MOSIP-39054 : Merge code from develop-pmp-revamp to release-1.3.x for 1.3.0-beta1 Signed-off-by: sudeep --------- Signed-off-by: sudeep Signed-off-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> Signed-off-by: Mayura Deshmukh Signed-off-by: Sudeep7353 <103890430+Sudeep7353@users.noreply.github.com> Signed-off-by: ckesiraju Signed-off-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> Signed-off-by: Mohanachandran S <165888272+mohanachandran-s@users.noreply.github.com> Signed-off-by: Anup Nehe Signed-off-by: Likhitha R L Signed-off-by: Jayesh Kharode Signed-off-by: Mohanachandran S Signed-off-by: Nandhukumar Signed-off-by: Prathmesh Jadhav Signed-off-by: prathmeshj12 <166711249+prathmeshj12@users.noreply.github.com> Signed-off-by: Swetha K Signed-off-by: Sohan Kumar Dey <72375959+Sohandey@users.noreply.github.com> Signed-off-by: gopalaswin Signed-off-by: gopalaswin <167510433+gopalaswin@users.noreply.github.com> Signed-off-by: Anuranjan14 <120705365+Anuranjan14@users.noreply.github.com> Co-authored-by: SwethaKrish4 <110164892+SwethaKrish4@users.noreply.github.com> Co-authored-by: Mayura Deshmukh <52281514+mayuradesh@users.noreply.github.com> Co-authored-by: ckesiraju <94882008+ckesiraju@users.noreply.github.com> Co-authored-by: Mohanachandran S <165888272+mohanachandran-s@users.noreply.github.com> Co-authored-by: anup-nehe <117707464+anup-nehe@users.noreply.github.com> Co-authored-by: likhitharl <91238496+likhitharl@users.noreply.github.com> Co-authored-by: Likhitha R L Co-authored-by: jayesh12234 <111957576+jayesh12234@users.noreply.github.com> Co-authored-by: Jayesh Kharode Co-authored-by: Nandhukumar Co-authored-by: Chandra Keshav Mishra Co-authored-by: prathmeshj12 <166711249+prathmeshj12@users.noreply.github.com> Co-authored-by: Swetha K Co-authored-by: Sohan Kumar Dey <72375959+Sohandey@users.noreply.github.com> Co-authored-by: gopalaswin <167510433+gopalaswin@users.noreply.github.com> Co-authored-by: Nandhukumar <100744358+nandhu-kumar@users.noreply.github.com> Co-authored-by: Anuranjan14 <120705365+Anuranjan14@users.noreply.github.com> Co-authored-by: anup-nehe --- README.md | 39 +- .../mosip_pms/ddl/pms-device_detail.sql | 3 +- db_scripts/mosip_pms/ddl/pms-fk.sql | 12 +- .../mosip_pms/ddl/pms-ftp_chip_detail.sql | 3 +- ...deploy.sh => pms_old_release_db_deploy.sh} | 0 ...ties => pms_old_release_deploy.properties} | 0 ..._deploy.sh => pms_old_revoke_db_deploy.sh} | 0 .../sql/1.2.0.1_to_1.2.1.0_rollback.sql | 1 + .../sql/1.2.0.1_to_1.2.1.0_upgrade.sql | 1 + .../sql/1.2.1.0_to_1.3.0-dp.1_rollback.sql | 1 + .../sql/1.2.1.0_to_1.3.0-dp.1_upgrade.sql | 1 + .../sql/1.3.0-dp.1_to_1.3.0_rollback.sql | 26 + .../sql/1.3.0-dp.1_to_1.3.0_upgrade.sql | 25 + .../mosip_pms/upgrade.properties | 12 + db_upgrade_scripts/mosip_pms/upgrade.sh | 65 ++ partner/partner-management-service/Dockerfile | 10 +- partner/partner-management-service/README.md | 66 +- partner/partner-management-service/pom.xml | 18 +- .../authdevice/entity/DeviceDetailEntity.java | 81 ++ .../entity/FtmDetailSummaryEntity.java | 70 ++ .../authdevice/entity/SbiSummaryEntity.java | 86 ++ .../repository/DeviceDetailRepository.java | 11 +- .../DeviceDetailSummaryRepository.java | 87 ++ .../repository/FTPChipDetailRepository.java | 9 +- .../FtmDetailsSummaryRepository.java | 69 ++ .../repository/SbiSummaryRepository.java | 140 +++ .../SecureBiometricInterfaceRepository.java | 3 + .../service/DeviceDetailService.java | 13 + .../service/FtpChipDetailService.java | 20 +- .../SecureBiometricInterfaceService.java | 20 + .../service/impl/DeviceDetailServiceImpl.java | 310 +++++- .../impl/FTPChipDetailServiceImpl.java | 414 +++++++- .../SecureBiometricInterfaceServiceImpl.java | 624 ++++++++++- .../pms/device/constant/DeviceConstant.java | 2 + .../DeviceDetailExceptionsConstant.java | 2 +- ...oundationalTrustProviderErrorMessages.java | 8 +- .../SecureBiometricInterfaceConstant.java | 10 +- .../controller/DeviceDetailController.java | 201 +++- .../controller/FTPChipDetailController.java | 155 ++- .../SecureBiometricInterfaceController.java | 196 +++- .../pms/device/dto/DeviceDetailFilterDto.java | 18 + .../device/dto/DeviceDetailSummaryDto.java | 44 + .../pms/device/dto/FtmChipDetailsDto.java | 47 + .../pms/device/dto/FtmChipFilterDto.java | 13 + .../mosip/pms/device/dto/SbiDetailsDto.java | 47 + .../io/mosip/pms/device/dto/SbiFilterDto.java | 14 + .../dto/DeactivateDeviceRequestDto.java | 11 + .../request/dto/DeactivateFtmRequestDto.java | 11 + .../request/dto/DeactivateSbiRequestDto.java | 11 + .../response/dto/DeviceDetailResponseDto.java | 18 + .../response/dto/FtmDetailResponseDto.java | 19 + .../response/dto/FtmDetailSummaryDto.java | 38 + .../response/dto/SbiDetailsResponseDto.java | 22 + .../device/response/dto/SbiSummaryDto.java | 49 + .../ClientManagementController.java | 69 +- .../pms/oauth/client/dto/ClientFilterDto.java | 13 + .../oauth/client/dto/ClientSummaryDto.java | 46 + .../pms/oauth/client/dto/OidcClientDto.java | 29 - .../service/ClientManagementService.java | 4 +- .../impl/ClientManagementServiceImpl.java | 367 +++++-- .../contant/ClientServiceAuditEnum.java | 3 + .../mosip/pms/partner/constant/ErrorCode.java | 71 +- .../partner/constant/PartnerConstants.java | 8 + .../MultiPartnerServiceController.java | 206 ---- .../controller/PartnerServiceController.java | 163 +-- .../pms/partner/dto/ActivePolicyDto.java | 15 - .../pms/partner/dto/ApiKeyResponseDto.java | 27 +- .../pms/partner/dto/ApprovedPolicyDto.java | 19 - .../pms/partner/dto/AuthorizedRolesDto.java | 46 +- .../mosip/pms/partner/dto/CertificateDto.java | 23 +- .../io/mosip/pms/partner/dto/DeviceDto.java | 44 + .../pms/partner/dto/DeviceProviderDto.java | 14 + .../mosip/pms/partner/dto/FtmProviderDto.java | 11 + .../pms/partner/dto/KeycloakUserDto.java | 16 + .../mosip/pms/partner/dto/PartnerDtoV3.java | 26 + .../io/mosip/pms/partner/dto/PolicyDto.java | 25 - .../mosip/pms/partner/dto/PolicyGroupDto.java | 16 - .../mosip/pms/partner/dto/UserDetailsDto.java | 6 +- .../partner/manager/constant/ErrorCode.java | 8 +- .../PartnerManagementController.java | 339 +++++- .../partner/manager/dto/ApiKeyFilterDto.java | 22 + .../manager/dto/ApiKeyRequestSummaryDto.java | 44 + .../manager/dto/PartnerDetailsV3Dto.java | 60 ++ .../partner/manager/dto/PartnerFilterDto.java | 14 + .../dto/PartnerPolicyRequestFilterDto.java | 15 + .../dto/PartnerPolicyRequestSummaryDto.java | 56 + .../manager/dto/PartnerSummaryDto.java | 41 + .../dto/TrustCertTypeListRequestDto.java | 94 ++ .../dto/TrustCertTypeListResponseDto.java | 21 + .../dto/TrustCertificateFilterDto.java | 13 + .../dto/TrustCertificateResponseDto.java | 23 + .../dto/TrustCertificateSummaryDto.java | 40 + .../service/PartnerManagerService.java | 23 +- .../impl/PartnerManagementServiceImpl.java | 523 ++++++++- .../dto/SbiAndDeviceMappingRequestDto.java | 16 + .../FtmCertificateDownloadResponseDto.java | 42 + .../dto/OriginalCertDownloadResponseDto.java | 17 +- .../partner/service/MultiPartnerService.java | 27 - .../pms/partner/service/PartnerService.java | 10 +- .../service/impl/MultiPartnerServiceImpl.java | 522 --------- .../service/impl/PartnerServiceImpl.java | 325 ++++-- .../pms/partner/util/MultiPartnerUtil.java | 15 +- .../mosip/pms/partner/util/PartnerHelper.java | 483 +++++++++ .../mosip/pms/partner/util/PartnerUtil.java | 19 + .../pms/user/controller/UserController.java | 93 +- .../user/service/UserManagementService.java | 6 + .../impl/UserManagementServiceImpl.java | 149 ++- .../main/resources/application-dev.properties | 4 +- .../src/main/resources/bootstrap.properties | 80 +- .../DeviceDetailControllerTest.java | 169 ++- .../FTPChipDetailControllerTest.java | 84 +- ...ecureBiometricInterfaceControllerTest.java | 91 ++ .../service/impl/DeviceDetailServiceTest.java | 390 ++++++- .../impl/FTPChipDetailServiceTest.java | 814 +++++++++++++- .../device/service/impl/SBIServiceTest.java | 995 ++++++++++++++++-- .../ClientManagementControllerTest.java | 161 +-- .../impl/ClientManagementServiceImplTest.java | 260 ++++- .../MultiPartnerServiceControllerTest.java | 126 --- .../PartnerManagementControllerTest.java | 243 ++++- .../PartnerServiceControllerTest.java | 231 +++- .../controller/UserControllerTest.java | 35 +- .../impl/MultiPartnerServiceImplTest.java | 758 ------------- .../PartnerManagementServiceImplTest.java | 523 ++++++++- .../service/impl/PartnerServiceImplTest.java | 201 +++- .../impl/UserManagementServiceImplTest.java | 162 ++- .../src/test/resources/application.properties | 78 +- partner/pms-common/pom.xml | 4 +- .../pms/common/constant/CommonConstant.java | 4 + .../common/constant/ValidationErrorCode.java | 8 +- .../pms/common/dto/PageResponseV2Dto.java | 21 + .../mosip/pms/common/dto/PolicyCountDto.java | 15 + .../entity/ApiKeyRequestsSummaryEntity.java | 85 ++ .../pms/common/entity/ClientDetailV2.java | 72 ++ .../common/entity/ClientSummaryEntity.java | 84 ++ .../PartnerPolicyRequestSummaryEntity.java | 96 ++ .../common/entity/PartnerPolicyRequestV2.java | 56 + .../pms/common/entity/PartnerPolicyV2.java | 57 + .../common/entity/PartnerSummaryEntity.java | 76 ++ .../io/mosip/pms/common/entity/PartnerV3.java | 77 ++ .../common/entity/PolicySummaryEntity.java | 60 ++ .../ApiKeyRequestSummaryRepository.java | 50 + .../repository/AuthPolicyRepository.java | 10 +- .../repository/ClientSummaryRepository.java | 42 + .../repository/DeviceDetailSbiRepository.java | 11 + ...PartnerPolicyMappingRequestRepository.java | 53 + .../PartnerPolicyRequestRepository.java | 3 + .../repository/PartnerServiceRepository.java | 14 + .../repository/PartnerSummaryRepository.java | 41 + .../repository/PolicySummaryRepository.java | 67 ++ .../common/request/dto/RequestWrapperV2.java | 24 + .../response/dto/ResponseWrapperV2.java | 29 + .../pms/common/util/RequestValidator.java | 97 ++ .../io/mosip/pms/common/util/RestUtil.java | 31 + partner/policy-management-service/Dockerfile | 10 +- partner/policy-management-service/README.md | 66 +- partner/policy-management-service/pom.xml | 13 +- .../PolicyManagementController.java | 138 ++- .../pms/policy/dto/AuthorizedRolesDto.java | 10 +- .../dto/DeactivatePolicyGroupResponseDto.java | 14 + .../dto/DeactivatePolicyResponseDto.java | 14 + .../pms/policy/dto/DeactivateRequestDto.java | 11 + .../policy/dto/PolicyCreateRequestDto.java | 2 +- .../mosip/pms/policy/dto/PolicyFilterDto.java | 20 + .../dto/PolicyGroupCreateRequestDto.java | 2 +- .../mosip/pms/policy/dto/PolicyGroupDto.java | 10 + .../dto/PolicyGroupUpdateRequestDto.java | 2 +- .../pms/policy/dto/PolicySummaryDto.java | 31 + .../policy/dto/PolicyUpdateRequestDto.java | 2 +- .../policy/errorMessages/ErrorMessages.java | 21 +- .../service/PolicyManagementService.java | 281 ++++- .../io/mosip/pms/policy/util/PolicyUtil.java | 78 ++ .../main/resources/application-dev.properties | 4 +- .../src/main/resources/bootstrap.properties | 21 +- .../PolicyManagementControllerTest.java | 67 +- .../test/service/PolicyServiceTest.java | 310 +++++- .../src/test/resources/application.properties | 5 +- partner/policy-validator/pom.xml | 4 +- .../PolicyValidatorErrorConstant.java | 8 +- .../validator/impl/PolicySchemaValidator.java | 14 +- partner/pom.xml | 6 +- 180 files changed, 12452 insertions(+), 2807 deletions(-) rename db_upgrade_scripts/mosip_pms/{pms_release_db_deploy.sh => pms_old_release_db_deploy.sh} (100%) rename db_upgrade_scripts/mosip_pms/{pms_release_deploy.properties => pms_old_release_deploy.properties} (100%) rename db_upgrade_scripts/mosip_pms/{pms_revoke_db_deploy.sh => pms_old_revoke_db_deploy.sh} (100%) create mode 100644 db_upgrade_scripts/mosip_pms/upgrade.properties create mode 100644 db_upgrade_scripts/mosip_pms/upgrade.sh create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/entity/DeviceDetailEntity.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/entity/FtmDetailSummaryEntity.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/entity/SbiSummaryEntity.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/DeviceDetailSummaryRepository.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/FtmDetailsSummaryRepository.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/SbiSummaryRepository.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/DeviceDetailFilterDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/DeviceDetailSummaryDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/FtmChipDetailsDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/FtmChipFilterDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/SbiDetailsDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/SbiFilterDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/request/dto/DeactivateDeviceRequestDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/request/dto/DeactivateFtmRequestDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/request/dto/DeactivateSbiRequestDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/DeviceDetailResponseDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/FtmDetailResponseDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/FtmDetailSummaryDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/SbiDetailsResponseDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/SbiSummaryDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/dto/ClientFilterDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/dto/ClientSummaryDto.java delete mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/dto/OidcClientDto.java delete mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/controller/MultiPartnerServiceController.java delete mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/ActivePolicyDto.java delete mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/ApprovedPolicyDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/DeviceDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/DeviceProviderDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/FtmProviderDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/KeycloakUserDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/PartnerDtoV3.java delete mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/PolicyDto.java delete mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/PolicyGroupDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/ApiKeyFilterDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/ApiKeyRequestSummaryDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerDetailsV3Dto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerFilterDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerPolicyRequestFilterDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerPolicyRequestSummaryDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerSummaryDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertTypeListRequestDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertTypeListResponseDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertificateFilterDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertificateResponseDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertificateSummaryDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/request/dto/SbiAndDeviceMappingRequestDto.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/response/dto/FtmCertificateDownloadResponseDto.java delete mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/service/MultiPartnerService.java delete mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/service/impl/MultiPartnerServiceImpl.java create mode 100644 partner/partner-management-service/src/main/java/io/mosip/pms/partner/util/PartnerHelper.java delete mode 100644 partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/controller/MultiPartnerServiceControllerTest.java delete mode 100644 partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/service/impl/MultiPartnerServiceImplTest.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/dto/PageResponseV2Dto.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/dto/PolicyCountDto.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/entity/ApiKeyRequestsSummaryEntity.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/entity/ClientDetailV2.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/entity/ClientSummaryEntity.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerPolicyRequestSummaryEntity.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerPolicyRequestV2.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerPolicyV2.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerSummaryEntity.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerV3.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/entity/PolicySummaryEntity.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/repository/ApiKeyRequestSummaryRepository.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/repository/ClientSummaryRepository.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/repository/PartnerPolicyMappingRequestRepository.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/repository/PartnerSummaryRepository.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/repository/PolicySummaryRepository.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/request/dto/RequestWrapperV2.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/response/dto/ResponseWrapperV2.java create mode 100644 partner/pms-common/src/main/java/io/mosip/pms/common/util/RequestValidator.java create mode 100644 partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/DeactivatePolicyGroupResponseDto.java create mode 100644 partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/DeactivatePolicyResponseDto.java create mode 100644 partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/DeactivateRequestDto.java create mode 100644 partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyFilterDto.java create mode 100644 partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyGroupDto.java create mode 100644 partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicySummaryDto.java diff --git a/README.md b/README.md index 40eb5e184e..be92774a8d 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,9 @@ [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?branch=release-1.3.x&project=mosip_partner-management-services&metric=alert_status)](https://sonarcloud.io/dashboard?branch=release-1.3.x&id=mosip_partner-management-services) ## Overview -This repository contains the source code MOSIP Partner Management module. For an overview refer [here](https://docs.mosip.io/1.2.0/modules/partner-management-services). The module exposes API endpoints. For a reference front-end UI implementation refer to PMS Revamp UI [Partner-management UI github repo](https://github.com/mosip/partner-management-portal/tree/release-1.3.x/pmp-reactjs-ui) +This repository contains the source code MOSIP Partner Management module. For an overview refer [here](https://docs.mosip.io/1.2.0/modules/partner-management-services). The module exposes API endpoints. For a reference front-end UI implementation refer to [Partner-management UI GitHub repo](https://github.com/mosip/partner-management-portal) -Partnermanagement module contains following services: +Partner management module contains following services: 1. Partner management service 2. Policy management service @@ -16,20 +16,40 @@ Refer to [SQL scripts](db_scripts). The project requires JDK 1.11. 1. Build and install: ``` - $ cd kernel + $ cd partner $ mvn install -DskipTests=true -Dmaven.javadoc.skip=true -Dgpg.skip=true ``` + 1. Build Docker for a service: ``` $ cd $ docker build -f Dockerfile ``` +## Deploy +To deploy PMS on Kubernetes cluster using Dockers refer to [Sandbox Deployment](https://docs.mosip.io/1.2.0/deployment/sandbox-deployment). + +### Configuration +[partner-management-default.properties](https://github.com/mosip/mosip-config/blob/master/partner-management-default.properties) + +[application-default.properties](https://github.com/mosip/mosip-config/blob/master/application-default.properties) + +defined here. + +### Add auth-adapter in a class-path to run a services + ``` + + io.mosip.kernel + kernel-auth-adapter + ${kernel.auth.adapter.version} + + ``` + ## Deployment in K8 cluster with other MOSIP services: ### Pre-requisites * Set KUBECONFIG variable to point to existing K8 cluster kubeconfig file: - * ``` - export KUBECONFIG=~/.kube/ + ``` + export KUBECONFIG=~/.kube/ ``` ### Install ``` @@ -47,15 +67,8 @@ The project requires JDK 1.11. $ ./restart.sh ``` -## Config -Add below property to ```partner-management-default.properties``` file in mosip-config repository to Deploy PMS Revamp 1.3.0-DP.1 release in your env. -``` -## This property is used by kernel-authcodeflowproxy-api to check request is coming from allowed urls not. -auth.allowed.urls=https://${mosip.pmp.host}/,https://${mosip.pmp.reactjs.ui.host}/ -``` - ## Test -Automated functional tests available in [Functional Tests repo](https://github.com/mosip/mosip-functional-tests). +Automated functional tests available in [Functional Tests](api-test). ## APIs API documentation is available [here](https://mosip.github.io/documentation/). diff --git a/db_scripts/mosip_pms/ddl/pms-device_detail.sql b/db_scripts/mosip_pms/ddl/pms-device_detail.sql index 61b3ddacb2..e691b08c6d 100644 --- a/db_scripts/mosip_pms/ddl/pms-device_detail.sql +++ b/db_scripts/mosip_pms/ddl/pms-device_detail.sql @@ -28,8 +28,7 @@ CREATE TABLE pms.device_detail( upd_dtimes timestamp, is_deleted boolean DEFAULT FALSE, del_dtimes timestamp, - CONSTRAINT pk_devdtl_id PRIMARY KEY (id), - CONSTRAINT uk_devdtl_id UNIQUE (dprovider_id,dtype_code,dstype_code,make,model) + CONSTRAINT pk_devdtl_id PRIMARY KEY (id) ); -- ddl-end -- diff --git a/db_scripts/mosip_pms/ddl/pms-fk.sql b/db_scripts/mosip_pms/ddl/pms-fk.sql index 0c0785e530..ec0f8150c5 100644 --- a/db_scripts/mosip_pms/ddl/pms-fk.sql +++ b/db_scripts/mosip_pms/ddl/pms-fk.sql @@ -44,4 +44,14 @@ ON DELETE NO ACTION ON UPDATE NO ACTION; ALTER TABLE pms.reg_device_sub_type ADD CONSTRAINT fk_rdstyp_dtype_code FOREIGN KEY (dtyp_code) REFERENCES pms.reg_device_type (code) MATCH FULL -ON DELETE NO ACTION ON UPDATE NO ACTION; \ No newline at end of file +ON DELETE NO ACTION ON UPDATE NO ACTION; + +-- Creating unique index for make, model, and approval status +CREATE UNIQUE INDEX uk_devdtl_make_model_approval_status +ON pms.device_detail (dprovider_id,dtype_code,dstype_code,make,model) +WHERE approval_status != 'rejected' AND NOT (approval_status = 'approved' AND is_active = false); + +-- Creating unique index for make, model, and approval status +CREATE UNIQUE INDEX uk_fcdtl_make_model_approval_status +ON pms.ftp_chip_detail (foundational_trust_provider_id, make, model) +WHERE approval_status != 'rejected' AND NOT (approval_status = 'approved' AND is_active = false); \ No newline at end of file diff --git a/db_scripts/mosip_pms/ddl/pms-ftp_chip_detail.sql b/db_scripts/mosip_pms/ddl/pms-ftp_chip_detail.sql index 04ed5b105f..552f5fa35c 100644 --- a/db_scripts/mosip_pms/ddl/pms-ftp_chip_detail.sql +++ b/db_scripts/mosip_pms/ddl/pms-ftp_chip_detail.sql @@ -27,8 +27,7 @@ CREATE TABLE pms.ftp_chip_detail( is_deleted boolean DEFAULT FALSE, del_dtimes timestamp, approval_status character varying(36) NOT NULL, - CONSTRAINT pk_fcdtl_id PRIMARY KEY (id), - CONSTRAINT uk_fcdtl_id UNIQUE (foundational_trust_provider_id,make,model) + CONSTRAINT pk_fcdtl_id PRIMARY KEY (id) ); -- ddl-end -- diff --git a/db_upgrade_scripts/mosip_pms/pms_release_db_deploy.sh b/db_upgrade_scripts/mosip_pms/pms_old_release_db_deploy.sh similarity index 100% rename from db_upgrade_scripts/mosip_pms/pms_release_db_deploy.sh rename to db_upgrade_scripts/mosip_pms/pms_old_release_db_deploy.sh diff --git a/db_upgrade_scripts/mosip_pms/pms_release_deploy.properties b/db_upgrade_scripts/mosip_pms/pms_old_release_deploy.properties similarity index 100% rename from db_upgrade_scripts/mosip_pms/pms_release_deploy.properties rename to db_upgrade_scripts/mosip_pms/pms_old_release_deploy.properties diff --git a/db_upgrade_scripts/mosip_pms/pms_revoke_db_deploy.sh b/db_upgrade_scripts/mosip_pms/pms_old_revoke_db_deploy.sh similarity index 100% rename from db_upgrade_scripts/mosip_pms/pms_revoke_db_deploy.sh rename to db_upgrade_scripts/mosip_pms/pms_old_revoke_db_deploy.sh diff --git a/db_upgrade_scripts/mosip_pms/sql/1.2.0.1_to_1.2.1.0_rollback.sql b/db_upgrade_scripts/mosip_pms/sql/1.2.0.1_to_1.2.1.0_rollback.sql index 099fc88413..7150b79571 100644 --- a/db_upgrade_scripts/mosip_pms/sql/1.2.0.1_to_1.2.1.0_rollback.sql +++ b/db_upgrade_scripts/mosip_pms/sql/1.2.0.1_to_1.2.1.0_rollback.sql @@ -1,3 +1,4 @@ +\c mosip_pms UPDATE pms.auth_policy SET policy_file_id='{"dataSharePolicies":{"typeOfShare":"direct","validForInMinutes":"30","transactionsAllowed":"2","encryptionType":"Partner Based","shareDomain":"datashare.datashare","source":"ID Repository"},"shareableAttributes":[{"attributeName":"fullName","source":[{"attribute":"fullName"}],"encrypted":true},{"attributeName":"dateOfBirth","source":[{"attribute":"dateOfBirth"}],"encrypted":false,"format":"YYYY"},{"attributeName":"gender","source":[{"attribute":"gender"}],"encrypted":false},{"attributeName":"phone","source":[{"attribute":"phone"}],"encrypted":false},{"attributeName":"email","source":[{"attribute":"email"}],"encrypted":false},{"attributeName":"addressLine1","source":[{"attribute":"addressLine1"}],"encrypted":false},{"attributeName":"addressLine2","source":[{"attribute":"addressLine2"}],"encrypted":false},{"attributeName":"addressLine3","source":[{"attribute":"addressLine3"}],"encrypted":false},{"attributeName":"region","source":[{"attribute":"region"}],"encrypted":false},{"attributeName":"province","source":[{"attribute":"province"}],"encrypted":false},{"attributeName":"city","source":[{"attribute":"city"}],"encrypted":false},{"attributeName":"UIN","source":[{"attribute":"UIN"}],"encrypted":false},{"attributeName":"PCN","source":[{"attribute":"VID","filter":[{"type":"PERPETUAL"}]}],"encrypted":false,"format":"RETRIEVE"},{"attributeName":"postalCode","source":[{"attribute":"postalCode"}],"encrypted":false},{"attributeName":"bestTwoFingers","group":"CBEFF","source":[{"attribute":"individualBiometrics","filter":[{"type":"Finger"}]}],"encrypted":false,"format":"bestTwoFingers"},{"attributeName":"Signature","source":[{"attribute":"proofOfAddress"}],"encrypted":false},{"attributeName":"biometrics","group":"CBEFF","source":[{"attribute":"individualBiometrics","filter":[{"type":"Face"},{"type":"Finger","subType":["Left Thumb","Right Thumb"]}]}],"encrypted":false,"format":"extraction"}]}' WHERE id='mpolicy-default-PDFCard'; \ No newline at end of file diff --git a/db_upgrade_scripts/mosip_pms/sql/1.2.0.1_to_1.2.1.0_upgrade.sql b/db_upgrade_scripts/mosip_pms/sql/1.2.0.1_to_1.2.1.0_upgrade.sql index 067818a8e9..6a85f7776f 100644 --- a/db_upgrade_scripts/mosip_pms/sql/1.2.0.1_to_1.2.1.0_upgrade.sql +++ b/db_upgrade_scripts/mosip_pms/sql/1.2.0.1_to_1.2.1.0_upgrade.sql @@ -1,3 +1,4 @@ +\c mosip_pms UPDATE pms.auth_policy SET policy_file_id='{"dataSharePolicies":{"typeOfShare":"Data Share","validForInMinutes":"30","transactionsAllowed":"2","encryptionType":"Partner Based","shareDomain":"datashare.datashare","source":"ID Repository"},"shareableAttributes":[{"attributeName":"fullName","source":[{"attribute":"fullName","filter":[{"language":"eng"}]}],"encrypted":false},{"attributeName":"dateOfBirth","source":[{"attribute":"dateOfBirth"}],"encrypted":false},{"attributeName":"dob","source":[{"attribute":"dateOfBirth"}],"encrypted":false},{"attributeName":"gender","source":[{"attribute":"gender","filter":[{"language":"eng"}]}],"encrypted":false},{"attributeName":"phone","source":[{"attribute":"phone"}],"encrypted":false},{"attributeName":"email","source":[{"attribute":"email"}],"encrypted":false},{"attributeName":"addressLine1","source":[{"attribute":"addressLine1","filter":[{"language":"eng"}]}],"encrypted":false},{"attributeName":"addressLine2","source":[{"attribute":"addressLine2","filter":[{"language":"eng"}]}],"encrypted":false},{"attributeName":"addressLine3","source":[{"attribute":"addressLine3","filter":[{"language":"eng"}]}],"encrypted":false},{"attributeName":"region","source":[{"attribute":"region","filter":[{"language":"eng"}]}],"encrypted":false},{"attributeName":"province","source":[{"attribute":"province","filter":[{"language":"eng"}]}],"encrypted":false},{"attributeName":"city","source":[{"attribute":"city","filter":[{"language":"eng"}]}],"encrypted":false},{"attributeName":"UIN","source":[{"attribute":"UIN"}],"encrypted":false},{"attributeName":"postalCode","source":[{"attribute":"postalCode"}],"encrypted":false},{"attributeName":"biometrics","group":"CBEFF","source":[{"attribute":"individualBiometrics","filter":[{"type":"Face"},{"type":"Finger","subType":["Left Thumb","Right Thumb"]}]}],"encrypted":true,"format":"extraction"}]}' WHERE id='mpolicy-default-PDFCard'; \ No newline at end of file diff --git a/db_upgrade_scripts/mosip_pms/sql/1.2.1.0_to_1.3.0-dp.1_rollback.sql b/db_upgrade_scripts/mosip_pms/sql/1.2.1.0_to_1.3.0-dp.1_rollback.sql index dae742a255..5aa1574c07 100644 --- a/db_upgrade_scripts/mosip_pms/sql/1.2.1.0_to_1.3.0-dp.1_rollback.sql +++ b/db_upgrade_scripts/mosip_pms/sql/1.2.1.0_to_1.3.0-dp.1_rollback.sql @@ -1,2 +1,3 @@ +\c mosip_pms -- user_details DROP TABLE IF EXISTS pms.user_details; diff --git a/db_upgrade_scripts/mosip_pms/sql/1.2.1.0_to_1.3.0-dp.1_upgrade.sql b/db_upgrade_scripts/mosip_pms/sql/1.2.1.0_to_1.3.0-dp.1_upgrade.sql index 0f6a6147f4..2c16814984 100644 --- a/db_upgrade_scripts/mosip_pms/sql/1.2.1.0_to_1.3.0-dp.1_upgrade.sql +++ b/db_upgrade_scripts/mosip_pms/sql/1.2.1.0_to_1.3.0-dp.1_upgrade.sql @@ -1,3 +1,4 @@ +\c mosip_pms -- This table has consents of users. CREATE TABLE pms.user_details( id character varying(36) NOT NULL, diff --git a/db_upgrade_scripts/mosip_pms/sql/1.3.0-dp.1_to_1.3.0_rollback.sql b/db_upgrade_scripts/mosip_pms/sql/1.3.0-dp.1_to_1.3.0_rollback.sql index 2f26ae3d57..24a8165415 100644 --- a/db_upgrade_scripts/mosip_pms/sql/1.3.0-dp.1_to_1.3.0_rollback.sql +++ b/db_upgrade_scripts/mosip_pms/sql/1.3.0-dp.1_to_1.3.0_rollback.sql @@ -1,3 +1,29 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name : mosip_pms +-- Release Version : 1.4.0 +-- Purpose : Database Alter scripts for the release for PMS DB. +-- Create By : Swetha K +-- Created Date : Aug-2024 +-- +-- Modified Date Modified By Comments / Remarks +-- ------------------------------------------------------------------------------------------------- +\c mosip_pms +--Dropping unique index from pms.device_detail table +DROP INDEX IF EXISTS pms.uk_devdtl_make_model_approval_status; + +--Creating unique constraint for dprovider_id, dtype_code, dstype_code, make and model +ALTER TABLE pms.device_detail +ADD CONSTRAINT uk_devdtl_id +UNIQUE (dprovider_id,dtype_code,dstype_code,make,model); + +--Dropping unique index from pms.ftp_chip_detail table +DROP INDEX IF EXISTS pms.uk_fcdtl_make_model_approval_status; + +--Creating unique constraint for foundational_trust_provider_id, make and model +ALTER TABLE pms.ftp_chip_detail +ADD CONSTRAINT uk_fcdtl_id +UNIQUE (foundational_trust_provider_id, make, model); + UPDATE pms.auth_policy SET policy_file_id='{"dataSharePolicies":{"typeOfShare":"Data Share","validForInMinutes":"30","transactionsAllowed":"2","encryptionType":"Partner Based","shareDomain":"datashare.datashare","source":"ID Repository"},"shareableAttributes":[{"attributeName":"fullName","source":[{"attribute":"fullName","filter":[{"language":"eng"}]}],"encrypted":false},{"attributeName":"dateOfBirth","source":[{"attribute":"dateOfBirth"}],"encrypted":false,"format":"YYYY"},{"attributeName":"gender","source":[{"attribute":"gender"}],"encrypted":false},{"attributeName":"phone","source":[{"attribute":"phone"}],"encrypted":false},{"attributeName":"email","source":[{"attribute":"email"}],"encrypted":false},{"attributeName":"addressLine1","source":[{"attribute":"addressLine1"}],"encrypted":false},{"attributeName":"addressLine2","source":[{"attribute":"addressLine2"}],"encrypted":false},{"attributeName":"addressLine3","source":[{"attribute":"addressLine3"}],"encrypted":false},{"attributeName":"region","source":[{"attribute":"region"}],"encrypted":false},{"attributeName":"province","source":[{"attribute":"province"}],"encrypted":false},{"attributeName":"city","source":[{"attribute":"city"}],"encrypted":false},{"attributeName":"UIN","source":[{"attribute":"UIN"}],"encrypted":false},{"attributeName":"postalCode","source":[{"attribute":"postalCode"}],"encrypted":false},{"attributeName":"biometrics","group":"CBEFF","source":[{"attribute":"individualBiometrics","filter":[{"type":"Face"},{"type":"Finger","subType":["Left Thumb","Right Thumb"]}]}],"encrypted":true,"format":"extraction"}]}' WHERE id='mpolicy-default-qrcode'; diff --git a/db_upgrade_scripts/mosip_pms/sql/1.3.0-dp.1_to_1.3.0_upgrade.sql b/db_upgrade_scripts/mosip_pms/sql/1.3.0-dp.1_to_1.3.0_upgrade.sql index 14d4d3d152..a31427440f 100644 --- a/db_upgrade_scripts/mosip_pms/sql/1.3.0-dp.1_to_1.3.0_upgrade.sql +++ b/db_upgrade_scripts/mosip_pms/sql/1.3.0-dp.1_to_1.3.0_upgrade.sql @@ -1,3 +1,28 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name : mosip_pms +-- Release Version : 1.4.0 +-- Purpose : Database Alter scripts for the release for PMS DB. +-- Create By : Swetha K +-- Created Date : Aug-2024 +-- +-- Modified Date Modified By Comments / Remarks +-- ------------------------------------------------------------------------------------------------- +\c mosip_pms +-- Dropping unique constraint from pms.device_detail table +ALTER TABLE pms.device_detail DROP CONSTRAINT uk_devdtl_id; + +-- Creating unique index for make, model, and approval status +CREATE UNIQUE INDEX uk_devdtl_make_model_approval_status +ON pms.device_detail (dprovider_id,dtype_code,dstype_code,make,model) +WHERE approval_status != 'rejected' AND NOT (approval_status = 'approved' AND is_active = false); + +-- Dropping unique constraint from pms.ftp_chip_detail table +ALTER TABLE pms.ftp_chip_detail DROP CONSTRAINT uk_fcdtl_id; + +-- Creating unique index for make, model, and approval status +CREATE UNIQUE INDEX uk_fcdtl_make_model_approval_status +ON pms.ftp_chip_detail (foundational_trust_provider_id, make, model) +WHERE approval_status != 'rejected' AND NOT (approval_status = 'approved' AND is_active = false); UPDATE pms.auth_policy SET policy_file_id='{"dataSharePolicies":{"typeOfShare":"Data Share","validForInMinutes":"30","transactionsAllowed":"2","encryptionType":"Partner Based","shareDomain":"datashare.datashare","source":"ID Repository"},"shareableAttributes":[{"attributeName":"fullName","source":[{"attribute":"fullName","filter":[{"language":"eng"}]}],"encrypted":false},{"attributeName":"dateOfBirth","source":[{"attribute":"dateOfBirth"}],"encrypted":false,"format":"YYYY"},{"attributeName":"gender","source":[{"attribute":"gender","filter":[{"language":"eng"}]}],"encrypted":false},{"attributeName":"phone","source":[{"attribute":"phone"}],"encrypted":false},{"attributeName":"email","source":[{"attribute":"email"}],"encrypted":false},{"attributeName":"addressLine1","source":[{"attribute":"addressLine1","filter":[{"language":"eng"}]}],"encrypted":false},{"attributeName":"addressLine2","source":[{"attribute":"addressLine2","filter":[{"language":"eng"}]}],"encrypted":false},{"attributeName":"addressLine3","source":[{"attribute":"addressLine3","filter":[{"language":"eng"}]}],"encrypted":false},{"attributeName":"region","source":[{"attribute":"region","filter":[{"language":"eng"}]}],"encrypted":false},{"attributeName":"province","source":[{"attribute":"province","filter":[{"language":"eng"}]}],"encrypted":false},{"attributeName":"city","source":[{"attribute":"city","filter":[{"language":"eng"}]}],"encrypted":false},{"attributeName":"UIN","source":[{"attribute":"UIN"}],"encrypted":false},{"attributeName":"postalCode","source":[{"attribute":"postalCode"}],"encrypted":false},{"attributeName":"biometrics","group":"CBEFF","source":[{"attribute":"individualBiometrics","filter":[{"type":"Face"},{"type":"Finger","subType":["Left Thumb","Right Thumb"]}]}],"encrypted":true,"format":"extraction"}]}' WHERE id='mpolicy-default-qrcode'; diff --git a/db_upgrade_scripts/mosip_pms/upgrade.properties b/db_upgrade_scripts/mosip_pms/upgrade.properties new file mode 100644 index 0000000000..6226f1194f --- /dev/null +++ b/db_upgrade_scripts/mosip_pms/upgrade.properties @@ -0,0 +1,12 @@ +MOSIP_DB_NAME= +DB_SERVERIP= +DB_PORT= +SU_USER=postgres +SU_USER_PWD= +SYS_ADMIN_USER= +SYS_ADMIN_PWD= +DEFAULT_DB_NAME=postgres +DBUSER_PWD= +ACTION= +CURRENT_VERSION= +UPGRADE_VERSION= diff --git a/db_upgrade_scripts/mosip_pms/upgrade.sh b/db_upgrade_scripts/mosip_pms/upgrade.sh new file mode 100644 index 0000000000..60c9b427c3 --- /dev/null +++ b/db_upgrade_scripts/mosip_pms/upgrade.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +set -e +SOURCE_DB1_NAME=mosip_authdevice +SOURCE_DB2_NAME=mosip_regdevice +SOURCE_DB1_SUPPORT_FILE=sql/1.1.5.5_to_1.2.0.1-B1_pms-authdevice-support.sql +SOURCE_DB2_SUPPORT_FILE=sql/1.1.5.5_to_1.2.0.1-B1_pms-regdevice-support.sql +properties_file="$1" +echo `date "+%m/%d/%Y %H:%M:%S"` ": $properties_file" +if [ -f "$properties_file" ]; +then + echo `date "+%m/%d/%Y %H:%M:%S"` ": Property file \"$properties_file\" found." + while IFS='=' read -r key value || [ -n "$key" ]; + do + # Trim spaces + key=$(echo "$key" | tr -d ' ') + value=$(echo "$value" | xargs) # Trim spaces around the value + + # Set the variable dynamically + eval "${key}=\"${value}\"" + done < "$properties_file" +else + echo `date "+%m/%d/%Y %H:%M:%S"` ": Property file not found, Pass property file name as argument." +fi + +echo "Current version: $CURRENT_VERSION" +echo "UPGRADE version: $UPGRADE_VERSION" +echo "Action: $ACTION" + +# Terminate existing connections +echo "Terminating active connections" +CONN=$(PGPASSWORD=$SU_USER_PWD psql -v ON_ERROR_STOP=1 --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -t -c "SELECT count(pg_terminate_backend(pg_stat_activity.pid)) FROM pg_stat_activity WHERE datname = '$MOSIP_DB_NAME' AND pid <> pg_backend_pid()";exit;) +echo "Terminated connections" + +# Execute upgrade or rollback +if [ "$ACTION" == "upgrade" ]; then + echo "Upgrading database from $CURRENT_VERSION to $UPGRADE_VERSION" + UPGRADE_SCRIPT_FILE="sql/${CURRENT_VERSION}_to_${UPGRADE_VERSION}_upgrade.sql" + if [ -f "$UPGRADE_SCRIPT_FILE" ]; then + echo "Executing upgrade script $UPGRADE_SCRIPT_FILE" + if [[ "$UPGRADE_VERSION" == "1.2.0.1-B1" && "$CURRENT_VERSION" == "1.1.5.5" ]]; then + echo "Creating dml directory." + mkdir dml + PGPASSWORD=$SU_USER_PWD psql -v ON_ERROR_STOP=1 --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$SOURCE_DB1_NAME -a -b -f $SOURCE_DB1_SUPPORT_FILE + PGPASSWORD=$SU_USER_PWD psql -v ON_ERROR_STOP=1 --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$SOURCE_DB2_NAME -a -b -f $SOURCE_DB2_SUPPORT_FILE + fi + PGPASSWORD=$SU_USER_PWD psql -v ON_ERROR_STOP=1 --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -a -b -f $UPGRADE_SCRIPT_FILE + else + echo "Upgrade script not found, exiting." + exit 1 + fi +elif [ "$ACTION" == "rollback" ]; then + echo "Rolling back database for $CURRENT_VERSION to $UPGRADE_VERSION" + REVOKE_SCRIPT_FILE="sql/${CURRENT_VERSION}_to_${UPGRADE_VERSION}_rollback.sql" + if [ -f "$REVOKE_SCRIPT_FILE" ]; then + echo "Executing rollback script $REVOKE_SCRIPT_FILE" + PGPASSWORD=$SU_USER_PWD psql -v ON_ERROR_STOP=1 --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -a -b -f $REVOKE_SCRIPT_FILE + else + echo "rollback script not found, exiting." + exit 1 + fi +else + echo "Unknown action: $ACTION, must be 'upgrade' or 'rollback'." + exit 1 +fi diff --git a/partner/partner-management-service/Dockerfile b/partner/partner-management-service/Dockerfile index 16a366f1dd..3753bb6764 100644 --- a/partner/partner-management-service/Dockerfile +++ b/partner/partner-management-service/Dockerfile @@ -35,9 +35,6 @@ ENV spring_config_label_env=${spring_config_label} ENV spring_config_url_env=${spring_config_url} -# environment variable to pass iam_adapter url, at docker runtime -ENV iam_adapter_url_env=${iam_adapter_url} - # can be passed during Docker build as build time environment for github branch to pickup configuration from. ARG container_user=mosip @@ -68,5 +65,8 @@ RUN chown -R ${container_user}:${container_user} /home/${container_user} USER ${container_user_uid}:${container_user_gid} EXPOSE 9109 -CMD wget -q --show-progress "${iam_adapter_url_env}" -O kernel-auth-adapter.jar; \ - java -jar -Dloader.path=./kernel-auth-adapter.jar -Dspring.cloud.config.label="${spring_config_label_env}" -Dspring.profiles.active="${active_profile_env}" -Dspring.cloud.config.uri="${spring_config_url_env}" partner-management-service.jar ; \ +CMD java -jar \ + -Dspring.cloud.config.label="${spring_config_label_env}" \ + -Dspring.profiles.active="${active_profile_env}" \ + -Dspring.cloud.config.uri="${spring_config_url_env}" \ + partner-management-service.jar \ No newline at end of file diff --git a/partner/partner-management-service/README.md b/partner/partner-management-service/README.md index 08657f8a25..debfec5a4a 100644 --- a/partner/partner-management-service/README.md +++ b/partner/partner-management-service/README.md @@ -1,4 +1,68 @@ # Partner management service -This repository contains the source code for partner management service. For an overview refer [here](https://nayakrounak.gitbook.io/mosip-docs/modules/partner-management). +## Overview +This repository contains the source code for partner management service. For an overview refer [here](https://docs.mosip.io/1.2.0/partners). +## Databases +Refer to [SQL scripts](../../db_scripts). + +## Build & run (for developers) +The project requires JDK 1.11 + +1. Build and install: + ``` + $ cd partner/partner-management-service + $ mvn install -DskipTests=true -Dmaven.javadoc.skip=true -Dgpg.skip=true + ``` +2. Build Docker for a service: + ``` + $ cd + $ docker build -f Dockerfile + ``` + +### Configuration +[partner-management-default.properties](https://github.com/mosip/mosip-config/blob/master/partner-management-default.properties) + +[application-default.properties](https://github.com/mosip/mosip-config/blob/master/application-default.properties) + +defined here. + +### Add auth-adapter in a class-path to run a services + ``` + + io.mosip.kernel + kernel-auth-adapter + ${kernel.auth.adapter.version} + + ``` + +## Deployment in K8 cluster with other MOSIP services: +### Pre-requisites +* Set KUBECONFIG variable to point to existing K8 cluster kubeconfig file: + ``` + export KUBECONFIG=~/.kube/ + ``` +### Install + ``` + $ cd deploy + $ ./install.sh + ``` +### Delete + ``` + $ cd deploy + $ ./delete.sh + ``` +### Restart + ``` + $ cd deploy + $ ./restart.sh + ``` + +## Test +Automated functional tests available in [Functional Tests](../../api-test). + +## APIs +API documentation is available [here](https://mosip.github.io/documentation/). + +## License +This project is licensed under the terms of [Mozilla Public License 2.0](../../LICENSE) \ No newline at end of file diff --git a/partner/partner-management-service/pom.xml b/partner/partner-management-service/pom.xml index 45f30ee296..03eeed0bd1 100644 --- a/partner/partner-management-service/pom.xml +++ b/partner/partner-management-service/pom.xml @@ -5,10 +5,10 @@ pms-parent io.mosip.pms - 1.3.0-dp.1 + 1.3.0-beta1 - 1.3.0-dp.1 + 1.3.0-beta1 partner-management-service partner-management-service @@ -23,7 +23,12 @@ io.mosip.kernel kernel-core ${kernel.version} - + + + io.mosip.kernel + kernel-auth-adapter + ${kernel.authadapter.version} + io.mosip.kernel kernel-crypto-jce @@ -32,7 +37,7 @@ io.mosip.pms pms-common - 1.3.0-dp.1 + 1.3.0-beta1 org.springframework.boot @@ -86,6 +91,11 @@ kernel-authcodeflowproxy-api 1.2.0.1-B1 + + com.nimbusds + nimbus-jose-jwt + 9.40 + diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/entity/DeviceDetailEntity.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/entity/DeviceDetailEntity.java new file mode 100644 index 0000000000..fd0b8ed751 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/entity/DeviceDetailEntity.java @@ -0,0 +1,81 @@ +package io.mosip.pms.device.authdevice.entity; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@Entity +@Getter +@Setter +@ToString +@SqlResultSetMapping( + name = "Mapping.DeviceDetailEntity", + classes = { + @ConstructorResult( + targetClass = DeviceDetailEntity.class, + columns = { + @ColumnResult(name = "deviceId", type = String.class), + @ColumnResult(name = "partnerId", type = String.class), + @ColumnResult(name = "orgName", type = String.class), + @ColumnResult(name = "deviceType", type = String.class), + @ColumnResult(name = "deviceSubType", type = String.class), + @ColumnResult(name = "status", type = String.class), + @ColumnResult(name = "make", type = String.class), + @ColumnResult(name = "model", type = String.class), + @ColumnResult(name = "createdDateTime", type = LocalDateTime.class), + @ColumnResult(name = "sbiId", type = String.class), + @ColumnResult(name = "sbiVersion", type = String.class) + } + ) + } +) +public class DeviceDetailEntity { + + public DeviceDetailEntity( + String deviceId, String partnerId, String orgName, String deviceType, + String deviceSubType, String status, String make, String model, + LocalDateTime createdDateTime, String sbiId, String sbiVersion) { + this.deviceId = deviceId; + this.partnerId = partnerId; + this.orgName = orgName; + this.deviceType = deviceType; + this.deviceSubType = deviceSubType; + this.status = status; + this.make = make; + this.model = model; + this.createdDateTime = createdDateTime; + this.sbiId = sbiId; + this.sbiVersion = sbiVersion; + } + + // No-argument constructor + public DeviceDetailEntity() { + super(); + } + + @Id + private String deviceId; + + private String partnerId; + + private String orgName; + + private String deviceType; + + private String deviceSubType; + + private String status; + + private String make; + + private String model; + + private LocalDateTime createdDateTime; + + private String sbiId; + + private String sbiVersion; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/entity/FtmDetailSummaryEntity.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/entity/FtmDetailSummaryEntity.java new file mode 100644 index 0000000000..87453aa875 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/entity/FtmDetailSummaryEntity.java @@ -0,0 +1,70 @@ +package io.mosip.pms.device.authdevice.entity; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@Entity +@Getter +@Setter +@ToString +@SqlResultSetMapping( + name = "Mapping.FtmDetailSummaryEntity", + classes = { @ConstructorResult( + targetClass = FtmDetailSummaryEntity.class, + columns = { + @ColumnResult(name = "ftmId", type = String.class), + @ColumnResult(name = "partnerId", type = String.class), + @ColumnResult(name = "orgName", type = String.class), + @ColumnResult(name = "make", type = String.class), + @ColumnResult(name = "model", type = String.class), + @ColumnResult(name = "status", type = String.class), + @ColumnResult(name = "isActive", type = Boolean.class), + @ColumnResult(name = "isCertificateAvailable", type = Boolean.class), + @ColumnResult(name = "createdDateTime", type = LocalDateTime.class) + }) + } +) +public class FtmDetailSummaryEntity { + + public FtmDetailSummaryEntity(String ftmId, String partnerId, String orgName, String make, String model, + String status, Boolean isActive, Boolean isCertificateAvailable, + LocalDateTime createdDateTime) { + this.ftmId = ftmId; + this.partnerId = partnerId; + this.orgName = orgName; + this.make = make; + this.model = model; + this.status = status; + this.isActive = isActive; + this.isCertificateAvailable = isCertificateAvailable; + this.createdDateTime = createdDateTime; + } + + // No-argument constructor + public FtmDetailSummaryEntity() { + super(); + } + + @Id + private String ftmId; + + private String partnerId; + + private String orgName; + + private String make; + + private String model; + + private String status; + + private Boolean isActive; + + private Boolean isCertificateAvailable; + + private LocalDateTime createdDateTime; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/entity/SbiSummaryEntity.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/entity/SbiSummaryEntity.java new file mode 100644 index 0000000000..1716645fdb --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/entity/SbiSummaryEntity.java @@ -0,0 +1,86 @@ +package io.mosip.pms.device.authdevice.entity; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@Entity +@Getter +@Setter +@ToString +@SqlResultSetMapping( + name = "Mapping.SbiSummaryEntity", + classes = { @ConstructorResult( + targetClass = SbiSummaryEntity.class, + columns = { + @ColumnResult(name = "partnerId", type = String.class), + @ColumnResult(name = "orgName", type = String.class), + @ColumnResult(name = "sbiId", type = String.class), + @ColumnResult(name = "sbiVersion", type = String.class), + @ColumnResult(name = "status", type = String.class), + @ColumnResult(name = "isActive", type = Boolean.class), + @ColumnResult(name = "sbiCreatedDateTime", type = LocalDateTime.class), + @ColumnResult(name = "sbiExpiryDateTime", type = LocalDateTime.class), + @ColumnResult(name = "createdDateTime", type = LocalDateTime.class), + @ColumnResult(name = "countOfAssociatedDevices", type = Long.class), + @ColumnResult(name = "countOfApprovedDevices", type = Long.class), + @ColumnResult(name = "countOfPendingDevices", type = Long.class), + @ColumnResult(name = "sbiExpiryStatus", type = String.class) + }) + } +) +public class SbiSummaryEntity { + + public SbiSummaryEntity(String partnerId, String orgName, String sbiId, String sbiVersion, + String status, Boolean isActive, LocalDateTime sbiCreatedDateTime, LocalDateTime sbiExpiryDateTime, LocalDateTime createdDateTime, + Long countOfAssociatedDevices, Long countOfApprovedDevices, Long countOfPendingDevices, String sbiExpiryStatus) { + this.partnerId = partnerId; + this.orgName = orgName; + this.sbiId = sbiId; + this.sbiVersion = sbiVersion; + this.status = status; + this.isActive = isActive; + this.sbiCreatedDateTime = sbiCreatedDateTime; + this.sbiExpiryDateTime = sbiExpiryDateTime; + this.createdDateTime = createdDateTime; + this.countOfAssociatedDevices = countOfAssociatedDevices; + this.countOfApprovedDevices = countOfApprovedDevices; + this.countOfPendingDevices = countOfPendingDevices; + this.sbiExpiryStatus = sbiExpiryStatus; + } + + // No-argument constructor + public SbiSummaryEntity() { + super(); + } + + private String partnerId; + + private String orgName; + + @Id + private String sbiId; + + private String sbiVersion; + + private String status; + + private Boolean isActive; + + private LocalDateTime sbiCreatedDateTime; + + private LocalDateTime sbiExpiryDateTime; + + private LocalDateTime createdDateTime; + + private Long countOfAssociatedDevices; + + private Long countOfApprovedDevices; + + private Long countOfPendingDevices; + + private String sbiExpiryStatus; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/DeviceDetailRepository.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/DeviceDetailRepository.java index c7e2304e2e..cc23939119 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/DeviceDetailRepository.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/DeviceDetailRepository.java @@ -1,6 +1,7 @@ package io.mosip.pms.device.authdevice.repository; import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -21,11 +22,19 @@ DeviceDetail findByDeviceDetail( String make, String model, String deviceProvide @Query("FROM DeviceDetail d where d.id = ?1 AND (d.isDeleted is null or d.isDeleted = false) AND d.isActive=true ") DeviceDetail findByIdAndIsDeletedFalseOrIsDeletedIsNullAndIsActiveTrue(String id); - @Query(value ="select * from device_detail where make=?1 AND model=?2 AND dprovider_id=?3 AND dstype_code=?4 AND dtype_code=?5",nativeQuery = true) + @Query(value ="select * from device_detail where make=?1 AND model=?2 AND dprovider_id=?3 AND dstype_code=?4 AND dtype_code=?5 AND approval_status != 'rejected' AND NOT (approval_status = 'approved' AND is_active = false)",nativeQuery = true) DeviceDetail findUniqueDeviceDetail( String make, String model, String deviceProviderId, String deviceSubTypeCode, String deviceTypeCode); @Query(value= "select * from device_detail d where d.id IN :ids AND (d.is_deleted is null or d.is_deleted = false) AND d.is_active=true",nativeQuery = true) List findByIds(@Param("ids") List ids); + @Query("FROM DeviceDetail d where d.id=?1 AND d.deviceProviderId=?2 AND (d.isDeleted is null or d.isDeleted = false)") + Optional findByIdAndDeviceProviderId(String id, String deviceProviderId); + + @Query(value= " select * from device_detail dd join device_detail_sbi dds on dd.id = dds.device_detail_id where dds.sbi_id = ?1 AND dd.approval_status = 'approved' AND dd.is_active = true",nativeQuery = true) + List findApprovedDevicesBySbiId(String sbiId); + + @Query(value= " select * from device_detail dd join device_detail_sbi dds on dd.id = dds.device_detail_id where dds.sbi_id = ?1 AND dd.approval_status = 'pending_approval'",nativeQuery = true) + List findPendingApprovalDevicesBySbiId(String sbiId); } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/DeviceDetailSummaryRepository.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/DeviceDetailSummaryRepository.java new file mode 100644 index 0000000000..89d21dfb74 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/DeviceDetailSummaryRepository.java @@ -0,0 +1,87 @@ +package io.mosip.pms.device.authdevice.repository; + +import io.mosip.kernel.core.dataaccess.spi.repository.BaseRepository; +import io.mosip.pms.device.authdevice.entity.DeviceDetailEntity; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface DeviceDetailSummaryRepository extends BaseRepository { + + String DEVICE_DETAILS_SUMMARY_QUERY = "SELECT new DeviceDetailEntity(" + + "d.id, d.deviceProviderId, d.partnerOrganizationName, d.deviceTypeCode, d.deviceSubTypeCode, " + + "CASE " + + "WHEN (d.approvalStatus = 'approved' AND d.isActive = true) THEN 'approved' " + + "WHEN (d.approvalStatus = 'approved' AND d.isActive = false) THEN 'deactivated' " + + "WHEN (d.approvalStatus = 'pending_approval') THEN 'pending_approval' " + + "WHEN (d.approvalStatus = 'rejected') THEN 'rejected' " + + "END as status, " + + "d.make, d.model, d.crDtimes, s.id, s.swVersion) " + + "FROM DeviceDetail d " + + "LEFT JOIN DeviceDetailSBI dds ON dds.id.deviceDetailId = d.id " + + "LEFT JOIN SecureBiometricInterface s ON dds.id.sbiId = s.id " + + "WHERE (:partnerId IS NULL OR lower(d.deviceProviderId) LIKE %:partnerId%) " + + "AND (:orgName IS NULL OR lower(d.partnerOrganizationName) LIKE %:orgName%) " + + "AND (:deviceType IS NULL OR lower(d.deviceTypeCode) LIKE %:deviceType%) " + + "AND (:deviceSubType IS NULL OR lower(d.deviceSubTypeCode) LIKE %:deviceSubType%) " + + "AND (:status IS NULL OR " + + "(" + + " (:status = 'approved' AND d.approvalStatus = 'approved' AND d.isActive = true) " + + " OR (:status = 'deactivated' AND d.approvalStatus = 'approved' AND d.isActive = false) " + + " OR (:status = 'pending_approval' AND d.approvalStatus = 'pending_approval') " + + " OR (:status = 'rejected' AND d.approvalStatus = 'rejected')" + + ")) " + + "AND (:make IS NULL OR lower(d.make) LIKE %:make%) " + + "AND (:model IS NULL OR lower(d.model) LIKE %:model%)"+ + "AND (:deviceId IS NULL OR lower(d.id) LIKE %:deviceId%)"+ + "AND (:sbiId IS NULL OR lower(s.id) LIKE %:sbiId%) " + + "AND (:sbiVersion IS NULL OR lower(s.swVersion) LIKE %:sbiVersion%)"; + + @Query(DEVICE_DETAILS_SUMMARY_QUERY) + Page getSummaryOfAllDeviceDetails( + @Param("partnerId") String partnerId, + @Param("orgName") String orgName, + @Param("deviceType") String deviceType, + @Param("deviceSubType") String deviceSubType, + @Param("status") String status, + @Param("make") String make, + @Param("model") String model, + @Param("sbiId") String sbiId, + @Param("sbiVersion") String sbiVersion, + @Param("deviceId") String deviceId, + Pageable pageable + ); + + @Query(DEVICE_DETAILS_SUMMARY_QUERY + " ORDER BY status ASC") + Page getSummaryOfAllDeviceDetailsByStatusAsc( + @Param("partnerId") String partnerId, + @Param("orgName") String orgName, + @Param("deviceType") String deviceType, + @Param("deviceSubType") String deviceSubType, + @Param("status") String status, + @Param("make") String make, + @Param("model") String model, + @Param("sbiId") String sbiId, + @Param("sbiVersion") String sbiVersion, + @Param("deviceId") String deviceId, + Pageable pageable + ); + + @Query(DEVICE_DETAILS_SUMMARY_QUERY + " ORDER BY status DESC") + Page getSummaryOfAllDeviceDetailsByStatusDesc( + @Param("partnerId") String partnerId, + @Param("orgName") String orgName, + @Param("deviceType") String deviceType, + @Param("deviceSubType") String deviceSubType, + @Param("status") String status, + @Param("make") String make, + @Param("model") String model, + @Param("sbiId") String sbiId, + @Param("sbiVersion") String sbiVersion, + @Param("deviceId") String deviceId, + Pageable pageable + ); +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/FTPChipDetailRepository.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/FTPChipDetailRepository.java index bcb22bb364..fee85847ee 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/FTPChipDetailRepository.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/FTPChipDetailRepository.java @@ -6,9 +6,14 @@ import io.mosip.pms.device.authdevice.entity.FTPChipDetail; +import java.util.List; + @Repository public interface FTPChipDetailRepository extends JpaRepository{ - @Query(value = "select * from ftp_chip_detail fcd where fcd.foundational_trust_provider_id =?1 and make =?2 and model =?3",nativeQuery = true) - FTPChipDetail findByUniqueKey(String ftpId, String make, String model); + @Query(value = "select * from ftp_chip_detail where foundational_trust_provider_id =?1 AND make =?2 AND model =?3 AND approval_status != 'rejected' AND NOT (approval_status = 'approved' AND is_active = false)",nativeQuery = true) + FTPChipDetail findByUniqueKey(String ftpId, String make, String model); + + @Query(value = "select * from ftp_chip_detail fcd where fcd.foundational_trust_provider_id =?1 AND (fcd.is_deleted is null or fcd.is_deleted = false)",nativeQuery = true) + List findByProviderId(String providerId); } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/FtmDetailsSummaryRepository.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/FtmDetailsSummaryRepository.java new file mode 100644 index 0000000000..dcd84b1116 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/FtmDetailsSummaryRepository.java @@ -0,0 +1,69 @@ +package io.mosip.pms.device.authdevice.repository; + +import io.mosip.kernel.core.dataaccess.spi.repository.BaseRepository; +import io.mosip.pms.device.authdevice.entity.FtmDetailSummaryEntity; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository("FtmDetailsSummaryRepository") +public interface FtmDetailsSummaryRepository extends BaseRepository { + + String FTM_DETAILS_SUMMARY_QUERY = "SELECT new FtmDetailSummaryEntity(" + + "f.ftpChipDetailId, f.ftpProviderId, f.partnerOrganizationName, f.make, f.model, " + + "CASE " + + "WHEN f.approvalStatus = 'approved' AND f.isActive = true THEN 'approved' " + + "WHEN f.approvalStatus = 'approved' AND f.isActive = false THEN 'deactivated' " + + "WHEN f.approvalStatus = 'rejected' THEN 'rejected' " + + "WHEN f.approvalStatus = 'pending_approval' THEN 'pending_approval' " + + "WHEN f.approvalStatus = 'pending_cert_upload' THEN 'pending_cert_upload' " + + "END AS status, " + + "f.isActive, CASE WHEN f.certificateAlias IS NULL THEN false ELSE true END, f.crDtimes) " + + "FROM FTPChipDetail f " + + "WHERE (:partnerId IS NULL OR lower(f.ftpProviderId) LIKE %:partnerId%) " + + "AND (:orgName IS NULL OR lower(f.partnerOrganizationName) LIKE %:orgName%) " + + "AND (:ftmId IS NULL OR lower(f.ftpChipDetailId) LIKE %:ftmId%) " + + "AND (:make IS NULL OR lower(f.make) LIKE %:make%) " + + "AND (:model IS NULL OR lower(f.model) LIKE %:model%) " + + "AND (:status IS NULL OR " + + "(:status = 'deactivated' AND f.approvalStatus = 'approved' AND f.isActive = false) " + + "OR (:status = 'approved' AND f.approvalStatus = 'approved' AND f.isActive = true) " + + "OR (:status = 'rejected' AND f.approvalStatus = 'rejected') " + + "OR (:status = 'pending_approval' AND f.approvalStatus = 'pending_approval') " + + "OR (:status = 'pending_cert_upload' AND f.approvalStatus = 'pending_cert_upload'))"; + + @Query(FTM_DETAILS_SUMMARY_QUERY) + Page getSummaryOfPartnersFtmDetails( + @Param("partnerId") String partnerId, + @Param("orgName") String orgName, + @Param("ftmId") String ftmId, + @Param("make") String make, + @Param("model") String model, + @Param("status") String status, + Pageable pageable + ); + + @Query(FTM_DETAILS_SUMMARY_QUERY + " ORDER BY status ASC") + Page getSummaryOfPartnersFtmDetailsByStatusAsc( + @Param("partnerId") String partnerId, + @Param("orgName") String orgName, + @Param("ftmId") String ftmId, + @Param("make") String make, + @Param("model") String model, + @Param("status") String status, + Pageable pageable + ); + + @Query(FTM_DETAILS_SUMMARY_QUERY + " ORDER BY status DESC") + Page getSummaryOfPartnersFtmDetailsByStatusDesc( + @Param("partnerId") String partnerId, + @Param("orgName") String orgName, + @Param("ftmId") String ftmId, + @Param("make") String make, + @Param("model") String model, + @Param("status") String status, + Pageable pageable + ); +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/SbiSummaryRepository.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/SbiSummaryRepository.java new file mode 100644 index 0000000000..df980a4dc5 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/SbiSummaryRepository.java @@ -0,0 +1,140 @@ +package io.mosip.pms.device.authdevice.repository; + +import io.mosip.kernel.core.dataaccess.spi.repository.BaseRepository; +import io.mosip.pms.device.authdevice.entity.SbiSummaryEntity; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository("SbiSummaryRepository") +public interface SbiSummaryRepository extends BaseRepository { + + String SBI_DETAILS_SUMMARY_QUERY = "SELECT new SbiSummaryEntity(" + + "s.providerId, s.partnerOrgName, s.id, s.swVersion, " + + "CASE " + + "WHEN s.approvalStatus = 'approved' AND s.isActive = true THEN 'approved' " + + "WHEN s.approvalStatus = 'approved' AND s.isActive = false THEN 'deactivated' " + + "WHEN s.approvalStatus = 'rejected' THEN 'rejected' " + + "WHEN s.approvalStatus = 'pending_approval' THEN 'pending_approval' " + + "END AS status, " + + "s.isActive, s.swCreateDateTime, s.swExpiryDateTime, s.crDtimes, COUNT(dd.id.deviceDetailId) AS countOfAssociatedDevices, " + + "SUM(CASE WHEN d.approvalStatus = 'approved' AND d.isActive = true THEN 1 ELSE 0 END) AS countOfApprovedDevices, " + + "SUM(CASE WHEN d.approvalStatus = 'pending_approval' THEN 1 ELSE 0 END) AS countOfPendingDevices, " + + "CASE " + + "WHEN s.swExpiryDateTime < CURRENT_DATE THEN 'expired' " + + "ELSE 'valid' " + + "END AS sbiExpiryStatus ) " + + "FROM SecureBiometricInterface s " + + "LEFT JOIN DeviceDetailSBI dd ON dd.id.sbiId = s.id " + + "LEFT JOIN DeviceDetail d ON d.id = dd.id.deviceDetailId " + + "WHERE (:partnerId IS NULL OR lower(s.providerId) LIKE %:partnerId%) " + + "AND (:orgName IS NULL OR lower(s.partnerOrgName) LIKE %:orgName%) " + + "AND (:sbiId IS NULL OR lower(s.id) LIKE %:sbiId%) " + + "AND (:sbiVersion IS NULL OR lower(s.swVersion) LIKE %:sbiVersion%) " + + "AND (:status IS NULL OR " + + "(:status = 'deactivated' AND s.approvalStatus = 'approved' AND s.isActive = false) " + + "OR (:status = 'approved' AND s.approvalStatus = 'approved' AND s.isActive = true) " + + "OR (:status = 'rejected' AND s.approvalStatus = 'rejected') " + + "OR (:status = 'pending_approval' AND s.approvalStatus = 'pending_approval')) " + + "AND (:sbiExpiryStatus IS NULL OR " + + "(:sbiExpiryStatus = 'expired' AND s.swExpiryDateTime < CURRENT_DATE) " + + "OR (:sbiExpiryStatus = 'valid' AND s.swExpiryDateTime >= CURRENT_DATE)) " + + "AND (:isPartnerAdmin = true OR (s.providerId IN :partnerIdList)) " + + "GROUP BY s.providerId, s.partnerOrgName, s.id, s.swVersion, s.approvalStatus, " + + "s.isActive, s.swCreateDateTime, s.swExpiryDateTime, s.crDtimes"; + + @Query(SBI_DETAILS_SUMMARY_QUERY) + Page getSummaryOfSbiDetails( + @Param("partnerId") String partnerId, + @Param("orgName") String orgName, + @Param("sbiId") String sbiId, + @Param("sbiVersion") String sbiVersion, + @Param("status") String status, + @Param("sbiExpiryStatus") String sbiExpiryStatus, + @Param("partnerIdList") List partnerIdList, + @Param("isPartnerAdmin") boolean isPartnerAdmin, + Pageable pageable + ); + + @Query(SBI_DETAILS_SUMMARY_QUERY + " ORDER BY status ASC") + Page getSummaryOfSbiDetailsByStatusAsc( + @Param("partnerId") String partnerId, + @Param("orgName") String orgName, + @Param("sbiId") String sbiId, + @Param("sbiVersion") String sbiVersion, + @Param("status") String status, + @Param("sbiExpiryStatus") String sbiExpiryStatus, + @Param("partnerIdList") List partnerIdList, + @Param("isPartnerAdmin") boolean isPartnerAdmin, + Pageable pageable + ); + + @Query(SBI_DETAILS_SUMMARY_QUERY + " ORDER BY status DESC") + Page getSummaryOfSbiDetailsByStatusDesc( + @Param("partnerId") String partnerId, + @Param("orgName") String orgName, + @Param("sbiId") String sbiId, + @Param("sbiVersion") String sbiVersion, + @Param("status") String status, + @Param("sbiExpiryStatus") String sbiExpiryStatus, + @Param("partnerIdList") List partnerIdList, + @Param("isPartnerAdmin") boolean isPartnerAdmin, + Pageable pageable + ); + + @Query(SBI_DETAILS_SUMMARY_QUERY + " ORDER BY sbiExpiryStatus ASC") + Page getSummaryOfSbiDetailsByExpiryStatusAsc( + @Param("partnerId") String partnerId, + @Param("orgName") String orgName, + @Param("sbiId") String sbiId, + @Param("sbiVersion") String sbiVersion, + @Param("status") String status, + @Param("sbiExpiryStatus") String sbiExpiryStatus, + @Param("partnerIdList") List partnerIdList, + @Param("isPartnerAdmin") boolean isPartnerAdmin, + Pageable pageable + ); + + @Query(SBI_DETAILS_SUMMARY_QUERY + " ORDER BY sbiExpiryStatus DESC") + Page getSummaryOfSbiDetailsByExpiryStatusDesc( + @Param("partnerId") String partnerId, + @Param("orgName") String orgName, + @Param("sbiId") String sbiId, + @Param("sbiVersion") String sbiVersion, + @Param("status") String status, + @Param("sbiExpiryStatus") String sbiExpiryStatus, + @Param("partnerIdList") List partnerIdList, + @Param("isPartnerAdmin") boolean isPartnerAdmin, + Pageable pageable + ); + + @Query(SBI_DETAILS_SUMMARY_QUERY + " ORDER BY countOfAssociatedDevices ASC") + Page getSummaryOfSbiDetailsByDevicesCountAsc( + @Param("partnerId") String partnerId, + @Param("orgName") String orgName, + @Param("sbiId") String sbiId, + @Param("sbiVersion") String sbiVersion, + @Param("status") String status, + @Param("sbiExpiryStatus") String sbiExpiryStatus, + @Param("partnerIdList") List partnerIdList, + @Param("isPartnerAdmin") boolean isPartnerAdmin, + Pageable pageable + ); + + @Query(SBI_DETAILS_SUMMARY_QUERY + " ORDER BY countOfAssociatedDevices DESC") + Page getSummaryOfSbiDetailsByDevicesCountDesc( + @Param("partnerId") String partnerId, + @Param("orgName") String orgName, + @Param("sbiId") String sbiId, + @Param("sbiVersion") String sbiVersion, + @Param("status") String status, + @Param("sbiExpiryStatus") String sbiExpiryStatus, + @Param("partnerIdList") List partnerIdList, + @Param("isPartnerAdmin") boolean isPartnerAdmin, + Pageable pageable + ); +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/SecureBiometricInterfaceRepository.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/SecureBiometricInterfaceRepository.java index 06d20d59b4..03eff7a85f 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/SecureBiometricInterfaceRepository.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/repository/SecureBiometricInterfaceRepository.java @@ -18,4 +18,7 @@ public interface SecureBiometricInterfaceRepository extends JpaRepository findByProviderIdAndSwVersion(String providerId, String swversion); + + @Query(value = "select * from secure_biometric_interface d where d.provider_id = ?1 AND (d.is_deleted is null or d.is_deleted = false)", nativeQuery = true) + List findByProviderId(String providerId); } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/DeviceDetailService.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/DeviceDetailService.java index 36a02c195a..b105b81043 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/DeviceDetailService.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/DeviceDetailService.java @@ -1,5 +1,11 @@ package io.mosip.pms.device.authdevice.service; +import io.mosip.pms.common.dto.PageResponseV2Dto; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.device.dto.DeviceDetailFilterDto; +import io.mosip.pms.device.dto.DeviceDetailSummaryDto; +import io.mosip.pms.partner.request.dto.SbiAndDeviceMappingRequestDto; +import io.mosip.pms.device.response.dto.DeviceDetailResponseDto; import org.springframework.stereotype.Service; import io.mosip.pms.common.dto.DeviceFilterValueDto; @@ -9,6 +15,7 @@ import io.mosip.pms.device.request.dto.DeviceDetailUpdateDto; import io.mosip.pms.device.request.dto.DeviceSearchDto; import io.mosip.pms.device.request.dto.UpdateDeviceDetailStatusDto; +import io.mosip.pms.device.request.dto.DeactivateDeviceRequestDto; import io.mosip.pms.device.response.dto.DeviceDetailSearchResponseDto; import io.mosip.pms.device.response.dto.FilterResponseCodeDto; import io.mosip.pms.device.response.dto.IdDto; @@ -85,4 +92,10 @@ public interface DeviceDetailService { * @return */ public FilterResponseCodeDto deviceTypeFilterValues(DeviceFilterValueDto deviceFilterValueDto); + + public ResponseWrapperV2 deactivateDevice(String deviceDetailId, DeactivateDeviceRequestDto requestDto); + + ResponseWrapperV2> getAllDeviceDetails(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, DeviceDetailFilterDto filterDto); + + public ResponseWrapperV2 approveOrRejectMappingDeviceToSbi(String deviceId, SbiAndDeviceMappingRequestDto requestDto); } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/FtpChipDetailService.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/FtpChipDetailService.java index ec05ff148e..f3be2af40a 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/FtpChipDetailService.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/FtpChipDetailService.java @@ -1,7 +1,14 @@ package io.mosip.pms.device.authdevice.service; import java.io.IOException; +import java.util.List; +import io.mosip.pms.common.dto.PageResponseV2Dto; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.device.dto.FtmChipDetailsDto; +import io.mosip.pms.device.dto.FtmChipFilterDto; +import io.mosip.pms.device.response.dto.*; +import io.mosip.pms.partner.response.dto.FtmCertificateDownloadResponseDto; import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.JsonParseException; @@ -11,15 +18,12 @@ import io.mosip.pms.common.dto.PageResponseDto; import io.mosip.pms.device.authdevice.entity.FTPChipDetail; import io.mosip.pms.device.request.dto.DeviceSearchDto; +import io.mosip.pms.device.request.dto.DeactivateFtmRequestDto; import io.mosip.pms.device.request.dto.FtpChipCertDownloadRequestDto; import io.mosip.pms.device.request.dto.FtpChipCertificateRequestDto; import io.mosip.pms.device.request.dto.FtpChipDetailDto; import io.mosip.pms.device.request.dto.FtpChipDetailStatusDto; import io.mosip.pms.device.request.dto.FtpChipDetailUpdateDto; -import io.mosip.pms.device.response.dto.FTPSearchResponseDto; -import io.mosip.pms.device.response.dto.FtpCertDownloadResponeDto; -import io.mosip.pms.device.response.dto.FtpCertificateResponseDto; -import io.mosip.pms.device.response.dto.IdDto; @Service public interface FtpChipDetailService { @@ -85,4 +89,12 @@ public interface FtpChipDetailService { */ public PageResponseDto searchFTPChipDetails(Class entity, DeviceSearchDto dto); + public ResponseWrapperV2 deactivateFtm(String ftmId, DeactivateFtmRequestDto requestDto); + + public ResponseWrapperV2 getFtmCertificateData(String ftmId); + + public ResponseWrapperV2> getPartnersFtmChipDetails(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, FtmChipFilterDto filterDto); + + public ResponseWrapperV2> ftmChipDetail(); + } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/SecureBiometricInterfaceService.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/SecureBiometricInterfaceService.java index c765dda344..031756015b 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/SecureBiometricInterfaceService.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/SecureBiometricInterfaceService.java @@ -1,19 +1,31 @@ package io.mosip.pms.device.authdevice.service; +import io.mosip.pms.common.dto.PageResponseV2Dto; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.partner.dto.DeviceDto; +import io.mosip.pms.device.response.dto.SbiDetailsResponseDto; +import io.mosip.pms.device.response.dto.SbiSummaryDto; +import io.mosip.pms.device.dto.SbiFilterDto; + +import io.mosip.pms.device.dto.SbiDetailsDto; import org.springframework.stereotype.Service; import io.mosip.pms.common.dto.FilterValueDto; import io.mosip.pms.common.dto.PageResponseDto; import io.mosip.pms.device.request.dto.DeviceDetailSBIMappingDto; import io.mosip.pms.device.request.dto.DeviceSearchDto; +import io.mosip.pms.device.request.dto.DeactivateSbiRequestDto; import io.mosip.pms.device.request.dto.SecureBiometricInterfaceCreateDto; import io.mosip.pms.device.request.dto.SecureBiometricInterfaceStatusUpdateDto; import io.mosip.pms.device.request.dto.SecureBiometricInterfaceUpdateDto; +import io.mosip.pms.device.request.dto.DeviceDetailDto; import io.mosip.pms.device.response.dto.FilterResponseCodeDto; import io.mosip.pms.device.response.dto.IdDto; import io.mosip.pms.device.response.dto.MappedDeviceDetailsReponse; import io.mosip.pms.device.response.dto.SbiSearchResponseDto; +import java.util.List; + @Service public interface SecureBiometricInterfaceService { @@ -32,4 +44,12 @@ public interface SecureBiometricInterfaceService { public PageResponseDto searchMappedDeviceDetails(Class entity, DeviceSearchDto dto); public FilterResponseCodeDto filterValues(FilterValueDto filterValueDto); + + public ResponseWrapperV2 addDeviceToSbi(DeviceDetailDto deviceDetailDto, String sbiId); + + public ResponseWrapperV2> getAllDevicesForSbi(String sbiId); + + public ResponseWrapperV2 deactivateSbi(String id, DeactivateSbiRequestDto deactivateSbiRequestDto); + + public ResponseWrapperV2> getAllSbiDetails(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, SbiFilterDto filterDto); } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/impl/DeviceDetailServiceImpl.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/impl/DeviceDetailServiceImpl.java index edd0d40ddb..98903bbfb4 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/impl/DeviceDetailServiceImpl.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/impl/DeviceDetailServiceImpl.java @@ -1,13 +1,41 @@ package io.mosip.pms.device.authdevice.service.impl; +import java.sql.Timestamp; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.Optional; +import java.util.Map; +import java.util.Set; +import io.mosip.kernel.core.authmanager.authadapter.model.AuthUserDetails; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.pms.common.dto.PageResponseV2Dto; +import io.mosip.pms.common.entity.DeviceDetailSBI; +import io.mosip.pms.common.entity.DeviceDetailSBIPK; +import io.mosip.pms.device.authdevice.entity.DeviceDetailEntity; +import io.mosip.pms.common.repository.DeviceDetailSbiRepository; +import io.mosip.pms.device.authdevice.repository.DeviceDetailSummaryRepository; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.common.util.PMSLogger; +import io.mosip.pms.device.dto.DeviceDetailFilterDto; +import io.mosip.pms.device.dto.DeviceDetailSummaryDto; +import io.mosip.pms.partner.constant.ErrorCode; +import io.mosip.pms.partner.constant.PartnerConstants; +import io.mosip.pms.partner.exception.PartnerServiceException; +import io.mosip.pms.partner.request.dto.SbiAndDeviceMappingRequestDto; +import io.mosip.pms.device.response.dto.DeviceDetailResponseDto; +import io.mosip.pms.partner.util.PartnerHelper; +import io.mosip.pms.partner.util.MultiPartnerUtil; +import io.mosip.pms.partner.util.PartnerUtil; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @@ -39,6 +67,7 @@ import io.mosip.pms.device.request.dto.DeviceDetailDto; import io.mosip.pms.device.request.dto.DeviceDetailUpdateDto; import io.mosip.pms.device.request.dto.DeviceSearchDto; +import io.mosip.pms.device.request.dto.DeactivateDeviceRequestDto; import io.mosip.pms.device.request.dto.UpdateDeviceDetailStatusDto; import io.mosip.pms.device.response.dto.ColumnCodeValue; import io.mosip.pms.device.response.dto.DeviceDetailSearchResponseDto; @@ -51,11 +80,30 @@ @Service @Transactional public class DeviceDetailServiceImpl implements DeviceDetailService { + + private static final Logger LOGGER = PMSLogger.getLogger(DeviceDetailServiceImpl.class); + public static final String BLANK_STRING = ""; + public static final String VERSION = "1.0"; + public static final String APPROVED = "approved"; + + @Value("${mosip.pms.api.id.deactivate.device.patch}") + private String patchDeactivateDevice; + + @Value("${mosip.pms.api.id.get.all.device.details.get}") + private String getAllDeviceDetailsId; + + @Value("${mosip.pms.api.id.approval.mapping.device.to.sbi.post}") + private String postApprovalMappingDeviceToSbiId; + + @Autowired + DeviceDetailSbiRepository deviceDetailSbiRepository; + + @Autowired + PartnerHelper partnerHelper; @Autowired FilterColumnValidator filterColumnValidator; - @Autowired FilterHelper filterHelper; @@ -73,6 +121,9 @@ public class DeviceDetailServiceImpl implements DeviceDetailService { @Autowired SearchHelper searchHelper; + + @Autowired + DeviceDetailSummaryRepository deviceDetailSummaryRepository; @Autowired private PageUtils pageUtils; @@ -114,7 +165,7 @@ public IdDto createDeviceDetails(DeviceDetailDto deviceDetailDto) { DeviceDetailExceptionsConstant.DEVICE_PROVIDER_NOT_FOUND.getErrorMessage()); } entity.setPartnerOrganizationName(partner.getName()); - if (deviceDetailRepository.findUniqueDeviceDetail(deviceDetailDto.getMake(), deviceDetailDto.getModel(), + if (deviceDetailRepository.findUniqueDeviceDetail(PartnerUtil.trimAndReplace(deviceDetailDto.getMake()), PartnerUtil.trimAndReplace(deviceDetailDto.getModel()), deviceDetailDto.getDeviceProviderId(), deviceDetailDto.getDeviceSubTypeCode(), deviceDetailDto.getDeviceTypeCode()) != null) { auditUtil.auditRequest( @@ -133,7 +184,7 @@ public IdDto createDeviceDetails(DeviceDetailDto deviceDetailDto) { return dto; } - private DeviceDetail getCreateMapping(DeviceDetail deviceDetail, DeviceDetailDto deviceDetailDto) { + private DeviceDetail getCreateMapping(DeviceDetail deviceDetail, DeviceDetailDto deviceDetailDto) { deviceDetail.setId(deviceDetailDto.getId() == null ? DeviceUtil.generateId(): deviceDetailDto.getId()); deviceDetail.setIsActive(false); deviceDetail.setIsDeleted(false); @@ -145,7 +196,7 @@ private DeviceDetail getCreateMapping(DeviceDetail deviceDetail, DeviceDetailDto deviceDetail.setCrDtimes(LocalDateTime.now(ZoneId.of("UTC"))); deviceDetail.setDeviceProviderId(deviceDetailDto.getDeviceProviderId()); deviceDetail.setMake(deviceDetailDto.getMake()); - deviceDetail.setModel(deviceDetailDto.getModel()); + deviceDetail.setModel(deviceDetailDto.getModel()); return deviceDetail; } @@ -365,4 +416,255 @@ public FilterResponseCodeDto deviceSubTypeFilterValues(DeviceFilterValueDto devi } return filterResponseDto; } + + public static void validatePartnerId(Partner partner, String userId) { + if (Objects.isNull(partner.getId()) || partner.getId().equals(BLANK_STRING)) { + LOGGER.info("Partner Id is null or empty for user id : " + userId); + throw new PartnerServiceException(ErrorCode.PARTNER_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.PARTNER_ID_NOT_EXISTS.getErrorMessage()); + } + } + + @Override + public ResponseWrapperV2 deactivateDevice(String deviceDetailId, DeactivateDeviceRequestDto requestDto) { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + try { + String status = requestDto.getStatus(); + if (Objects.isNull(status) || status.equals(BLANK_STRING) || !status.equals(PartnerConstants.DEACTIVATE)) { + LOGGER.info(status + " : is Invalid Input Parameter, it should be (De-Activate)"); + throw new PartnerServiceException(ErrorCode.DEACTIVATE_STATUS_CODE.getErrorCode(), + ErrorCode.DEACTIVATE_STATUS_CODE.getErrorMessage()); + } + String userId = getUserId(); + List partnerList = partnerRepository.findByUserId(userId); + if (partnerList.isEmpty()) { + LOGGER.info("sessionId", "idType", "id", "User id does not exist."); + throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); + } + if (Objects.isNull(deviceDetailId)) { + LOGGER.info("sessionId", "idType", "id", "Device id is null."); + throw new PartnerServiceException(ErrorCode.INVALID_DEVICE_ID.getErrorCode(), + ErrorCode.INVALID_DEVICE_ID.getErrorMessage()); + } + Optional deviceDetail = deviceDetailRepository.findById(deviceDetailId); + if (!deviceDetail.isPresent()) { + LOGGER.error("Device not exists with id {}", deviceDetailId); + throw new PartnerServiceException(ErrorCode.DEVICE_NOT_EXISTS.getErrorCode(), + ErrorCode.DEVICE_NOT_EXISTS.getErrorMessage()); + } + DeviceDetail device = deviceDetail.get(); + boolean isAdmin = partnerHelper.isPartnerAdmin(authUserDetails().getAuthorities().toString()); + if (!isAdmin) { + Partner partnerDetails = getAssociatedPartner(partnerList, device.getDeviceProviderId(), userId); + partnerHelper.checkIfPartnerIsNotActive(partnerDetails); + } + if (!device.getApprovalStatus().equals(APPROVED)) { + LOGGER.error("Unable to deactivate device with id {}", device.getId()); + throw new PartnerServiceException(ErrorCode.DEVICE_NOT_APPROVED.getErrorCode(), + ErrorCode.DEVICE_NOT_APPROVED.getErrorMessage()); + } + if (device.getApprovalStatus().equals(APPROVED) && !device.getIsActive()) { + LOGGER.error("Unable to deactivate device with id {}", device.getId()); + throw new PartnerServiceException(ErrorCode.DEVICE_ALREADY_DEACTIVATED.getErrorCode(), + ErrorCode.DEVICE_ALREADY_DEACTIVATED.getErrorMessage()); + } + + DeviceDetailResponseDto deviceDetailResponseDto = new DeviceDetailResponseDto(); + + device.setIsActive(false); + device.setUpdDtimes(LocalDateTime.now()); + device.setUpdBy(getUserId()); + DeviceDetail updatedDetail = deviceDetailRepository.save(device); + deviceDetailResponseDto.setDeviceId(updatedDetail.getId()); + deviceDetailResponseDto.setStatus(updatedDetail.getApprovalStatus()); + deviceDetailResponseDto.setActive(updatedDetail.getIsActive()); + + responseWrapper.setResponse(deviceDetailResponseDto); + + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In deactivateDevice method of DeviceDetailServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In deactivateDevice method of DeviceDetailServiceImpl - " + ex.getMessage()); + String errorCode = ErrorCode.DEACTIVATE_DEVICE_ERROR.getErrorCode(); + String errorMessage = ErrorCode.DEACTIVATE_DEVICE_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(patchDeactivateDevice); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + @Override + public ResponseWrapperV2 approveOrRejectMappingDeviceToSbi(String deviceId, SbiAndDeviceMappingRequestDto requestDto) { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + try { + String partnerId = requestDto.getPartnerId(); + String sbiId = requestDto.getSbiId(); + String status = requestDto.getStatus(); + if (Objects.isNull(partnerId) || Objects.isNull(deviceId) || Objects.isNull(status)) { + LOGGER.info("sessionId", "idType", "id", "Partner/Device id does not exist."); + throw new PartnerServiceException(ErrorCode.INVALID_REQUEST_PARAM.getErrorCode(), + ErrorCode.INVALID_REQUEST_PARAM.getErrorMessage()); + } + if (!Set.of(DeviceConstant.APPROVED, DeviceConstant.REJECTED).contains(status)) { + throw new PartnerServiceException(ErrorCode.APPROVE_REJECT_STATUS_CODE.getErrorCode(), + ErrorCode.APPROVE_REJECT_STATUS_CODE.getErrorMessage()); + } + if (Objects.isNull(sbiId)) { + LOGGER.info("sessionId", "idType", "id", "SBI id is null."); + if (status.equals(DeviceConstant.APPROVED)) { + throw new PartnerServiceException(ErrorCode.NO_SBI_FOUND_FOR_APPROVE.getErrorCode(), + ErrorCode.NO_SBI_FOUND_FOR_APPROVE.getErrorMessage()); + } else { + throw new PartnerServiceException(ErrorCode.NO_SBI_FOUND_FOR_REJECT.getErrorCode(), + ErrorCode.NO_SBI_FOUND_FOR_REJECT.getErrorMessage()); + } + } + // validate sbi and device mapping + partnerHelper.validateSbiDeviceMapping(partnerId, sbiId, deviceId); + + DeviceDetailSBI deviceDetailSBI = deviceDetailSbiRepository.findByDeviceProviderIdAndSbiIdAndDeviceDetailId(partnerId, sbiId, deviceId); + if (Objects.isNull(deviceDetailSBI)) { + LOGGER.info("sessionId", "idType", "id", "SBI and Device mapping already exists in DB."); + throw new PartnerServiceException(ErrorCode.SBI_DEVICE_MAPPING_NOT_EXISTS.getErrorCode(), + ErrorCode.SBI_DEVICE_MAPPING_NOT_EXISTS.getErrorMessage()); + } + + UpdateDeviceDetailStatusDto deviceDetails = new UpdateDeviceDetailStatusDto(); + deviceDetails.setId(deviceId); + if (status.equals(DeviceConstant.REJECTED)) { + deviceDetails.setApprovalStatus(DeviceConstant.REJECT); + } else { + deviceDetails.setApprovalStatus(DeviceConstant.APPROVE); + } + updateDeviceDetailStatus(deviceDetails); + + deviceDetailSBI.setIsActive(true); + deviceDetailSBI.setUpdDtimes(Timestamp.valueOf(LocalDateTime.now())); + deviceDetailSBI.setUpdBy(getUserId()); + deviceDetailSbiRepository.save(deviceDetailSBI); + LOGGER.info("sessionId", "idType", "id", "updated device mapping to sbi successfully in Db."); + responseWrapper.setResponse(true); + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In approveOrRejectMappingDeviceToSbi method of DeviceDetailServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In approveOrRejectMappingDeviceToSbi method of DeviceDetailServiceImplN - " + ex.getMessage()); + String errorCode = ErrorCode.APPROVE_OR_REJECT_DEVICE_WITH_SBI_MAPPING_ERROR.getErrorCode(); + String errorMessage = ErrorCode.APPROVE_OR_REJECT_DEVICE_WITH_SBI_MAPPING_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(postApprovalMappingDeviceToSbiId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + public Partner getAssociatedPartner (List partnerList, String deviceProviderId, String userId) { + boolean deviceProviderExist = false; + Partner partnerDetails = null; + for (Partner partner : partnerList) { + if (partner.getId().equals(deviceProviderId)) { + validatePartnerId(partner, userId); + deviceProviderExist = true; + partnerDetails = partner; + break; + } + } + if (!deviceProviderExist) { + LOGGER.info("sessionId", "idType", "id", "Device is not associated with user."); + throw new PartnerServiceException(ErrorCode.DEVICE_NOT_ASSOCIATED_WITH_USER.getErrorCode(), + ErrorCode.DEVICE_NOT_ASSOCIATED_WITH_USER.getErrorMessage()); + } + return partnerDetails; + } + + @Override + public ResponseWrapperV2> getAllDeviceDetails(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, DeviceDetailFilterDto filterDto) { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + try { + PageResponseV2Dto pageResponseV2Dto = new PageResponseV2Dto<>(); + // Pagination + Pageable pageable = PageRequest.of(pageNo, pageSize); + + // Fetch all device details + Page page = getDeviceDetails(sortFieldName, sortType, pageNo, pageSize, filterDto, pageable); + + if (Objects.nonNull(page) && !page.getContent().isEmpty()) { + List deviceDetailSummaryDtoList = MapperUtils.mapAll(page.getContent(), DeviceDetailSummaryDto.class); + pageResponseV2Dto.setPageNo(pageNo); + pageResponseV2Dto.setPageSize(pageSize); + pageResponseV2Dto.setTotalResults(page.getTotalElements()); + pageResponseV2Dto.setData(deviceDetailSummaryDtoList); + } + responseWrapper.setResponse(pageResponseV2Dto); + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In getAllDevices method of DeviceDetailServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In getAllDevices method of DeviceDetailServiceImpl - " + ex.getMessage()); + String errorCode = ErrorCode.GET_ALL_DEVICE_DETAILS_FETCH_ERROR.getErrorCode(); + String errorMessage = ErrorCode.GET_ALL_DEVICE_DETAILS_FETCH_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getAllDeviceDetailsId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + private Page getDeviceDetails(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, DeviceDetailFilterDto filterDto, Pageable pageable) { + //Sorting + if (Objects.nonNull(sortFieldName) && Objects.nonNull(sortType)) { + //sorting handling for the 'status' field + if (sortFieldName.equals("status") && sortType.equalsIgnoreCase(PartnerConstants.ASC)) { + return deviceDetailSummaryRepository. + getSummaryOfAllDeviceDetailsByStatusAsc(filterDto.getPartnerId(), filterDto.getOrgName(), filterDto.getDeviceType(), + filterDto.getDeviceSubType(), filterDto.getStatus(), filterDto.getMake(), filterDto.getModel(), + filterDto.getSbiId(), filterDto.getSbiVersion(), filterDto.getDeviceId(), pageable); + } else if (sortFieldName.equals("status") && sortType.equalsIgnoreCase(PartnerConstants.DESC)) { + return deviceDetailSummaryRepository. + getSummaryOfAllDeviceDetailsByStatusDesc(filterDto.getPartnerId(), filterDto.getOrgName(), filterDto.getDeviceType(), + filterDto.getDeviceSubType(), filterDto.getStatus(), filterDto.getMake(), filterDto.getModel(), + filterDto.getSbiId(), filterDto.getSbiVersion(), filterDto.getDeviceId(), pageable); + } + //Sorting for other fields + Sort sort = partnerHelper.getSortingRequest(getSortColumn(partnerHelper.deviceAliasToColumnMap, sortFieldName), sortType); + pageable = PageRequest.of(pageNo, pageSize, sort); + } + //Default + return deviceDetailSummaryRepository. + getSummaryOfAllDeviceDetails(filterDto.getPartnerId(), filterDto.getOrgName(), filterDto.getDeviceType(), + filterDto.getDeviceSubType(), filterDto.getStatus(), filterDto.getMake(), filterDto.getModel(), + filterDto.getSbiId(), filterDto.getSbiVersion(), filterDto.getDeviceId(), pageable); + } + + public String getSortColumn(Map aliasToColumnMap, String alias) { + return aliasToColumnMap.getOrDefault(alias, alias); // Return alias if no match found + } + + private AuthUserDetails authUserDetails() { + return (AuthUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + } + + private String getUserId() { + String userId = authUserDetails().getUserId(); + return userId; + } + + public static String getCertificateName(String subjectDN) { + String[] parts = subjectDN.split(","); + for (String part : parts) { + if (part.trim().startsWith("CN=")) { + return part.trim().substring(3); + } + } + return BLANK_STRING; + } } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/impl/FTPChipDetailServiceImpl.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/impl/FTPChipDetailServiceImpl.java index 39e0c21088..1f074862c1 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/impl/FTPChipDetailServiceImpl.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/impl/FTPChipDetailServiceImpl.java @@ -5,20 +5,32 @@ import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Base64; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.time.ZoneId; +import java.util.*; +import io.mosip.kernel.core.authmanager.authadapter.model.AuthUserDetails; +import io.mosip.pms.common.dto.PageResponseV2Dto; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.device.authdevice.entity.FtmDetailSummaryEntity; +import io.mosip.pms.device.authdevice.repository.FtmDetailsSummaryRepository; +import io.mosip.pms.device.dto.FtmChipDetailsDto; +import io.mosip.pms.device.dto.FtmChipFilterDto; +import io.mosip.pms.device.response.dto.*; +import io.mosip.pms.partner.constant.PartnerConstants; +import io.mosip.pms.partner.response.dto.FtmCertificateDownloadResponseDto; +import io.mosip.pms.partner.util.MultiPartnerUtil; +import io.mosip.pms.partner.util.PartnerHelper; +import io.mosip.pms.partner.util.PartnerUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.core.io.ByteArrayResource; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.http.MediaType; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; @@ -56,23 +68,19 @@ import io.mosip.pms.device.constant.DeviceConstant; import io.mosip.pms.device.constant.FoundationalTrustProviderErrorMessages; import io.mosip.pms.device.request.dto.DeviceSearchDto; +import io.mosip.pms.device.request.dto.DeactivateFtmRequestDto; import io.mosip.pms.device.request.dto.FtpCertificateRequestDto; import io.mosip.pms.device.request.dto.FtpChipCertDownloadRequestDto; import io.mosip.pms.device.request.dto.FtpChipCertificateRequestDto; import io.mosip.pms.device.request.dto.FtpChipDetailDto; import io.mosip.pms.device.request.dto.FtpChipDetailStatusDto; import io.mosip.pms.device.request.dto.FtpChipDetailUpdateDto; -import io.mosip.pms.device.response.dto.FTPSearchResponseDto; -import io.mosip.pms.device.response.dto.FtpCertDownloadResponeDto; -import io.mosip.pms.device.response.dto.FtpCertificateResponseDto; -import io.mosip.pms.device.response.dto.IdDto; import io.mosip.pms.device.util.AuditUtil; import io.mosip.pms.device.util.DeviceUtil; import io.mosip.pms.partner.constant.ErrorCode; import io.mosip.pms.partner.dto.DataShareResponseDto; import io.mosip.pms.partner.exception.PartnerServiceException; - @Component @Transactional public class FTPChipDetailServiceImpl implements FtpChipDetailService { @@ -102,22 +110,52 @@ public class FTPChipDetailServiceImpl implements FtpChipDetailService { @Autowired PartnerServiceRepository partnerServiceRepository; + + @Autowired + PartnerServiceRepository partnerRepository; + + @Autowired + FtmDetailsSummaryRepository ftmDetailsSummaryRepository; @Autowired private ObjectMapper mapper; + @Autowired + PartnerHelper partnerHelper; + private static final String ERRORS = "errors"; private static final String ERRORCODE = "errorCode"; private static final String ERRORMESSAGE = "message"; - + + public static final String VERSION = "1.0"; + + public static final String APPROVED = "approved"; + + public static final String DEACTIVATED = "deactivated"; + + public static final String PENDING_APPROVAL = "pending_approval"; + + public static final String BLANK_STRING = ""; @Value("${pms.certs.datashare.subscriberId}") private String subscriberId; @Value("${pms.certs.datashare.policyId}") private String policyId; - + + @Value("${mosip.pms.api.id.deactivate.ftm.patch}") + private String patchDeactivateFtm; + + @Value("${mosip.pms.api.id.original.ftm.certificate.get}") + private String getOriginalFtmCertificateId; + + @Value("${mosip.pms.api.id.partners.ftm.chip.details.get}") + private String getPartnersFtmChipDetailsId; + + @Value("${mosip.pms.api.id.ftm.chip.details.get}") + private String getFtmChipDetailsId; + @Autowired private WebSubPublisher webSubPublisher; @@ -138,7 +176,7 @@ public IdDto createFtpChipDetails(FtpChipDetailDto chipDetails) { } FTPChipDetail uniqueChipDetail = ftpChipDetailRepository.findByUniqueKey(chipDetails.getFtpProviderId(), - chipDetails.getMake(), chipDetails.getModel()); + PartnerUtil.trimAndReplace(chipDetails.getMake()), PartnerUtil.trimAndReplace(chipDetails.getModel())); if(uniqueChipDetail != null){ auditUtil.auditRequest( String.format( @@ -299,6 +337,14 @@ public FtpCertificateResponseDto uploadCertificate(FtpChipCertificateRequestDto FoundationalTrustProviderErrorMessages.FTP_CHIP_ID_PROVIDER_ID_NOT_MATCHED.getErrorMessage()); } + if (!chipDetail.get().getApprovalStatus().equals(APPROVED) && !chipDetail.get().getApprovalStatus().equals(CommonConstant.PENDING_CERT_UPLOAD)){ + throw new RequestException(FoundationalTrustProviderErrorMessages.INVALID_FTP_CHIP_STATUS.getErrorCode(), + FoundationalTrustProviderErrorMessages.INVALID_FTP_CHIP_STATUS.getErrorMessage()); + } + if (chipDetail.get().getApprovalStatus().equals(APPROVED) && !chipDetail.get().isActive()){ + throw new RequestException(FoundationalTrustProviderErrorMessages.FTP_CHIP_DEACTIVATED.getErrorCode(), + FoundationalTrustProviderErrorMessages.FTP_CHIP_DEACTIVATED.getErrorMessage()); + } FtpCertificateRequestDto certRequest = new FtpCertificateRequestDto(); certRequest.setCertificateData(ftpChipCertRequestDto.getCertificateData()); certRequest.setOrganizationName(ftpChipCertRequestDto.getOrganizationName()); @@ -308,9 +354,12 @@ public FtpCertificateResponseDto uploadCertificate(FtpChipCertificateRequestDto RequestWrapper request = new RequestWrapper<>(); request.setRequest(certRequest); Map uploadApiResponse = restUtil.postApi(environment.getProperty("pmp.partner.certificaticate.upload.rest.uri"), null, "", "", - MediaType.APPLICATION_JSON, request, Map.class); - FtpCertificateResponseDto responseObject = mapper.readValue(mapper.writeValueAsString(uploadApiResponse.get("response")), FtpCertificateResponseDto.class); - if(responseObject == null && uploadApiResponse.containsKey(ERRORS)) { + MediaType.APPLICATION_JSON, request, Map.class); + if(uploadApiResponse == null) { + throw new ApiAccessibleException(ApiAccessibleExceptionConstant.API_NULL_RESPONSE_EXCEPTION.getErrorCode(), + ApiAccessibleExceptionConstant.API_NULL_RESPONSE_EXCEPTION.getErrorMessage()); + } + if(uploadApiResponse.containsKey(ERRORS) && uploadApiResponse.get(ERRORS) != null) { List> certServiceErrorList = (List>) uploadApiResponse.get(ERRORS); if(!certServiceErrorList.isEmpty()) { throw new ApiAccessibleException(certServiceErrorList.get(0).get(ERRORCODE).toString(),certServiceErrorList.get(0).get(ERRORMESSAGE).toString()); @@ -319,11 +368,7 @@ public FtpCertificateResponseDto uploadCertificate(FtpChipCertificateRequestDto ApiAccessibleExceptionConstant.UNABLE_TO_PROCESS.getErrorMessage()); } } - if(responseObject == null) { - throw new ApiAccessibleException(ApiAccessibleExceptionConstant.API_NULL_RESPONSE_EXCEPTION.getErrorCode(), - ApiAccessibleExceptionConstant.API_NULL_RESPONSE_EXCEPTION.getErrorMessage()); - } - + FtpCertificateResponseDto responseObject = mapper.readValue(mapper.writeValueAsString(uploadApiResponse.get("response")), FtpCertificateResponseDto.class); FTPChipDetail updateObject = chipDetail.get(); updateObject.setCertificateAlias(responseObject.getCertificateId()); Authentication authN = SecurityContextHolder.getContext().getAuthentication(); @@ -331,6 +376,7 @@ public FtpCertificateResponseDto uploadCertificate(FtpChipCertificateRequestDto updateObject.setUpdBy(authN.getName()); } updateObject.setApprovalStatus(CommonConstant.PENDING_APPROVAL); + updateObject.setActive(false); updateObject.setUpdDtimes(LocalDateTime.now()); ftpChipDetailRepository.save(updateObject); try { @@ -374,11 +420,12 @@ public FtpCertDownloadResponeDto getCertificate(FtpChipCertDownloadRequestDto ce FoundationalTrustProviderErrorMessages.FTP_CERT_NOT_UPLOADED.getErrorMessage()); } + FtpCertDownloadResponeDto responseObject = null; Map pathsegments = new HashMap<>(); pathsegments.put("partnerCertId", chipDetail.get().getCertificateAlias()); Map getApiResponse = restUtil.getApi(environment.getProperty("pmp.partner.certificaticate.get.rest.uri"), pathsegments, Map.class); - FtpCertDownloadResponeDto responseObject = mapper.readValue(mapper.writeValueAsString(getApiResponse.get("response")), FtpCertDownloadResponeDto.class); - if(responseObject == null && getApiResponse.containsKey(ERRORS)) { + + if(getApiResponse.get("response") == null && getApiResponse.containsKey(ERRORS)) { List> certServiceErrorList = (List>) getApiResponse.get(ERRORS); if(!certServiceErrorList.isEmpty()) { throw new ApiAccessibleException(certServiceErrorList.get(0).get(ERRORCODE).toString(),certServiceErrorList.get(0).get(ERRORMESSAGE).toString()); @@ -387,11 +434,11 @@ public FtpCertDownloadResponeDto getCertificate(FtpChipCertDownloadRequestDto ce ApiAccessibleExceptionConstant.UNABLE_TO_PROCESS.getErrorMessage()); } } - if(responseObject == null) { + if(getApiResponse.get("response") == null) { throw new ApiAccessibleException(ApiAccessibleExceptionConstant.API_NULL_RESPONSE_EXCEPTION.getErrorCode(), ApiAccessibleExceptionConstant.API_NULL_RESPONSE_EXCEPTION.getErrorMessage()); } - + responseObject = mapper.readValue(mapper.writeValueAsString(getApiResponse.get("response")), FtpCertDownloadResponeDto.class); return responseObject; } @@ -500,4 +547,317 @@ private void notify(String certData, String partnerDomain) { data.put("partnerDomain", partnerDomain); webSubPublisher.notify(EventType.CA_CERTIFICATE_UPLOADED, data, type); } + + @Override + public ResponseWrapperV2 deactivateFtm(String ftmId, DeactivateFtmRequestDto requestDto) { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + try { + String status = requestDto.getStatus(); + if (Objects.isNull(status) || status.equals(BLANK_STRING) || !status.equals(PartnerConstants.DEACTIVATE)) { + LOGGER.info(status + " : is Invalid Input Parameter, it should be (De-Activate)"); + throw new PartnerServiceException(ErrorCode.DEACTIVATE_STATUS_CODE.getErrorCode(), + ErrorCode.DEACTIVATE_STATUS_CODE.getErrorMessage()); + } + String userId = getUserId(); + List partnerList = partnerRepository.findByUserId(userId); + if (partnerList.isEmpty()) { + LOGGER.info("sessionId", "idType", "id", "User id does not exist."); + throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); + } + validateFtmId(ftmId); + Optional ftmChipDetail = ftpChipDetailRepository.findById(ftmId); + validateFtmChipDetail(ftmChipDetail); + + FTPChipDetail ftm = ftmChipDetail.get(); + + boolean isAdmin = partnerHelper.isPartnerAdmin(authUserDetails().getAuthorities().toString()); + if(!isAdmin){ + Partner partnerDetails = getAssociatedPartner(partnerList, ftm, userId); + partnerHelper.checkIfPartnerIsNotActive(partnerDetails); + } + + if (!ftm.getApprovalStatus().equals(APPROVED)) { + LOGGER.error("Unable to deactivate FTM with id {}", ftm.getFtpChipDetailId()); + throw new PartnerServiceException(ErrorCode.FTM_NOT_APPROVED.getErrorCode(), + ErrorCode.FTM_NOT_APPROVED.getErrorMessage()); + } + if (ftm.getApprovalStatus().equals(APPROVED) && !ftm.isActive()) { + LOGGER.error("Unable to deactivate FTM with id {}", ftm.getFtpChipDetailId()); + throw new PartnerServiceException(ErrorCode.FTM_ALREADY_DEACTIVATED.getErrorCode(), + ErrorCode.FTM_ALREADY_DEACTIVATED.getErrorMessage()); + } + FtmDetailResponseDto ftmDetailResponseDto = new FtmDetailResponseDto(); + + ftm.setActive(false); + ftm.setUpdDtimes(LocalDateTime.now()); + ftm.setUpdBy(getUserId()); + FTPChipDetail updatedDetail = ftpChipDetailRepository.save(ftm); + ftmDetailResponseDto.setFtmId(updatedDetail.getFtpChipDetailId()); + ftmDetailResponseDto.setStatus(updatedDetail.getApprovalStatus()); + ftmDetailResponseDto.setActive(updatedDetail.isActive()); + + responseWrapper.setResponse(ftmDetailResponseDto); + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In deactivateFtm method of FTPChipDetailServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In deactivateFtm method of FTPChipDetailServiceImpl - " + ex.getMessage()); + String errorCode = ErrorCode.DEACTIVATE_FTM_ERROR.getErrorCode(); + String errorMessage = ErrorCode.DEACTIVATE_FTM_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(patchDeactivateFtm); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + @Override + public ResponseWrapperV2 getFtmCertificateData(String ftmId) { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + try { + String userId = getUserId(); + List partnerList = partnerRepository.findByUserId(userId); + if (partnerList.isEmpty()) { + LOGGER.error("sessionId", "idType", "id", "User id does not exists."); + throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); + } + validateFtmId(ftmId); + Optional ftmChipDetail = ftpChipDetailRepository.findById(ftmId); + validateFtmChipDetail(ftmChipDetail); + + FTPChipDetail ftm = ftmChipDetail.get(); + + boolean isAdmin = partnerHelper.isPartnerAdmin(authUserDetails().getAuthorities().toString()); + if(!isAdmin){ + Partner partnerDetails = getAssociatedPartner(partnerList, ftm, userId); + partnerHelper.checkIfPartnerIsNotActive(partnerDetails); + } + + if (!(ftm.getApprovalStatus().equals(PENDING_APPROVAL) || ftm.getApprovalStatus().equals(APPROVED))) { + LOGGER.error("Unable to download original FTM certificate with id {}", ftm.getFtpChipDetailId()); + throw new PartnerServiceException(ErrorCode.DOWNLOAD_CERTIFICATE_FTM_INVALID_STATUS.getErrorCode(), + ErrorCode.DOWNLOAD_CERTIFICATE_FTM_INVALID_STATUS.getErrorMessage()); + } + if (ftm.getApprovalStatus().equals(APPROVED) && !ftm.isActive()) { + LOGGER.error("Unable to download original FTM certificate with id {}", ftm.getFtpChipDetailId()); + throw new PartnerServiceException(ErrorCode.DOWNLOAD_CERTIFICATE_FTM_DEACTIVATED_ERROR.getErrorCode(), + ErrorCode.DOWNLOAD_CERTIFICATE_FTM_DEACTIVATED_ERROR.getErrorMessage()); + } + + // Download only if the FTM is approved or pending_approval status. + FtmCertificateDownloadResponseDto responseObject = null; + responseObject = partnerHelper.getCertificate(ftm.getCertificateAlias(), "pmp.partner.original.certificate.get.rest.uri", FtmCertificateDownloadResponseDto.class); + partnerHelper.populateFtmCertificateExpiryState(responseObject); + responseWrapper.setResponse(responseObject); + } catch (ApiAccessibleException ex) { + LOGGER.info("sessionId", "idType", "id", "In getFtmCertificateData method of FTPChipDetailServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In getFtmCertificateData method of FTPChipDetailServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In getFtmCertificateData method of FTPChipDetailServiceImpl - " + ex.getMessage()); + String errorCode = ErrorCode.UNABLE_TO_DOWNLOAD_ORIGINAL_FTM_CERTIFICATE.getErrorCode(); + String errorMessage = ErrorCode.UNABLE_TO_DOWNLOAD_ORIGINAL_FTM_CERTIFICATE.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getOriginalFtmCertificateId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + @Override + public ResponseWrapperV2> getPartnersFtmChipDetails(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, FtmChipFilterDto filterDto) { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + try { + PageResponseV2Dto pageResponseV2Dto = new PageResponseV2Dto(); + // Pagination + Pageable pageable = PageRequest.of(pageNo, pageSize); + + // Fetch the FTM chip details + Page page = getFtmChipDetails(sortFieldName, sortType, pageNo, pageSize, filterDto, pageable); + if (Objects.nonNull(page) && !page.getContent().isEmpty()) { + List ftmDetailSummaryDtoList = MapperUtils.mapAll(page.getContent(), FtmDetailSummaryDto.class); + pageResponseV2Dto.setPageNo(pageNo); + pageResponseV2Dto.setPageSize(pageSize); + pageResponseV2Dto.setTotalResults(page.getTotalElements()); + pageResponseV2Dto.setData(ftmDetailSummaryDtoList); + } + responseWrapper.setResponse(pageResponseV2Dto); + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In getPartnersFtmChipDetails method of FTPChipDetailServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In getPartnersFtmChipDetails method of FTPChipDetailServiceImpl - " + ex.getMessage()); + String errorCode = ErrorCode.FTM_CHIP_DETAILS_LIST_FETCH_ERROR.getErrorCode(); + String errorMessage = ErrorCode.FTM_CHIP_DETAILS_LIST_FETCH_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getPartnersFtmChipDetailsId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + private Page getFtmChipDetails(String sortFieldName, String sortType, Integer pageNo, + Integer pageSize, FtmChipFilterDto filterDto, Pageable pageable) { + //Sorting + if (Objects.nonNull(sortFieldName) && Objects.nonNull(sortType)) { + //sorting handling for the 'status' field + if (sortFieldName.equals("status") && sortType.equalsIgnoreCase(PartnerConstants.ASC)) { + return ftmDetailsSummaryRepository. + getSummaryOfPartnersFtmDetailsByStatusAsc(filterDto.getPartnerId(), filterDto.getOrgName(), + filterDto.getFtmId(), filterDto.getMake(), filterDto.getModel(), filterDto.getStatus(), pageable); + } else if (sortFieldName.equals("status") && sortType.equalsIgnoreCase(PartnerConstants.DESC)) { + return ftmDetailsSummaryRepository. + getSummaryOfPartnersFtmDetailsByStatusDesc(filterDto.getPartnerId(), filterDto.getOrgName(), + filterDto.getFtmId(), filterDto.getMake(), filterDto.getModel(), filterDto.getStatus(), pageable); + } + //Sorting for other fields + Sort sort = partnerHelper.getSortingRequest(getSortColumn(partnerHelper.ftmAliasToColumnMap, sortFieldName), sortType); + pageable = PageRequest.of(pageNo, pageSize, sort); + } + //Default + return ftmDetailsSummaryRepository.getSummaryOfPartnersFtmDetails(filterDto.getPartnerId(), filterDto.getOrgName(), + filterDto.getFtmId(), filterDto.getMake(), filterDto.getModel(), filterDto.getStatus(), pageable); + } + + @Override + public ResponseWrapperV2> ftmChipDetail() { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + try { + String userId = getUserId(); + List partnerList = partnerRepository.findByUserId(userId); + List ftmChipDetailsDtoList = new ArrayList<>(); + if (!partnerList.isEmpty()) { + for (Partner partner : partnerList) { + if (partnerHelper.checkIfPartnerIsFtmPartner(partner)) { + partnerHelper.validatePartnerId(partner, userId); + String partnerStatus = getPartnerStatus(partner); + List ftpChipDetailList = ftpChipDetailRepository.findByProviderId(partner.getId()); + if(!ftpChipDetailList.isEmpty()) { + for(FTPChipDetail ftpChipDetail: ftpChipDetailList) { + FtmChipDetailsDto ftmChipDetailsDto = new FtmChipDetailsDto(); + // Get certificate data if available + if (ftpChipDetail.getCertificateAlias() != null) { + ftmChipDetailsDto.setIsCertificateAvailable(true); + FtmCertificateDownloadResponseDto responseObject = partnerHelper.getCertificate(ftpChipDetail.getCertificateAlias(), "pmp.partner.original.certificate.get.rest.uri", FtmCertificateDownloadResponseDto.class); + partnerHelper.populateFtmCertificateExpiryState(responseObject); + ftmChipDetailsDto.setCertificateUploadDateTime(responseObject.getMosipSignedCertUploadDateTime()); + ftmChipDetailsDto.setCertificateExpiryDateTime(responseObject.getCaSignedCertExpiryDateTime()); + ftmChipDetailsDto.setIsCertificateExpired(responseObject.getIsCaSignedCertificateExpired()); + } else { + ftmChipDetailsDto.setIsCertificateAvailable(false); + ftmChipDetailsDto.setIsCertificateExpired(false); + } + ftmChipDetailsDto.setFtmId(ftpChipDetail.getFtpChipDetailId()); + ftmChipDetailsDto.setPartnerId(ftpChipDetail.getFtpProviderId()); + ftmChipDetailsDto.setPartnerStatus(partnerStatus); + ftmChipDetailsDto.setMake(ftpChipDetail.getMake()); + ftmChipDetailsDto.setModel(ftpChipDetail.getModel()); + ftmChipDetailsDto.setStatus(ftpChipDetail.getApprovalStatus()); + ftmChipDetailsDto.setIsActive(ftpChipDetail.isActive()); + ftmChipDetailsDto.setCreatedDateTime(ftpChipDetail.getCrDtimes()); + ftmChipDetailsDtoList.add(ftmChipDetailsDto); + } + } + } + } + } + responseWrapper.setResponse(ftmChipDetailsDtoList); + } catch (ApiAccessibleException ex) { + LOGGER.info("sessionId", "idType", "id", "In ftmChipDetails method of FTPChipDetailServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In ftmChipDetail method of FTPChipDetailServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In ftmChipDetail method of FTPChipDetailServiceImpl - " + ex.getMessage()); + String errorCode = ErrorCode.FTM_CHIP_DETAILS_LIST_FETCH_ERROR.getErrorCode(); + String errorMessage = ErrorCode.FTM_CHIP_DETAILS_LIST_FETCH_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getFtmChipDetailsId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + public String getPartnerStatus(Partner partner) { + if(partner.getApprovalStatus().equals(APPROVED) && partner.getIsActive()) { + return APPROVED; + } else if (partner.getApprovalStatus().equals(APPROVED) && !partner.getIsActive()) { + return DEACTIVATED; + } else { + return partner.getApprovalStatus(); + } + } + + public String getSortColumn(Map aliasToColumnMap, String alias) { + return aliasToColumnMap.getOrDefault(alias, alias); // Return alias if no match found + } + + public static void validateFtmId(String ftmId) { + if (Objects.isNull(ftmId) || ftmId.equals(BLANK_STRING)) { + LOGGER.info("sessionId", "idType", "id", "FTM id is null or empty."); + throw new PartnerServiceException(ErrorCode.INVALID_FTM_ID.getErrorCode(), + ErrorCode.INVALID_FTM_ID.getErrorMessage()); + } + } + + public static void validateFtmChipDetail(Optional ftmChipDetail) { + if (!ftmChipDetail.isPresent()) { + LOGGER.error("FTM Details not exists"); + throw new PartnerServiceException(ErrorCode.FTM_NOT_EXISTS.getErrorCode(), + ErrorCode.FTM_NOT_EXISTS.getErrorMessage()); + } + } + + public Partner getAssociatedPartner(List partnerList, FTPChipDetail ftm, String userId) { + String ftmProviderId = ftm.getFtpProviderId(); + boolean ftmProviderExist = false; + Partner partnerDetails = null; + + for (Partner partner : partnerList) { + if (partner.getId().equals(ftmProviderId)) { + validatePartnerId(partner, userId); + ftmProviderExist = true; + partnerDetails = partner; + break; + } + } + + if (!ftmProviderExist) { + LOGGER.info("sessionId", "idType", "id", "FTM is not associated with user."); + throw new PartnerServiceException(ErrorCode.FTM_NOT_ASSOCIATED_WITH_USER.getErrorCode(), + ErrorCode.FTM_NOT_ASSOCIATED_WITH_USER.getErrorMessage()); + } + + return partnerDetails; + } + + public static void validatePartnerId(Partner partner, String userId) { + if (Objects.isNull(partner.getId()) || partner.getId().equals(BLANK_STRING)) { + LOGGER.info("Partner Id is null or empty for user id : " + userId); + throw new PartnerServiceException(ErrorCode.PARTNER_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.PARTNER_ID_NOT_EXISTS.getErrorMessage()); + } + } + + private AuthUserDetails authUserDetails() { + return (AuthUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + } + + private String getUserId() { + String userId = authUserDetails().getUserId(); + return userId; + } } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/impl/SecureBiometricInterfaceServiceImpl.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/impl/SecureBiometricInterfaceServiceImpl.java index 32ccaa6654..255284ac23 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/impl/SecureBiometricInterfaceServiceImpl.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/authdevice/service/impl/SecureBiometricInterfaceServiceImpl.java @@ -8,10 +8,34 @@ import java.util.List; import java.util.Optional; import java.util.UUID; +import java.util.Objects; +import java.util.Map; import java.util.stream.Collectors; +import io.mosip.kernel.core.authmanager.authadapter.model.AuthUserDetails; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.common.util.MapperUtils; +import io.mosip.pms.common.util.PMSLogger; +import io.mosip.pms.device.authdevice.entity.SbiSummaryEntity; +import io.mosip.pms.device.authdevice.repository.SbiSummaryRepository; +import io.mosip.pms.device.dto.SbiFilterDto; +import io.mosip.pms.device.util.DeviceUtil; +import io.mosip.pms.partner.constant.ErrorCode; +import io.mosip.pms.partner.constant.PartnerConstants; +import io.mosip.pms.partner.dto.DeviceDto; +import io.mosip.pms.device.dto.SbiDetailsDto; +import io.mosip.pms.partner.exception.PartnerServiceException; +import io.mosip.pms.device.response.dto.SbiDetailsResponseDto; +import io.mosip.pms.partner.util.MultiPartnerUtil; +import io.mosip.pms.partner.util.PartnerHelper; +import io.mosip.pms.partner.util.PartnerUtil; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; @@ -24,6 +48,7 @@ import io.mosip.pms.common.dto.FilterValueDto; import io.mosip.pms.common.dto.PageResponseDto; import io.mosip.pms.common.dto.SearchFilter; +import io.mosip.pms.common.dto.PageResponseV2Dto; import io.mosip.pms.common.entity.DeviceDetailSBI; import io.mosip.pms.common.entity.DeviceDetailSBIPK; import io.mosip.pms.common.entity.Partner; @@ -37,9 +62,11 @@ import io.mosip.pms.device.authdevice.entity.DeviceDetail; import io.mosip.pms.device.authdevice.entity.SecureBiometricInterface; import io.mosip.pms.device.authdevice.entity.SecureBiometricInterfaceHistory; +import io.mosip.pms.device.authdevice.entity.RegistrationDeviceSubType; import io.mosip.pms.device.authdevice.repository.DeviceDetailRepository; import io.mosip.pms.device.authdevice.repository.SecureBiometricInterfaceHistoryRepository; import io.mosip.pms.device.authdevice.repository.SecureBiometricInterfaceRepository; +import io.mosip.pms.device.authdevice.repository.RegistrationDeviceSubTypeRepository; import io.mosip.pms.device.authdevice.service.SecureBiometricInterfaceService; import io.mosip.pms.device.constant.DeviceConstant; import io.mosip.pms.device.constant.DeviceDetailExceptionsConstant; @@ -49,20 +76,49 @@ import io.mosip.pms.device.request.dto.SecureBiometricInterfaceCreateDto; import io.mosip.pms.device.request.dto.SecureBiometricInterfaceStatusUpdateDto; import io.mosip.pms.device.request.dto.SecureBiometricInterfaceUpdateDto; +import io.mosip.pms.device.request.dto.DeviceDetailDto; +import io.mosip.pms.device.request.dto.DeactivateSbiRequestDto; import io.mosip.pms.device.response.dto.ColumnCodeValue; import io.mosip.pms.device.response.dto.FilterResponseCodeDto; import io.mosip.pms.device.response.dto.IdDto; import io.mosip.pms.device.response.dto.MappedDeviceDetailsReponse; import io.mosip.pms.device.response.dto.SbiSearchResponseDto; +import io.mosip.pms.device.response.dto.SbiSummaryDto; import io.mosip.pms.device.util.AuditUtil; @Component @Transactional -public class SecureBiometricInterfaceServiceImpl implements SecureBiometricInterfaceService { - +public class SecureBiometricInterfaceServiceImpl implements SecureBiometricInterfaceService { + + private static final Logger LOGGER = PMSLogger.getLogger(SecureBiometricInterfaceServiceImpl.class); + public static final String BLANK_STRING = ""; + public static final String VERSION = "1.0"; + public static final String DEVICE_PROVIDER = "Device_Provider"; + public static final String APPROVED = "approved"; + public static final String REJECTED = "rejected"; + public static final String PENDING_APPROVAL = "pending_approval"; + + @Value("${mosip.pms.api.id.sbi.devices.get}") + private String getSbiDevicesId; + + @Value("${mosip.pms.api.id.deactivate.sbi.patch}") + private String patchDeactivateSbi; + + @Value("${mosip.pms.api.id.all.sbi.details.get}") + private String getAllSbiDetails; + + @Value("${mosip.pms.api.id.sbi.details.get}") + private String getSbiDetailsId; + + @Value("${mosip.pms.api.id.add.device.to.sbi.id.post}") + private String postAddDeviceToSbi; + @Autowired DeviceDetailRepository deviceDetailRepository; + @Autowired + RegistrationDeviceSubTypeRepository registrationDeviceSubTypeRepository; + @Autowired AuditUtil auditUtil; @@ -84,12 +140,24 @@ public class SecureBiometricInterfaceServiceImpl implements SecureBiometricInter @Autowired DeviceDetailSbiRepository deviceDetailSbiRepository; + @Autowired + SbiSummaryRepository sbiSummaryRepository; + @Autowired FilterColumnValidator filterColumnValidator; @Autowired FilterHelper filterHelper; + @Autowired + PartnerHelper partnerHelper; + + @Value("${mosip.pms.expiry.date.max.year}") + private int maxAllowedExpiryYear; + + @Value("${mosip.pms.created.date.max.year}") + private int maxAllowedCreatedYear; + @Override public IdDto createSecureBiometricInterface(SecureBiometricInterfaceCreateDto sbiDto) { @@ -110,7 +178,7 @@ public IdDto createSecureBiometricInterface(SecureBiometricInterfaceCreateDto sb throw new RequestException(DeviceDetailExceptionsConstant.DEVICE_PROVIDER_NOT_FOUND.getErrorCode(), DeviceDetailExceptionsConstant.DEVICE_PROVIDER_NOT_FOUND.getErrorMessage()); } - List existsRecordsFromDb = sbiRepository.findByProviderIdAndSwVersion(sbiDto.getProviderId(), sbiDto.getSwVersion()); + List existsRecordsFromDb = sbiRepository.findByProviderIdAndSwVersion(sbiDto.getProviderId(), PartnerUtil.trimAndReplace(sbiDto.getSwVersion())); if(existsRecordsFromDb.size() > 0) { auditUtil.auditRequest( String.format(DeviceConstant.FAILURE_CREATE, SecureBiometricInterface.class.getCanonicalName()), @@ -268,6 +336,32 @@ public String updateSecureBiometricInterfaceStatus( String.format(SecureBiometricInterfaceConstant.SBI_NOT_FOUND.getErrorMessage(), secureBiometricInterfaceDto.getId())); } + if (entity.getApprovalStatus().equals(DeviceConstant.APPROVED) && entity.isActive()) { + auditUtil.auditRequest( + String.format(DeviceConstant.FAILURE_UPDATE, SecureBiometricInterface.class.getCanonicalName()), + DeviceConstant.AUDIT_SYSTEM, + String.format(DeviceConstant.FAILURE_DESC, + SecureBiometricInterfaceConstant.SBI_ALREADY_APPROVED.getErrorCode(), + String.format(SecureBiometricInterfaceConstant.SBI_ALREADY_APPROVED.getErrorMessage(), + secureBiometricInterfaceDto.getId())), + "AUT-016", secureBiometricInterfaceDto.getId(), "sbiId"); + throw new RequestException(SecureBiometricInterfaceConstant.SBI_ALREADY_APPROVED.getErrorCode(), + String.format(SecureBiometricInterfaceConstant.SBI_ALREADY_APPROVED.getErrorMessage(), + secureBiometricInterfaceDto.getId())); + } + if (entity.getApprovalStatus().equals(DeviceConstant.REJECTED)) { + auditUtil.auditRequest( + String.format(DeviceConstant.FAILURE_UPDATE, SecureBiometricInterface.class.getCanonicalName()), + DeviceConstant.AUDIT_SYSTEM, + String.format(DeviceConstant.FAILURE_DESC, + SecureBiometricInterfaceConstant.SBI_ALREADY_REJECTED.getErrorCode(), + String.format(SecureBiometricInterfaceConstant.SBI_ALREADY_REJECTED.getErrorMessage(), + secureBiometricInterfaceDto.getId())), + "AUT-016", secureBiometricInterfaceDto.getId(), "sbiId"); + throw new RequestException(SecureBiometricInterfaceConstant.SBI_ALREADY_REJECTED.getErrorCode(), + String.format(SecureBiometricInterfaceConstant.SBI_ALREADY_REJECTED.getErrorMessage(), + secureBiometricInterfaceDto.getId())); + } Authentication authN = SecurityContextHolder.getContext().getAuthentication(); if (!EmptyCheckUtils.isNullEmpty(authN)) { @@ -354,20 +448,22 @@ private List mapSbiResponse(List * @param toDate */ private void validateDates(LocalDateTime fromDate, LocalDateTime toDate) { - if (toDate.isBefore(fromDate)) { + // Check if fromDate is in the future + if (fromDate.toLocalDate().isAfter(LocalDate.now())) { auditUtil.auditRequest( String.format(DeviceConstant.FAILURE_CREATE, SecureBiometricInterface.class.getCanonicalName()), DeviceConstant.AUDIT_SYSTEM, String.format(DeviceConstant.FAILURE_DESC, - SecureBiometricInterfaceConstant.SWCREATEDDATE_SHOULD_BE_LESSTHAN_EXPIRYDATE.getErrorCode(), - SecureBiometricInterfaceConstant.SWCREATEDDATE_SHOULD_BE_LESSTHAN_EXPIRYDATE + SecureBiometricInterfaceConstant.SWCREATEDDATE_SHOULD_BE_PAST_OR_TODAY.getErrorCode(), + SecureBiometricInterfaceConstant.SWCREATEDDATE_SHOULD_BE_PAST_OR_TODAY .getErrorMessage()), "AUT-015"); throw new RequestException( - SecureBiometricInterfaceConstant.SWCREATEDDATE_SHOULD_BE_LESSTHAN_EXPIRYDATE.getErrorCode(), - SecureBiometricInterfaceConstant.SWCREATEDDATE_SHOULD_BE_LESSTHAN_EXPIRYDATE.getErrorMessage()); + SecureBiometricInterfaceConstant.SWCREATEDDATE_SHOULD_BE_PAST_OR_TODAY.getErrorCode(), + SecureBiometricInterfaceConstant.SWCREATEDDATE_SHOULD_BE_PAST_OR_TODAY.getErrorMessage()); } - if (toDate.toLocalDate().isBefore(LocalDate.now())) { + // Check if toDate is before or on today's date + if (toDate.toLocalDate().isBefore(LocalDate.now()) || toDate.toLocalDate().isEqual(LocalDate.now())) { auditUtil.auditRequest( String.format(DeviceConstant.FAILURE_CREATE, SecureBiometricInterface.class.getCanonicalName()), DeviceConstant.AUDIT_SYSTEM, @@ -380,6 +476,34 @@ private void validateDates(LocalDateTime fromDate, LocalDateTime toDate) { SecureBiometricInterfaceConstant.EXPIRYDATE_SHOULD_BE_GREATERTHAN_TODAYSDATE.getErrorCode(), SecureBiometricInterfaceConstant.EXPIRYDATE_SHOULD_BE_GREATERTHAN_TODAYSDATE.getErrorMessage()); } + // Check if fromDate is less than 10 years from today + LocalDate maxCreatedYear = LocalDate.now().minusYears(maxAllowedCreatedYear); + if (fromDate.toLocalDate().isBefore(maxCreatedYear)) { + auditUtil.auditRequest( + String.format(DeviceConstant.FAILURE_CREATE, SecureBiometricInterface.class.getCanonicalName()), + DeviceConstant.AUDIT_SYSTEM, + String.format(DeviceConstant.FAILURE_DESC, + SecureBiometricInterfaceConstant.CREATEDDATE_SHOULD_NOT_BE_LESS_THAN_TEN_YEARS.getErrorCode(), + SecureBiometricInterfaceConstant.CREATEDDATE_SHOULD_NOT_BE_LESS_THAN_TEN_YEARS.getErrorMessage(), maxAllowedCreatedYear), + "AUT-015"); + throw new RequestException( + SecureBiometricInterfaceConstant.CREATEDDATE_SHOULD_NOT_BE_LESS_THAN_TEN_YEARS.getErrorCode(), + String.format(SecureBiometricInterfaceConstant.CREATEDDATE_SHOULD_NOT_BE_LESS_THAN_TEN_YEARS.getErrorMessage(), maxAllowedCreatedYear)); + } + // Check if toDate is more than 10 years from today + LocalDate maxExpiryYear = LocalDate.now().plusYears(maxAllowedExpiryYear); + if (toDate.toLocalDate().isAfter(maxExpiryYear)) { + auditUtil.auditRequest( + String.format(DeviceConstant.FAILURE_CREATE, SecureBiometricInterface.class.getCanonicalName()), + DeviceConstant.AUDIT_SYSTEM, + String.format(DeviceConstant.FAILURE_DESC, + SecureBiometricInterfaceConstant.EXPIRYDATE_SHOULD_NOT_BE_GREATER_THAN_TEN_YEARS.getErrorCode(), + SecureBiometricInterfaceConstant.EXPIRYDATE_SHOULD_NOT_BE_GREATER_THAN_TEN_YEARS.getErrorMessage(), maxAllowedExpiryYear), + "AUT-015"); + throw new RequestException( + SecureBiometricInterfaceConstant.EXPIRYDATE_SHOULD_NOT_BE_GREATER_THAN_TEN_YEARS.getErrorCode(), + String.format(SecureBiometricInterfaceConstant.EXPIRYDATE_SHOULD_NOT_BE_GREATER_THAN_TEN_YEARS.getErrorMessage(), maxAllowedExpiryYear)); + } } @Override @@ -445,6 +569,17 @@ public String mapDeviceDetailAndSbi(DeviceDetailSBIMappingDto input) { throw new RequestException(SecureBiometricInterfaceConstant.SBI_NOT_APPROVED.getErrorCode(), String.format(SecureBiometricInterfaceConstant.SBI_NOT_APPROVED.getErrorMessage(), input.getSbiId())); } + if (validSbi.getSwExpiryDateTime().toLocalDate().isBefore(LocalDate.now())) { + auditUtil.auditRequest( + String.format(DeviceConstant.FAILURE_UPDATE, SecureBiometricInterface.class.getCanonicalName()), + DeviceConstant.AUDIT_SYSTEM, + String.format(DeviceConstant.FAILURE_DESC, + SecureBiometricInterfaceConstant.SBI_NOT_FOUND.getErrorCode(), String.format( + SecureBiometricInterfaceConstant.SBI_NOT_FOUND.getErrorMessage(), input.getSbiId())), + "AUT-016", input.getSbiId(), "sbiId"); + throw new RequestException(SecureBiometricInterfaceConstant.SBI_EXPIRED.getErrorCode(), + String.format(SecureBiometricInterfaceConstant.SBI_EXPIRED.getErrorMessage(), input.getSbiId())); + } if(!validDeviceDetail.getDeviceProviderId().equals(validSbi.getProviderId())) { auditUtil.auditRequest( String.format(DeviceConstant.FAILURE_UPDATE, SecureBiometricInterface.class.getCanonicalName()), @@ -562,4 +697,475 @@ public FilterResponseCodeDto filterValues(FilterValueDto filterValueDto) { } return filterResponseDto; } + + @Override + public ResponseWrapperV2 addDeviceToSbi(DeviceDetailDto deviceDetailDto, String sbiId) { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + String deviceId = null; + try { + String partnerId = deviceDetailDto.getDeviceProviderId(); + String userId = getUserId(); + List partnerList = partnerRepository.findByUserId(userId); + if (partnerList.isEmpty()) { + LOGGER.info("sessionId", "idType", "id", "User id does not exist."); + throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); + } + // check if partnerId is associated with user + boolean partnerIdExists = false; + String partnerOrgname = BLANK_STRING; + for (Partner partner : partnerList) { + if (partner.getId().equals(partnerId)) { + partnerHelper.validatePartnerId(partner, userId); + partnerIdExists = true; + partnerOrgname = partner.getName(); + break; + } + } + if (!partnerIdExists) { + LOGGER.info("sessionId", "idType", "id", "Partner id is not associated with user."); + throw new PartnerServiceException(ErrorCode.PARTNER_ID_NOT_ASSOCIATED_WITH_USER.getErrorCode(), + ErrorCode.PARTNER_ID_NOT_ASSOCIATED_WITH_USER.getErrorMessage()); + } + IdDto dto = createDeviceDetails(deviceDetailDto); + deviceId = dto.getId(); + addInactiveMappingDeviceToSbi(sbiId, deviceId, partnerId, partnerOrgname, userId); + responseWrapper.setResponse(dto); + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In addDeviceToSbi method of SecureBiometricInterfaceServiceImpl - " + ex.getMessage()); + if (Objects.nonNull(deviceId) && !deviceId.equals(BLANK_STRING)) { + deleteDeviceDetail(deviceId); + } + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In addDeviceToSbi method of SecureBiometricInterfaceServiceImpl - " + ex.getMessage()); + if (Objects.nonNull(deviceId) && !deviceId.equals(BLANK_STRING)) { + deleteDeviceDetail(deviceId); + } + String errorCode = ErrorCode.CREATE_DEVICE_ERROR.getErrorCode(); + String errorMessage = ErrorCode.CREATE_DEVICE_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(postAddDeviceToSbi); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + private IdDto createDeviceDetails(DeviceDetailDto deviceDetailDto) { + DeviceDetail entity = new DeviceDetail(); + DeviceDetail deviceDetail = null; + IdDto dto = new IdDto(); + RegistrationDeviceSubType registrationDeviceSubType = registrationDeviceSubTypeRepository + .findByCodeAndTypeCodeAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue( + deviceDetailDto.getDeviceSubTypeCode(), deviceDetailDto.getDeviceTypeCode()); + if (registrationDeviceSubType == null) { + throw new PartnerServiceException(DeviceDetailExceptionsConstant.REG_DEVICE_SUB_TYPE_NOT_FOUND.getErrorCode(), + DeviceDetailExceptionsConstant.REG_DEVICE_SUB_TYPE_NOT_FOUND.getErrorMessage()); + } else { + entity.setDeviceSubTypeCode(registrationDeviceSubType.getCode()); + entity.setDeviceTypeCode(registrationDeviceSubType.getDeviceTypeCode()); + } + Partner partner = partnerRepository.findByIdAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue( + deviceDetailDto.getDeviceProviderId()); + if (partner == null) { + throw new PartnerServiceException(DeviceDetailExceptionsConstant.DEVICE_PROVIDER_NOT_FOUND.getErrorCode(), + DeviceDetailExceptionsConstant.DEVICE_PROVIDER_NOT_FOUND.getErrorMessage()); + } + entity.setPartnerOrganizationName(partner.getName()); + if (deviceDetailRepository.findUniqueDeviceDetail(PartnerUtil.trimAndReplace(deviceDetailDto.getMake()), PartnerUtil.trimAndReplace(deviceDetailDto.getModel()), + deviceDetailDto.getDeviceProviderId(), deviceDetailDto.getDeviceSubTypeCode(), + deviceDetailDto.getDeviceTypeCode()) != null) { + throw new PartnerServiceException(DeviceDetailExceptionsConstant.DEVICE_DETAIL_EXIST.getErrorCode(), + DeviceDetailExceptionsConstant.DEVICE_DETAIL_EXIST.getErrorMessage()); + } + entity = getCreateMapping(entity, deviceDetailDto); + deviceDetail = deviceDetailRepository.save(entity); + dto.setId(deviceDetail.getId()); + return dto; + } + + public DeviceDetail getCreateMapping(DeviceDetail deviceDetail, DeviceDetailDto deviceDetailDto) { + deviceDetail.setId(deviceDetailDto.getId() == null ? DeviceUtil.generateId(): deviceDetailDto.getId()); + deviceDetail.setIsActive(false); + deviceDetail.setIsDeleted(false); + deviceDetail.setApprovalStatus(CommonConstant.PENDING_APPROVAL); + Authentication authN = SecurityContextHolder.getContext().getAuthentication(); + if (!EmptyCheckUtils.isNullEmpty(authN)) { + deviceDetail.setCrBy(authN.getName()); + } + deviceDetail.setCrDtimes(LocalDateTime.now(ZoneId.of("UTC"))); + deviceDetail.setDeviceProviderId(deviceDetailDto.getDeviceProviderId()); + deviceDetail.setMake(deviceDetailDto.getMake()); + deviceDetail.setModel(deviceDetailDto.getModel()); + return deviceDetail; + + } + + private void addInactiveMappingDeviceToSbi(String sbiId, String deviceId, String partnerId, String orgName, String userId) { + DeviceDetailSBI deviceDetailSBI = deviceDetailSbiRepository.findByDeviceProviderIdAndSbiIdAndDeviceDetailId(partnerId, sbiId, deviceId); + if (Objects.nonNull(deviceDetailSBI)){ + LOGGER.info("sessionId", "idType", "id", "SBI and Device mapping already exists in DB."); + throw new PartnerServiceException(ErrorCode.SBI_DEVICE_MAPPING_ALREADY_EXIST.getErrorCode(), + ErrorCode.SBI_DEVICE_MAPPING_ALREADY_EXIST.getErrorMessage()); + } + + // validate sbi and device mapping + partnerHelper.validateSbiDeviceMapping(partnerId, sbiId, deviceId); + + DeviceDetailSBI entity = new DeviceDetailSBI(); + + DeviceDetailSBIPK pk = new DeviceDetailSBIPK(); + pk.setSbiId(sbiId); + pk.setDeviceDetailId(deviceId); + + entity.setId(pk); + entity.setProviderId(partnerId); + entity.setPartnerName(orgName); + entity.setIsActive(false); + entity.setIsDeleted(false); + entity.setCrBy(userId); + entity.setCrDtimes(Timestamp.valueOf(LocalDateTime.now())); + + DeviceDetailSBI savedEntity = deviceDetailSbiRepository.save(entity); + LOGGER.info("sessionId", "idType", "id", "saved inactive device mapping to sbi successfully in Db."); + } + + private void deleteDeviceDetail(String deviceDetailId) { + try { + Optional deviceDetail = deviceDetailRepository.findById(deviceDetailId); + if (deviceDetail.isPresent()) { + List deviceDetailSBIList = deviceDetailSbiRepository.findByDeviceDetailId(deviceDetailId); + if (deviceDetailSBIList.isEmpty()) { + deviceDetailRepository.deleteById(deviceDetailId); + LOGGER.info("sessionId", "idType", "id", "Device detail with id " + deviceDetailId + " deleted successfully."); + } + } + } catch (Exception e) { + LOGGER.error("sessionId", "idType", "id", "Error while deleting device detail with id " + deviceDetailId + ": " + e.getMessage()); + } + } + + @Override + public ResponseWrapperV2> getAllDevicesForSbi(String sbiId) { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + try { + String userId = getUserId(); + List partnerList = partnerRepository.findByUserId(userId); + + if (partnerList.isEmpty()) { + LOGGER.info("sessionId", "idType", "id", "User id does not exist."); + throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); + } + + Optional secureBiometricInterface = sbiRepository.findById(sbiId); + + if (secureBiometricInterface.isEmpty()) { + LOGGER.info("sessionId", "idType", "id", "Sbi is not associated with partner Id."); + throw new PartnerServiceException(ErrorCode.SBI_NOT_EXISTS.getErrorCode(), + ErrorCode.SBI_NOT_EXISTS.getErrorMessage()); + } + + SecureBiometricInterface sbi = secureBiometricInterface.get(); + // check if partnerId is associated with user + boolean partnerIdExists = false; + for (Partner partner : partnerList) { + if (partner.getId().equals(sbi.getProviderId())) { + partnerHelper.validatePartnerId(partner, userId); + validateDevicePartnerType(partner, userId); + partnerIdExists = true; + break; + } + } + if (!partnerIdExists) { + LOGGER.info("sessionId", "idType", "id", "Partner id is not associated with user."); + throw new PartnerServiceException(ErrorCode.SBI_NOT_ASSOCIATED_WITH_USER.getErrorCode(), + ErrorCode.SBI_NOT_ASSOCIATED_WITH_USER.getErrorMessage()); + } + // fetch devices list + List deviceDetailSBIList = deviceDetailSbiRepository.findByDeviceProviderIdAndSbiId(sbi.getProviderId(), sbiId); + if (!deviceDetailSBIList.isEmpty()) { + List deviceDtoList = new ArrayList<>(); + for (DeviceDetailSBI deviceDetailSBI : deviceDetailSBIList) { + Optional optionalDeviceDetail = deviceDetailRepository. + findByIdAndDeviceProviderId(deviceDetailSBI.getId().getDeviceDetailId(), deviceDetailSBI.getProviderId()); + if (optionalDeviceDetail.isPresent()) { + DeviceDetail deviceDetail = optionalDeviceDetail.get(); + DeviceDto deviceDto = new DeviceDto(); + deviceDto.setDeviceId(deviceDetail.getId()); + deviceDto.setDeviceTypeCode(deviceDetail.getDeviceTypeCode()); + deviceDto.setDeviceSubTypeCode(deviceDetail.getDeviceSubTypeCode()); + deviceDto.setDeviceProviderId(deviceDetail.getDeviceProviderId()); + deviceDto.setMake(deviceDetail.getMake()); + deviceDto.setModel(deviceDetail.getModel()); + deviceDto.setStatus(deviceDetail.getApprovalStatus()); + deviceDto.setActive(deviceDetail.getIsActive()); + deviceDto.setCreatedDateTime(deviceDetail.getCrDtimes()); + + deviceDtoList.add(deviceDto); + } + } + responseWrapper.setResponse(deviceDtoList); + } + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In getAllDevicesForSbi method of SecureBiometricInterfaceServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In getAllDevicesForSbi method of SecureBiometricInterfaceServiceImpl - " + ex.getMessage()); + String errorCode = ErrorCode.DEVICES_LIST_FOR_SBI_FETCH_ERROR.getErrorCode(); + String errorMessage = ErrorCode.DEVICES_LIST_FOR_SBI_FETCH_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getSbiDevicesId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + private void validateDevicePartnerType(Partner partner, String userId) { + if (!partner.getPartnerTypeCode().equals(DEVICE_PROVIDER)) { + LOGGER.info("Invalid Partner type for partner id : " + partner.getId()); + throw new PartnerServiceException(ErrorCode.INVALID_DEVICE_PARTNER_TYPE.getErrorCode(), + ErrorCode.INVALID_DEVICE_PARTNER_TYPE.getErrorMessage()); + } + } + + @Override + public ResponseWrapperV2 deactivateSbi(String sbiId, DeactivateSbiRequestDto requestDto) { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + try { + String status = requestDto.getStatus(); + if (Objects.isNull(status) || status.equals(BLANK_STRING) || !status.equals(PartnerConstants.DEACTIVATE)) { + LOGGER.info(status + " : is Invalid Input Parameter, it should be (De-Activate)"); + throw new PartnerServiceException(ErrorCode.DEACTIVATE_STATUS_CODE.getErrorCode(), + ErrorCode.DEACTIVATE_STATUS_CODE.getErrorMessage()); + } + String userId = getUserId(); + List partnerList = partnerRepository.findByUserId(userId); + if (partnerList.isEmpty()) { + LOGGER.info("sessionId", "idType", "id", "User id does not exist."); + throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); + } + + if (Objects.isNull(sbiId)) { + LOGGER.info("sessionId", "idType", "id", "SBI id is null."); + throw new PartnerServiceException(ErrorCode.INVALID_SBI_ID.getErrorCode(), + ErrorCode.INVALID_SBI_ID.getErrorMessage()); + } + Optional secureBiometricInterface = sbiRepository.findById(sbiId); + if (!secureBiometricInterface.isPresent()) { + LOGGER.error("SBI not exists with id {}", sbiId); + throw new PartnerServiceException(ErrorCode.SBI_NOT_EXISTS.getErrorCode(), + ErrorCode.SBI_NOT_EXISTS.getErrorMessage()); + } + SecureBiometricInterface sbi = secureBiometricInterface.get(); + + boolean isAdmin = partnerHelper.isPartnerAdmin(authUserDetails().getAuthorities().toString()); + if (!isAdmin) { + Partner partnerDetails = getAssociatedPartner(partnerList, sbi.getProviderId(), userId); + partnerHelper.checkIfPartnerIsNotActive(partnerDetails); + } + if (!sbi.getApprovalStatus().equals(APPROVED)) { + LOGGER.error("Unable to deactivate sbi with id {}", sbi.getId()); + throw new PartnerServiceException(ErrorCode.SBI_NOT_APPROVED.getErrorCode(), + ErrorCode.SBI_NOT_APPROVED.getErrorMessage()); + } + if (sbi.getApprovalStatus().equals(APPROVED) && !sbi.isActive()) { + LOGGER.error("Unable to deactivate sbi with id {}", sbi.getId()); + throw new PartnerServiceException(ErrorCode.SBI_ALREADY_DEACTIVATED.getErrorCode(), + ErrorCode.SBI_ALREADY_DEACTIVATED.getErrorMessage()); + } + // Deactivate approved devices + List approvedDevices = deviceDetailRepository.findApprovedDevicesBySbiId(sbiId); + if (!approvedDevices.isEmpty()) { + for (DeviceDetail deviceDetail : approvedDevices) { + deviceDetail.setIsActive(false); + deviceDetail.setUpdDtimes(LocalDateTime.now()); + deviceDetail.setUpdBy(getUserId()); + deviceDetailRepository.save(deviceDetail); + } + } + // Reject pending_approval devices + List pendingApprovalDevices = deviceDetailRepository.findPendingApprovalDevicesBySbiId(sbiId); + if (!pendingApprovalDevices.isEmpty()) { + for (DeviceDetail deviceDetail : pendingApprovalDevices) { + deviceDetail.setApprovalStatus(REJECTED); + deviceDetail.setUpdDtimes(LocalDateTime.now()); + deviceDetail.setUpdBy(getUserId()); + deviceDetailRepository.save(deviceDetail); + } + } + sbi.setActive(false); + sbi.setUpdDtimes(LocalDateTime.now()); + sbi.setUpdBy(getUserId()); + SecureBiometricInterface updatedSbi = sbiRepository.save(sbi); + SbiDetailsResponseDto sbiDetailsResponseDto = new SbiDetailsResponseDto(); + + sbiDetailsResponseDto.setSbiId(updatedSbi.getId()); + sbiDetailsResponseDto.setSbiVersion(updatedSbi.getSwVersion()); + sbiDetailsResponseDto.setStatus(updatedSbi.getApprovalStatus()); + sbiDetailsResponseDto.setActive(updatedSbi.isActive()); + + responseWrapper.setResponse(sbiDetailsResponseDto); + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In deactivateSbi method of SecureBiometricInterfaceServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In deactivateSbi method of SecureBiometricInterfaceServiceImpl - " + ex.getMessage()); + String errorCode = ErrorCode.DEACTIVATE_SBI_ERROR.getErrorCode(); + String errorMessage = ErrorCode.DEACTIVATE_SBI_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(patchDeactivateSbi); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + public Partner getAssociatedPartner (List partnerList, String sbiProviderId, String userId) { + boolean sbiProviderExist = false; + Partner partnerDetails = null; + for (Partner partner : partnerList) { + if (partner.getId().equals(sbiProviderId)) { + partnerHelper.validatePartnerId(partner, userId); + sbiProviderExist = true; + partnerDetails = partner; + break; + } + } + if (!sbiProviderExist) { + LOGGER.info("sessionId", "idType", "id", "SBI is not associated with user."); + throw new PartnerServiceException(ErrorCode.SBI_NOT_ASSOCIATED_WITH_USER.getErrorCode(), + ErrorCode.SBI_NOT_ASSOCIATED_WITH_USER.getErrorMessage()); + } + return partnerDetails; + } + + @Override + public ResponseWrapperV2> getAllSbiDetails(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, SbiFilterDto filterDto) { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + try { + PageResponseV2Dto pageResponseV2Dto = new PageResponseV2Dto<>(); + boolean isPartnerAdmin = partnerHelper.isPartnerAdmin(authUserDetails().getAuthorities().toString()); + List partnerIdList = null; + if (!isPartnerAdmin) { + String userId = getUserId(); + List partnerList = partnerRepository.findByUserId(userId); + if (partnerList.isEmpty()) { + LOGGER.info("sessionId", "idType", "id", "User id does not exists."); + throw new PartnerServiceException(io.mosip.pms.partner.constant.ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + io.mosip.pms.partner.constant.ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); + } + partnerIdList = new ArrayList<>(); + for (Partner partner : partnerList) { + partnerHelper.validatePartnerId(partner, userId); + partnerIdList.add(partner.getId()); + } + } + + Pageable pageable = Pageable.unpaged(); + + // Pagination + boolean isPaginationEnabled = (pageNo != null && pageSize != null); + if (isPaginationEnabled) { + pageable = PageRequest.of(pageNo, pageSize); + } + + // Fetch the SBI details + Page page = getSbiDetails(sortFieldName, sortType, pageNo, pageSize, filterDto, pageable, partnerIdList, isPartnerAdmin); + if (Objects.nonNull(page) && !page.getContent().isEmpty()) { + List sbiSummaryDtoList = MapperUtils.mapAll(page.getContent(), SbiSummaryDto.class); + pageResponseV2Dto.setPageNo(page.getNumber()); + pageResponseV2Dto.setPageSize(page.getSize()); + pageResponseV2Dto.setTotalResults(page.getTotalElements()); + pageResponseV2Dto.setData(sbiSummaryDtoList); + } + responseWrapper.setResponse(pageResponseV2Dto); + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In getAllSbiDetails method of SecureBiometricInterfaceServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In getAllSbiDetails method of SecureBiometricInterfaceServiceImpl - " + ex.getMessage()); + String errorCode = ErrorCode.SBI_DETAILS_LIST_FETCH_ERROR.getErrorCode(); + String errorMessage = ErrorCode.SBI_DETAILS_LIST_FETCH_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getAllSbiDetails); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + private Page getSbiDetails(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, SbiFilterDto filterDto, Pageable pageable, List partnerIdList, boolean isPartnerAdmin) { + // Sorting + if (Objects.nonNull(sortFieldName) && Objects.nonNull(sortType)) { + String sortKey = sortFieldName + "_" + sortType.toLowerCase(); + switch (sortKey) { + case "status_asc": + return sbiSummaryRepository.getSummaryOfSbiDetailsByStatusAsc( + filterDto.getPartnerId(), filterDto.getOrgName(), filterDto.getSbiId(), + filterDto.getSbiVersion(), filterDto.getStatus(), + filterDto.getSbiExpiryStatus(), partnerIdList, isPartnerAdmin, pageable); + + case "status_desc": + return sbiSummaryRepository.getSummaryOfSbiDetailsByStatusDesc( + filterDto.getPartnerId(), filterDto.getOrgName(), filterDto.getSbiId(), + filterDto.getSbiVersion(), filterDto.getStatus(), + filterDto.getSbiExpiryStatus(), partnerIdList, isPartnerAdmin, pageable); + + case "sbiExpiryStatus_asc": + return sbiSummaryRepository.getSummaryOfSbiDetailsByExpiryStatusAsc( + filterDto.getPartnerId(), filterDto.getOrgName(), filterDto.getSbiId(), + filterDto.getSbiVersion(), filterDto.getStatus(), + filterDto.getSbiExpiryStatus(), partnerIdList, isPartnerAdmin, pageable); + + case "sbiExpiryStatus_desc": + return sbiSummaryRepository.getSummaryOfSbiDetailsByExpiryStatusDesc( + filterDto.getPartnerId(), filterDto.getOrgName(), filterDto.getSbiId(), + filterDto.getSbiVersion(), filterDto.getStatus(), + filterDto.getSbiExpiryStatus(), partnerIdList, isPartnerAdmin, pageable); + + case "countOfAssociatedDevices_asc": + return sbiSummaryRepository.getSummaryOfSbiDetailsByDevicesCountAsc( + filterDto.getPartnerId(), filterDto.getOrgName(), filterDto.getSbiId(), + filterDto.getSbiVersion(), filterDto.getStatus(), + filterDto.getSbiExpiryStatus(), partnerIdList, isPartnerAdmin, pageable); + + case "countOfAssociatedDevices_desc": + return sbiSummaryRepository.getSummaryOfSbiDetailsByDevicesCountDesc( + filterDto.getPartnerId(), filterDto.getOrgName(), filterDto.getSbiId(), + filterDto.getSbiVersion(), filterDto.getStatus(), + filterDto.getSbiExpiryStatus(), partnerIdList, isPartnerAdmin, pageable); + + default: + // generic sorting logic for other fields + Sort sort = partnerHelper.getSortingRequest( + getSortColumn(partnerHelper.sbiAliasToColumnMap, sortFieldName), sortType); + pageable = PageRequest.of(pageNo, pageSize, sort); + } + } + return sbiSummaryRepository.getSummaryOfSbiDetails( + filterDto.getPartnerId(), filterDto.getOrgName(), filterDto.getSbiId(), + filterDto.getSbiVersion(), filterDto.getStatus(), + filterDto.getSbiExpiryStatus(), partnerIdList, isPartnerAdmin, pageable); + } + + public String getSortColumn(Map aliasToColumnMap, String alias) { + return aliasToColumnMap.getOrDefault(alias, alias); // Return alias if no match found + } + + private AuthUserDetails authUserDetails() { + return (AuthUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + } + + private String getUserId() { + String userId = authUserDetails().getUserId(); + return userId; + } } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/constant/DeviceConstant.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/constant/DeviceConstant.java index 1bd80f1eb8..03fa23188a 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/device/constant/DeviceConstant.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/constant/DeviceConstant.java @@ -107,5 +107,7 @@ private DeviceConstant() { public static final String GET_CERTIFICATE_API_IS_CALLED = "GET Certificate API called::"; public static final String SUCCESSFUL_UPLOAD="Upload %s - Success"; public static final String SUCCESSFUL_DOWNLOAD="Download %s - Success"; + public static final String APPROVED = "approved"; + public static final String REJECTED = "rejected"; } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/constant/DeviceDetailExceptionsConstant.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/constant/DeviceDetailExceptionsConstant.java index b56a787800..a334ed4ce5 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/device/constant/DeviceDetailExceptionsConstant.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/constant/DeviceDetailExceptionsConstant.java @@ -3,7 +3,7 @@ public enum DeviceDetailExceptionsConstant { REG_DEVICE_SUB_TYPE_NOT_FOUND("PMS_AUT_001","Reg Device Sub Type Code not found in the list of Reg Device Sub Types"), - DEVICE_PROVIDER_NOT_FOUND("PMS_AUT_002","Device provider id not found from the partners list"), + DEVICE_PROVIDER_NOT_FOUND("PMS_AUT_002","This partner has been inactivated by Partner admin"), DEVICE_DETAIL_EXIST("PMS_AUT_003","Device Details already exists"), DUPLICATE_REQUEST("PMS_AUT_004","Duplicate request received"), DEVICE_DETAIL_NOT_FOUND("PMS_AUT_005","Device detail for id %s does not exist"), diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/constant/FoundationalTrustProviderErrorMessages.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/constant/FoundationalTrustProviderErrorMessages.java index 4625a38d1d..d18b6c3fff 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/device/constant/FoundationalTrustProviderErrorMessages.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/constant/FoundationalTrustProviderErrorMessages.java @@ -1,12 +1,14 @@ package io.mosip.pms.device.constant; public enum FoundationalTrustProviderErrorMessages { - FTP_PROVIDER_NOT_EXISTS("PMP_AUT_030","ftp provider not exists."), + FTP_PROVIDER_NOT_EXISTS("PMP_AUT_030","The FTP provider is either inactive or does not exist."), FTP_CHIP_ID_NOT_EXISTS("PMP_AUT_031","ftp chip id not exists."), - FTP_PROVIDER_MAKE_MODEL_EXISTS("PMP_AUT_032","Given provider,make and model already exists."), + FTP_PROVIDER_MAKE_MODEL_EXISTS("PMP_AUT_032","FTM Chip details already exists for the same make and model"), FTP_CERT_NOT_UPLOADED("PMP_AUT_033","Certificate is not uploaded."), FTP_CHIP_ID_PROVIDER_ID_NOT_MATCHED("PMP_AUT_034","Ftp chip detail id and ftp provider id not mappped. "), - FTP_PROVIDER_DETAILS_EXISTS("PMP_AUT_037","Given ftp chip details already registered."); + FTP_PROVIDER_DETAILS_EXISTS("PMP_AUT_037","Given ftp chip details already registered."), + INVALID_FTP_CHIP_STATUS("PMP_AUT_038","The certificate can only be uploaded for FTM that is either pending certificate upload or has an approved status."), + FTP_CHIP_DEACTIVATED("PMP_AUT_039","FTM chip is deactivated."); private final String errorCode; private final String errorMessage; diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/constant/SecureBiometricInterfaceConstant.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/constant/SecureBiometricInterfaceConstant.java index 1c2a12f707..058dadff24 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/device/constant/SecureBiometricInterfaceConstant.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/constant/SecureBiometricInterfaceConstant.java @@ -10,8 +10,14 @@ public enum SecureBiometricInterfaceConstant { EXPIRYDATE_SHOULD_BE_GREATERTHAN_TODAYSDATE("PMS_AUT_508","ExpiryDate should be greaterthan/equal Today."), DD_SBI_PROVIDER_NOT_MATCHING("PMS_AUT_509","Device Details and SBI do not belongs to same provider."), DD_SBI_MAPPING_NOT_EXISTS("PMS_AUT_510","Mapping not exists for given data."), - SBI_NOT_APPROVED("PMS_AUT_511","Given sbi details are approved"), - SBI_RECORDS_EXISTS("PMS_AUT_512","Sbi details exists for given version. Can't add the records with the same version."); + SBI_NOT_APPROVED("PMS_AUT_511","SBI for which device is being mapped is not approved"), + SBI_RECORDS_EXISTS("PMS_AUT_512","SBI details exists for given SBI Version. Multiple SBI with same SBI Version cannot be added."), + SBI_EXPIRED("PMS_AUT_513", "SBI for which device is being mapped is expired"), + SWCREATEDDATE_SHOULD_BE_PAST_OR_TODAY("PMS_AUT_514","The created date should be less than or equal to the current date."), + EXPIRYDATE_SHOULD_NOT_BE_GREATER_THAN_TEN_YEARS("PMS_AUT_515", "Expiry date should not be greater than %s years from today"), + CREATEDDATE_SHOULD_NOT_BE_LESS_THAN_TEN_YEARS("PMS_AUT_516", "Created date should not be less than %s years from today"), + SBI_ALREADY_APPROVED("PMS_AUT_517", "The selected SBI has been already approved"), + SBI_ALREADY_REJECTED("PMS_AUT_518", "The selected SBI has been already rejected"); /** * The error code. diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/controller/DeviceDetailController.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/controller/DeviceDetailController.java index 61c98ebe7e..1f7704ea7e 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/device/controller/DeviceDetailController.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/controller/DeviceDetailController.java @@ -1,8 +1,23 @@ package io.mosip.pms.device.controller; import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import io.mosip.pms.common.dto.PageResponseV2Dto; +import io.mosip.pms.common.request.dto.RequestWrapperV2; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.device.dto.DeviceDetailFilterDto; +import io.mosip.pms.device.dto.DeviceDetailSummaryDto; +import io.mosip.pms.partner.request.dto.SbiAndDeviceMappingRequestDto; +import io.mosip.pms.device.response.dto.DeviceDetailResponseDto; +import io.mosip.pms.partner.util.PartnerHelper; +import io.mosip.pms.common.util.RequestValidator; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PatchMapping; @@ -11,6 +26,9 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.PathVariable; import io.mosip.kernel.core.http.ResponseFilter; import io.mosip.pms.common.dto.DeviceFilterValueDto; @@ -24,6 +42,7 @@ import io.mosip.pms.device.request.dto.DeviceDetailDto; import io.mosip.pms.device.request.dto.DeviceDetailUpdateDto; import io.mosip.pms.device.request.dto.DeviceSearchDto; +import io.mosip.pms.device.request.dto.DeactivateDeviceRequestDto; import io.mosip.pms.device.request.dto.UpdateDeviceDetailStatusDto; import io.mosip.pms.device.response.dto.DeviceDetailSearchResponseDto; import io.mosip.pms.device.response.dto.FilterResponseCodeDto; @@ -35,29 +54,42 @@ import io.swagger.annotations.ApiResponses; import io.swagger.v3.oas.annotations.Operation; +import java.util.Optional; + @RestController @RequestMapping(value = "/devicedetail") @Api(tags = { "DeviceDetail" }) public class DeviceDetailController { + + @Value("${mosip.pms.api.id.approval.mapping.device.to.sbi.post}") + private String postApprovalMappingDeviceToSbiId; + + @Value("${mosip.pms.api.id.deactivate.device.patch}") + private String patchDeactivateDevice; @Autowired AuditUtil auditUtil; @Autowired DeviceDetailService deviceDetaillService; - - /** - * Post API to insert a new row of DeviceDetail data - * - * @param deviceDetailRequestDto input parameter deviceRequestDto - * - * @return ResponseEntity DeviceDetail which is inserted successfully - * {@link ResponseEntity} + + @Autowired + PartnerHelper partnerHelper; + + @Autowired + RequestValidator requestValidator; + + /* + * This endpoint has been deprecated since the release-1.3.x + * It has been replaced by the new POST /securebiometricinterface/{sbiId}/devices endpoint. + * The functionality provided by this API is now available in the new endpoint. + * Please use the new endpoint for all future requests. */ + @Deprecated(since = "release-1.3.x") @PreAuthorize("hasAnyRole(@authorizedRoles.getPostdevicedetail())") @ResponseFilter @PostMapping - @Operation(summary = "Service to save DeviceDetail", description = "Saves DeviceDetail and return DeviceDetail id") + @Operation(summary = "Service to save DeviceDetail - deprecated since release-1.3.x.", description = "This endpoint has been deprecated since the release-1.3.x and replaced by the POST /securebiometricinterface/{sbiId}/devices endpoint.") @ApiResponses({ @ApiResponse(code = 201, message = "When DeviceDetail successfully created"), @ApiResponse(code = 400, message = "When Request body passed is null or invalid"), @ApiResponse(code = 500, message = "While creating DeviceDetail any error occured") }) @@ -80,18 +112,14 @@ public ResponseWrapper createDeviceDetail( } - /** - * Put API to update a row of DeviceDetail data - * - * @param deviceDetailRequestDto input parameter deviceRequestDto - * - * @return ResponseEntity DeviceDetail which is updated successfully - * {@link ResponseEntity} + /* + * This endpoint has been deprecated since the release-1.3.x */ + @Deprecated(since = "release-1.3.x") @PreAuthorize("hasAnyRole(@authorizedRoles.getPutdevicedetail())") @ResponseFilter @PutMapping - @Operation(summary = "Service to update DeviceDetails", description = "Updates DeviceDetails") + @Operation(summary = "Service to update DeviceDetails - deprecated since release-1.3.x.", description = "This endpoint has been deprecated since release-1.3.x.") @ApiResponses({ @ApiResponse(code = 201, message = "When DeviceDetail successfully updated"), @ApiResponse(code = 400, message = "When Request body passed is null or invalid"), @ApiResponse(code = 500, message = "While updating DeviceDetail any error occured") }) @@ -112,16 +140,19 @@ public ResponseWrapper updateDeviceDetail( "AUT-007", deviceDetailRequestDto.getRequest().getId(), "deviceDetailId"); return responseWrapper; } - - /** - * - * @param deviceDetailRequestDto - * @return + + /* + * This endpoint has been deprecated since the release-1.3.x + * It has been replaced by the new PATCH devicedetail/{id}/approval endpoint. + * The functionality provided by this API is now available in the new endpoint. + * Please use the new endpoint for all future requests. */ + @Deprecated(since = "release-1.3.x") @PreAuthorize("hasAnyRole(@authorizedRoles.getPatchdevicedetail())") @ResponseFilter @PatchMapping - @Operation(summary = "Service to approve/reject DeviceDetail", description = "Approve DeviceDetail and returns success message") + @Operation(summary = "Service to approve/reject DeviceDetail - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since the release-1.3.x and replaced by the PATCH /devicedetail/{id}/approval endpoint.") @ApiResponses({ @ApiResponse(code = 201, message = "When DeviceDetail successfully approved/rejected"), @ApiResponse(code = 400, message = "When Request body passed is null or invalid"), @ApiResponse(code = 500, message = "While approving/rejecting DeviceDetail any error occured") }) @@ -143,11 +174,19 @@ public ResponseWrapper approveDeviceDetails( return responseWrapper; } - + + /* + * This endpoint has been deprecated since the release-1.3.x + * It has been replaced by the new GET /devicedetail/search/v2 endpoint. + * The functionality provided by this API is now available in the new endpoint. + * Please use the new endpoint for all future requests. + */ + @Deprecated(since = "release-1.3.x") @ResponseFilter @PostMapping("/search") @PreAuthorize("hasAnyRole(@authorizedRoles.getPostdevicedetailsearch())") - @Operation(summary = "Service to search DeviceDetails", description = "ervice to search DeviceDetails") + @Operation(summary = "Service to search DeviceDetails - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since the release-1.3.x and replaced by the GET /devicedetail endpoint.") public ResponseWrapper> searchDeviceDetails( @RequestBody @Valid RequestWrapper request) { ResponseWrapper> responseWrapper = new ResponseWrapper<>(); @@ -165,11 +204,19 @@ public ResponseWrapper> searchDeviceType responseWrapper.setResponse(deviceDetaillService.searchDeviceType(RegistrationDeviceSubType.class, request.getRequest())); return responseWrapper; } - + + /* + * This endpoint has been deprecated since the release-1.3.x + * It has been replaced by the new GET /devicedetail/search/v2 endpoint. + * The functionality provided by this API is now available in the new endpoint. + * Please use the new endpoint for all future requests. + */ + @Deprecated(since = "release-1.3.x") @ResponseFilter @PostMapping("/filtervalues") @PreAuthorize("hasAnyRole(@authorizedRoles.getPostdevicedetailfiltervalues())") - @Operation(summary = "Service to filter DeviceDetails", description = "Service to filter DeviceDetails") + @Operation(summary = "Service to filter DeviceDetails - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since the release-1.3.x and replaced by the GET /devicedetail endpoint.") public ResponseWrapper filterValues( @RequestBody @Valid RequestWrapper request) { ResponseWrapper responseWrapper = new ResponseWrapper<>(); @@ -199,4 +246,104 @@ public ResponseWrapper filterDeviceSubType( responseWrapper.setResponse(deviceDetaillService.deviceSubTypeFilterValues(request.getRequest())); return responseWrapper; } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getPatchdeactivatedevice())") + @PatchMapping(value = "/{deviceId}") + @Operation(summary = "This endpoint deactivates a Device based on the Device Id.", + description = "Available since release-1.3.x. This endpoint is configured for the roles DEVICE_PROVIDER or PARTNER_ADMIN.") + @io.swagger.v3.oas.annotations.responses.ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "OK"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + public ResponseWrapperV2 deactivateDevice(@PathVariable("deviceId") @NotBlank String deviceId, @RequestBody @Valid RequestWrapperV2 + requestWrapper) { + Optional> validationResponse = requestValidator.validate(patchDeactivateDevice, requestWrapper); + if (validationResponse.isPresent()) { + return validationResponse.get(); + } + return deviceDetaillService.deactivateDevice(deviceId, requestWrapper.getRequest()); + } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getPostdevicewithsbimapping())") + @PostMapping(value = "/{id}/approval") + @Operation(summary = "This endpoint is for the Partner Admin user to approve or reject a Device and activate the mapping between the Device and the SBI.", + description = "Available since release-1.3.x. It is configured for the role PARTNER_ADMIN") + @io.swagger.v3.oas.annotations.responses.ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "OK"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + public ResponseWrapperV2 approveOrRejectMappingDeviceToSbi(@PathVariable("id") String deviceId, @RequestBody @Valid RequestWrapperV2 requestWrapper) { + Optional> validationResponse = requestValidator.validate(postApprovalMappingDeviceToSbiId, requestWrapper); + if (validationResponse.isPresent()) { + return validationResponse.get(); + } + return deviceDetaillService.approveOrRejectMappingDeviceToSbi(deviceId, requestWrapper.getRequest()); + } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getGetalldevicedetails())") + @GetMapping + @Operation(summary = "This endpoint retrieves a list of all the Devices.", + description = "Available since release-1.3.x. This endpoint supports pagination, sorting, and filtering. It is configured for the role PARTNER_ADMIN.") + @io.swagger.v3.oas.annotations.responses.ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "OK"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + public ResponseWrapperV2> getAllDeviceDetails( + @RequestParam(value = "sortFieldName", required = false) String sortFieldName, + @RequestParam(value = "sortType", required = false) String sortType, + @RequestParam(value = "pageNo", defaultValue = "0") Integer pageNo, + @RequestParam(value = "pageSize", defaultValue = "8") Integer pageSize, + @RequestParam(value = "partnerId", required = false) String partnerId, + @RequestParam(value = "orgName", required = false) String orgName, + @RequestParam(value = "deviceType", required = false) String deviceType, + @RequestParam(value = "deviceSubType", required = false) String deviceSubType, + @Parameter( + description = "Status of device", + in = ParameterIn.QUERY, + schema = @Schema(allowableValues = {"approved", "rejected", "pending_approval", "deactivated"}) + ) + @RequestParam(value = "status", required = false) String status, + @RequestParam(value = "make", required = false) String make, + @RequestParam(value = "model", required = false) String model, + @RequestParam(value = "sbiId", required = false) String sbiId, + @RequestParam(value = "sbiVersion", required = false) String sbiVersion, + @RequestParam(value = "deviceId", required = false) String deviceId + ) { + partnerHelper.validateRequestParameters(partnerHelper.deviceAliasToColumnMap, sortFieldName, sortType, pageNo, pageSize); + DeviceDetailFilterDto filterDto = new DeviceDetailFilterDto(); + if (partnerId != null) { + filterDto.setPartnerId(partnerId.toLowerCase()); + } + if (deviceType != null) { + filterDto.setDeviceType(deviceType.toLowerCase()); + } + if (orgName != null) { + filterDto.setOrgName(orgName.toLowerCase()); + } + if (status != null) { + filterDto.setStatus(status); + } + if (deviceSubType != null) { + filterDto.setDeviceSubType(deviceSubType.toLowerCase()); + } + if (make != null) { + filterDto.setMake(make.toLowerCase()); + } + if (model != null) { + filterDto.setModel(model.toLowerCase()); + } + if (sbiId != null) { + filterDto.setSbiId(sbiId.toLowerCase()); + } + if (sbiVersion != null) { + filterDto.setSbiVersion(sbiVersion.toLowerCase()); + } + if (deviceId != null) { + filterDto.setDeviceId(deviceId.toLowerCase()); + } + return deviceDetaillService.getAllDeviceDetails(sortFieldName, sortType, pageNo, pageSize, filterDto); + } } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/controller/FTPChipDetailController.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/controller/FTPChipDetailController.java index 8586c058d9..ae9908f913 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/device/controller/FTPChipDetailController.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/controller/FTPChipDetailController.java @@ -1,11 +1,30 @@ package io.mosip.pms.device.controller; import java.io.IOException; +import java.security.cert.CertificateException; +import java.util.List; +import java.util.Optional; import javax.validation.Valid; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import io.mosip.pms.common.dto.PageResponseV2Dto; +import io.mosip.pms.common.request.dto.RequestWrapperV2; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.device.dto.FtmChipDetailsDto; +import io.mosip.pms.device.dto.FtmChipFilterDto; +import io.mosip.pms.device.request.dto.*; +import io.mosip.pms.device.response.dto.*; +import io.mosip.pms.partner.response.dto.FtmCertificateDownloadResponseDto; +import io.mosip.pms.partner.util.PartnerHelper; +import io.mosip.pms.common.util.RequestValidator; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PatchMapping; @@ -16,6 +35,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonProcessingException; @@ -28,16 +49,6 @@ import io.mosip.pms.device.authdevice.entity.FTPChipDetail; import io.mosip.pms.device.authdevice.service.FtpChipDetailService; import io.mosip.pms.device.constant.DeviceConstant; -import io.mosip.pms.device.request.dto.DeviceSearchDto; -import io.mosip.pms.device.request.dto.FtpChipCertDownloadRequestDto; -import io.mosip.pms.device.request.dto.FtpChipCertificateRequestDto; -import io.mosip.pms.device.request.dto.FtpChipDetailDto; -import io.mosip.pms.device.request.dto.FtpChipDetailStatusDto; -import io.mosip.pms.device.request.dto.FtpChipDetailUpdateDto; -import io.mosip.pms.device.response.dto.FTPSearchResponseDto; -import io.mosip.pms.device.response.dto.FtpCertDownloadResponeDto; -import io.mosip.pms.device.response.dto.FtpCertificateResponseDto; -import io.mosip.pms.device.response.dto.IdDto; import io.mosip.pms.device.util.AuditUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiParam; @@ -56,7 +67,15 @@ public class FTPChipDetailController { @Autowired FtpChipDetailService ftpChipDetaillService; - + @Autowired + PartnerHelper partnerHelper; + + @Autowired + RequestValidator requestValidator; + + @Value("${mosip.pms.api.id.deactivate.ftm.patch}") + private String patchDeactivateFtm; + /** * Post API to insert a new row of ftpChipDetail data * @@ -91,18 +110,14 @@ public ResponseWrapper createDeviceDetail( } - /** - * Put API to update a row of DeviceDetail data - * - * @param deviceDetailRequestDto input parameter deviceRequestDto - * - * @return ResponseEntity DeviceDetail which is updated successfully - * {@link ResponseEntity} + /* + * This endpoint has been deprecated since the release-1.3.x */ + @Deprecated(since = "release-1.3.x") @PreAuthorize("hasAnyRole(@authorizedRoles.getPutftpchipdetail())") @ResponseFilter @PutMapping - @Operation(summary = "Service to update ftp chip detail", description = "Updates ftp chip detail and returns success message") + @Operation(summary = "Service to update ftp chip detail - deprecated since release-1.3.x.", description = "This endpoint has been deprecated since release-1.3.x.") @ApiResponses({ @ApiResponse(code = 201, message = "When ftp chip detail successfully updated"), @ApiResponse(code = 400, message = "When Request body passed is null or invalid"), @ApiResponse(code = 500, message = "While updating ftp chip detail any error occured") }) @@ -219,15 +234,113 @@ public ResponseWrapper getPartnerCertificate( "AUT-007", ftpChipDetailId, "ftpChipDetailId"); return response; } - + + /* + * This endpoint has been deprecated since the release-1.3.x + * It has been replaced by the new GET /ftpchipdetail/v2 endpoint. + * The functionality provided by this API is now available in the new endpoint. + * Please use the new endpoint for all future requests. + */ + @Deprecated(since = "release-1.3.x") @ResponseFilter @PostMapping("/search") @PreAuthorize("hasAnyRole(@authorizedRoles.getPostftpchipdetailsearch())") - @Operation(summary = "Service to serach ftp chip details", description = "Service to serach ftp chip details") + @Operation(summary = "Service to search ftp chip details - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since the release-1.3.x and replaced by the GET /ftpchipdetail/v2 endpoint.") public ResponseWrapper> searchFtpChipDetails( @RequestBody @Valid RequestWrapper request) { ResponseWrapper> responseWrapper = new ResponseWrapper<>(); responseWrapper.setResponse(ftpChipDetaillService.searchFTPChipDetails(FTPChipDetail.class, request.getRequest())); return responseWrapper; } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getPatchdeactivateftm())") + @PatchMapping(value = "/{ftmId}") + @Operation(summary = "This endpoint deactivates the FTM chip details based on the FTM chip details Id.", + description = "Available since release-1.3.x. This endpoint is configured for the roles FTM_PROVIDER or PARTNER_ADMIN.") + @io.swagger.v3.oas.annotations.responses.ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "OK"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + public ResponseWrapperV2 deactivateFtm(@PathVariable("ftmId") @NotBlank String ftmId, @RequestBody @Valid RequestWrapperV2 + requestWrapper) { + Optional> validationResponse = requestValidator.validate(patchDeactivateFtm, requestWrapper); + if (validationResponse.isPresent()) { + return validationResponse.get(); + } + return ftpChipDetaillService.deactivateFtm(ftmId, requestWrapper.getRequest()); + } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getGetoriginalftmcertificate())") + @RequestMapping(value = "/{ftmId}/certificate-data", method = RequestMethod.GET) + @Operation(summary = "This endpoint fetches both the CA signed certificate uploaded by the FTM Chip Provider and the MOSIP signed certificate generated by PMS", + description = "Available since release-1.3.x. The endpoint is configured for the roles FTM_PROVIDER or PARTNER_ADMIN.") + @io.swagger.v3.oas.annotations.responses.ApiResponses(value = {@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "OK"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true)))}) + public ResponseWrapperV2 getFtmCertificateData( + @ApiParam("To download original FTM certificate.") @PathVariable("ftmId") @NotNull String ftmId) throws JsonParseException, JsonMappingException, JsonProcessingException, IOException, CertificateException { + return ftpChipDetaillService.getFtmCertificateData(ftmId); + } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpartnersftmchipdetails())") + @GetMapping(value = "/v2") + @Operation(summary = "This endpoint retrieves a list of all FTM Chip details created by all the FTM Providers.", + description = "Available since release-1.3.x. This endpoint supports pagination, sorting, and filtering. It is configured for the role FTM_PROVIDER.") + @io.swagger.v3.oas.annotations.responses.ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "OK"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + ResponseWrapperV2> getPartnersFtmChipDetails( + @RequestParam(value = "sortFieldName", required = false) String sortFieldName, + @RequestParam(value = "sortType", required = false) String sortType, + @RequestParam(value = "pageNo", defaultValue = "0") Integer pageNo, + @RequestParam(value = "pageSize", defaultValue = "8") Integer pageSize, + @RequestParam(value = "partnerId", required = false) String partnerId, + @RequestParam(value = "orgName", required = false) String orgName, + @RequestParam(value = "ftmId", required = false) String ftmId, + @RequestParam(value = "make", required = false) String make, + @RequestParam(value = "model", required = false) String model, + @Parameter( + description = "Status of FTM", + in = ParameterIn.QUERY, + schema = @Schema(allowableValues = {"approved", "rejected", "pending_cert_upload", "pending_approval", "deactivated"}) + ) + @RequestParam(value = "status", required = false) String status + ) { + partnerHelper.validateRequestParameters(partnerHelper.ftmAliasToColumnMap, sortFieldName, sortType, pageNo, pageSize); + FtmChipFilterDto filterDto = new FtmChipFilterDto(); + if (partnerId != null) { + filterDto.setPartnerId(partnerId.toLowerCase()); + } + if (orgName != null) { + filterDto.setOrgName(orgName.toLowerCase()); + } + if (ftmId != null) { + filterDto.setFtmId(ftmId.toLowerCase()); + } + if (make != null) { + filterDto.setMake(make.toLowerCase()); + } + if (model != null) { + filterDto.setModel(model.toLowerCase()); + } + if (status != null) { + filterDto.setStatus(status); + } + return ftpChipDetaillService.getPartnersFtmChipDetails(sortFieldName, sortType, pageNo, pageSize, filterDto); + } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getGetftmchipdetails())") + @GetMapping + @Operation(summary = "This endpoint retrieves a list of all FTM Chip details created by all the FTM Providers associated with the logged in user." + , description = "Available since release-1.3.x. This endpoint is configured for the roles FTM_PROVIDER or PARTNER_ADMIN.") + @io.swagger.v3.oas.annotations.responses.ApiResponses(value = {@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "OK"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true)))}) + public ResponseWrapperV2> ftmChipDetail() { + return ftpChipDetaillService.ftmChipDetail(); + } } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/controller/SecureBiometricInterfaceController.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/controller/SecureBiometricInterfaceController.java index 089e120bbf..6be3558078 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/device/controller/SecureBiometricInterfaceController.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/controller/SecureBiometricInterfaceController.java @@ -1,8 +1,23 @@ package io.mosip.pms.device.controller; import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import io.mosip.pms.common.dto.PageResponseV2Dto; +import io.mosip.pms.common.request.dto.RequestWrapperV2; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.device.dto.SbiFilterDto; +import io.mosip.pms.partner.dto.DeviceDto; +import io.mosip.pms.device.response.dto.SbiDetailsResponseDto; +import io.mosip.pms.device.dto.SbiDetailsDto; +import io.mosip.pms.partner.util.PartnerHelper; +import io.mosip.pms.common.util.RequestValidator; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -10,6 +25,9 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; import io.mosip.kernel.core.http.ResponseFilter; import io.mosip.pms.common.dto.FilterValueDto; @@ -22,35 +40,53 @@ import io.mosip.pms.device.constant.DeviceConstant; import io.mosip.pms.device.request.dto.DeviceDetailSBIMappingDto; import io.mosip.pms.device.request.dto.DeviceSearchDto; +import io.mosip.pms.device.request.dto.DeactivateSbiRequestDto; import io.mosip.pms.device.request.dto.SecureBiometricInterfaceCreateDto; import io.mosip.pms.device.request.dto.SecureBiometricInterfaceStatusUpdateDto; import io.mosip.pms.device.request.dto.SecureBiometricInterfaceUpdateDto; import io.mosip.pms.device.request.dto.UpdateDeviceDetailStatusDto; +import io.mosip.pms.device.request.dto.DeviceDetailDto; import io.mosip.pms.device.response.dto.FilterResponseCodeDto; import io.mosip.pms.device.response.dto.IdDto; import io.mosip.pms.device.response.dto.MappedDeviceDetailsReponse; import io.mosip.pms.device.response.dto.SbiSearchResponseDto; +import io.mosip.pms.device.response.dto.SbiSummaryDto; import io.mosip.pms.device.util.AuditUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import io.swagger.v3.oas.annotations.Operation; +import java.util.List; +import java.util.Optional; + @RestController @RequestMapping(value = "/securebiometricinterface") @Api(tags = { "SecureBiometricInterface" }) public class SecureBiometricInterfaceController { + @Value("${mosip.pms.api.id.add.device.to.sbi.id.post}") + private String postAddDeviceToSbi; + + @Value("${mosip.pms.api.id.deactivate.sbi.patch}") + private String patchDeactivateSbi; + @Autowired SecureBiometricInterfaceService secureBiometricInterface; @Autowired AuditUtil auditUtil; + @Autowired + PartnerHelper partnerHelper; + + @Autowired + RequestValidator requestValidator; + @PreAuthorize("hasAnyRole(@authorizedRoles.getPostsecurebiometricinterface())") @ResponseFilter @PostMapping - @Operation(summary = "Service to save SecureBiometricInterfaceCreateDto", description = "Saves SecureBiometricInterfaceCreateDto and return DeviceDetail id") + @Operation(summary = "Service to save SecureBiometricInterface details", description = "Saves SecureBiometricInterface details and return SBI id") @ApiResponses({ @ApiResponse(code = 201, message = "When SecureBiometricInterfaceCreateDto successfully created"), @ApiResponse(code = 400, message = "When Request body passed is null or invalid"), @ApiResponse(code = 500, message = "While creating SecureBiometricInterfaceCreateDto any error occured") }) @@ -74,10 +110,15 @@ public ResponseWrapper SecureBiometricInterface( } + /* + * This endpoint has been deprecated since the release-1.3.x + */ + @Deprecated(since = "release-1.3.x") @PreAuthorize("hasAnyRole(@authorizedRoles.getPutsecurebiometricinterface())") @ResponseFilter @PutMapping - @Operation(summary = "Service to update SecureBiometricInterface", description = "Updates SecureBiometricInterface and returns success message") + @Operation(summary = "Service to update SecureBiometricInterface - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since release-1.3.x.") @ApiResponses({ @ApiResponse(code = 201, message = "When SecureBiometricInterface successfully updated"), @ApiResponse(code = 400, message = "When Request body passed is null or invalid"), @ApiResponse(code = 500, message = "While updating SecureBiometricInterface any error occured") }) @@ -126,10 +167,18 @@ public ResponseWrapper approveSecureBiometricInterface( return responseWrapper; } + /* + * This endpoint has been deprecated since the release-1.3.x + * It has been replaced by the new GET /securebiometricinterface endpoint. + * The functionality provided by this API is now available in the new endpoint. + * Please use the new endpoint for all future requests. + */ + @Deprecated(since = "release-1.3.x") @ResponseFilter @PostMapping("/search") @PreAuthorize("hasAnyRole(@authorizedRoles.getPostsecurebiometricinterfacesearch())") - @Operation(summary = "Service to search SecureBiometricInterface details", description = "Service to search SecureBiometricInterface details") + @Operation(summary = "Service to search SecureBiometricInterface details - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since the release-1.3.x and replaced by the GET /securebiometricinterface endpoint.") public ResponseWrapper> searchSecureBiometric( @RequestBody @Valid RequestWrapper request) { ResponseWrapper> responseWrapper = new ResponseWrapper<>(); @@ -138,10 +187,18 @@ public ResponseWrapper> searchSecureBiomet return responseWrapper; } + /* + * This endpoint has been deprecated since the release-1.3.x + * It has been replaced by the new POST /securebiometricinterface/{sbiId}/devices endpoint. + * The functionality provided by this API is now available in the new endpoint. + * Please use the new endpoint for all future requests. + */ + @Deprecated(since = "release-1.3.x") @ResponseFilter @PutMapping("/devicedetails/map") @PreAuthorize("hasAnyRole(@authorizedRoles.getPutsecurebiometricinterfacedevicedetailsmap())") - @Operation(summary = "Service to map device details with sbi", description = "Service to map device details with sbi") + @Operation(summary = "Service to map device details with sbi - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since the release-1.3.x and replaced by the POST /securebiometricinterface/{sbiId}/devices endpoint.") public ResponseWrapper mapDeviceDetails( @RequestBody @Valid RequestWrapper request) { ResponseWrapper responseWrapper = new ResponseWrapper<>(); @@ -149,10 +206,15 @@ public ResponseWrapper mapDeviceDetails( return responseWrapper; } + /* + * This endpoint has been deprecated since the release-1.3.x + */ + @Deprecated(since = "release-1.3.x") @ResponseFilter @PutMapping("/devicedetails/map/remove") @PreAuthorize("hasAnyRole(@authorizedRoles.getPutsecurebiometricinterfacedevicedetailsmapremove())") - @Operation(summary = "Service to remove mapped device details with sbi", description = "Service to remove mapped device details with sbi") + @Operation(summary = "Service to remove mapped device details with sbi - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since release-1.3.x.") public ResponseWrapper removeMappedDeviceDetails( @RequestBody @Valid RequestWrapper request) { ResponseWrapper responseWrapper = new ResponseWrapper<>(); @@ -160,10 +222,18 @@ public ResponseWrapper removeMappedDeviceDetails( return responseWrapper; } + /* + * This endpoint has been deprecated since the release-1.3.x + * It has been replaced by the new GET /securebiometricinterface/{sbiId}/devices endpoint. + * The functionality provided by this API is now available in the new endpoint. + * Please use the new endpoint for all future requests. + */ + @Deprecated(since = "release-1.3.x") @ResponseFilter @PostMapping("/devicedetails/map/search") @PreAuthorize("hasAnyRole(@authorizedRoles.getPostsecurebiometricinterfacedevicedetailsmapsearch())") - @Operation(summary = "Service to search mapped device details and SecureBiometricInterface details", description = "Service to search mapped device details and SecureBiometricInterface details") + @Operation(summary = "Service to search mapped device details and SecureBiometricInterface details - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since the release-1.3.x and replaced by the GET /securebiometricinterface/{sbiId}/devices endpoint.") public ResponseWrapper> searchMappedDeviceDetails( @RequestBody @Valid RequestWrapper request) { ResponseWrapper> responseWrapper = new ResponseWrapper<>(); @@ -171,15 +241,125 @@ public ResponseWrapper> searchMapped secureBiometricInterface.searchMappedDeviceDetails(DeviceDetailSBI.class, request.getRequest())); return responseWrapper; } - + + /* + * This endpoint has been deprecated since the release-1.3.x + * It has been replaced by the new GET /securebiometricinterface endpoint. + * The functionality provided by this API is now available in the new endpoint. + * Please use the new endpoint for all future requests. + */ + @Deprecated(since = "release-1.3.x") @ResponseFilter @PostMapping("/filtervalues") @PreAuthorize("hasAnyRole(@authorizedRoles.getPostsecurebiometricinterfacefiltervalues())") - @Operation(summary = "Service to filter SBI's", description = "Service to filter SBI's") + @Operation(summary = "Service to filter SBI's - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since the release-1.3.x and replaced by the GET /securebiometricinterface endpoint.") public ResponseWrapper filterValues( @RequestBody @Valid RequestWrapper request) { ResponseWrapper responseWrapper = new ResponseWrapper<>(); responseWrapper.setResponse(secureBiometricInterface.filterValues(request.getRequest())); return responseWrapper; } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getPostadddevicetosbi())") + @PostMapping(value = "/{sbiId}/devices") + @Operation(summary = "This endpoint adds a new Device and creates an inactive mapping between the device and the given SBI.", + description = "Available since release-1.3.x. This endpoint is configured for the roles DEVICE_PROVIDER or PARTNER_ADMIN.") + @io.swagger.v3.oas.annotations.responses.ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "OK"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + public ResponseWrapperV2 addDeviceToSbi(@PathVariable("sbiId") @NotBlank String sbiId, @RequestBody @Valid RequestWrapperV2 requestWrapper) { + Optional> validationResponse = requestValidator.validate(postAddDeviceToSbi, requestWrapper); + if (validationResponse.isPresent()) { + return validationResponse.get(); + } + return secureBiometricInterface.addDeviceToSbi(requestWrapper.getRequest(), sbiId); + } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getGetsbidetails())") + @GetMapping(value = "/{sbiId}/devices") + @Operation(summary = "This endpoint fetches the list of Devices associated with a given SBI Id", + description = "Available since release-1.3.x. This endpoint is configured for the roles DEVICE_PROVIDER or PARTNER_ADMIN.") + @io.swagger.v3.oas.annotations.responses.ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "OK"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + public ResponseWrapperV2> getAllDevicesForSbi(@PathVariable String sbiId) { + return secureBiometricInterface.getAllDevicesForSbi(sbiId); + } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getPatchdeactivatesbi())") + @PatchMapping(value = "/{sbiId}") + @Operation(summary = "This endpoint deactivates an SBI along with associated Devices.", + description = "Available since release-1.3.x. This endpoint is configured for the roles DEVICE_PROVIDER or PARTNER_ADMIN.") + @io.swagger.v3.oas.annotations.responses.ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "OK"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + public ResponseWrapperV2 deactivateSbi(@PathVariable("sbiId") @NotBlank String sbiId, @RequestBody @Valid RequestWrapperV2 + requestWrapper) { + Optional> validationResponse = requestValidator.validate(patchDeactivateSbi, requestWrapper); + if (validationResponse.isPresent()) { + return validationResponse.get(); + } + return secureBiometricInterface.deactivateSbi(sbiId, requestWrapper.getRequest()); + } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getGetallsbidetails())") + @GetMapping + @Operation(summary = "This endpoint retrieves a list of all SBIs created by the Device Providers.", + description = "Available since release-1.3.x. This endpoint supports pagination, sorting, and and filtering based on optional query parameters. If the token used to access this endpoint, does not have the PARTNER_ADMIN role, then it will fetch all SBIs created by all the partners associated with the logged in user only. If the token used to access this endpoint, has PARTNER_ADMIN role, then it will fetch all the SBIs created by all the partners.") + @io.swagger.v3.oas.annotations.responses.ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "OK"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + ResponseWrapperV2> getAllSbiDetails( + @RequestParam(value = "sortFieldName", required = false) String sortFieldName, + @RequestParam(value = "sortType", required = false) String sortType, + @RequestParam(value = "pageNo", required = false) Integer pageNo, + @RequestParam(value = "pageSize", required = false) Integer pageSize, + @RequestParam(value = "partnerId", required = false) String partnerId, + @RequestParam(value = "orgName", required = false) String orgName, + @RequestParam(value = "sbiId", required = false) String sbiId, + @RequestParam(value = "sbiVersion", required = false) String sbiVersion, + @Parameter( + description = "Status of SBI", + in = ParameterIn.QUERY, + schema = @Schema(allowableValues = {"approved", "rejected", "pending_approval", "deactivated"}) + ) + @RequestParam(value = "status", required = false) String status, + @Parameter( + description = "Status of SBI based on expiry date time", + in = ParameterIn.QUERY, + schema = @Schema(allowableValues = {"expired", "valid"}) + ) + @RequestParam(value = "sbiExpiryStatus", required = false) String sbiExpiryStatus + ) { + partnerHelper.validateRequestParameters(partnerHelper.sbiAliasToColumnMap, sortFieldName, sortType, pageNo, pageSize); + SbiFilterDto filterDto = new SbiFilterDto(); + if (partnerId != null) { + filterDto.setPartnerId(partnerId.toLowerCase()); + } + if (orgName != null) { + filterDto.setOrgName(orgName.toLowerCase()); + } + if (sbiId != null) { + filterDto.setSbiId(sbiId.toLowerCase()); + } + if (sbiVersion != null) { + filterDto.setSbiVersion(sbiVersion.toLowerCase()); + } + if (status != null) { + filterDto.setStatus(status); + } + if (sbiExpiryStatus != null) { + filterDto.setSbiExpiryStatus(sbiExpiryStatus); + } + return secureBiometricInterface.getAllSbiDetails(sortFieldName, sortType, pageNo, pageSize, filterDto); + } } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/DeviceDetailFilterDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/DeviceDetailFilterDto.java new file mode 100644 index 0000000000..f014cc9d04 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/DeviceDetailFilterDto.java @@ -0,0 +1,18 @@ +package io.mosip.pms.device.dto; + +import lombok.Data; + +@Data +public class DeviceDetailFilterDto { + private String deviceId; + private String partnerId; + private String orgName; + private String deviceType; + private String deviceSubType; + private String status; + private String make; + private String model; + private String sbiId; + private String sbiVersion; + +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/DeviceDetailSummaryDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/DeviceDetailSummaryDto.java new file mode 100644 index 0000000000..3644d3f9d6 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/DeviceDetailSummaryDto.java @@ -0,0 +1,44 @@ +package io.mosip.pms.device.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class DeviceDetailSummaryDto { + + @Schema(description = "Unique identifier for the device", example = "device12") + private String deviceId; + + @Schema(description = "Unique identifier for the partner", example = "partner123") + private String partnerId; + + @Schema(description = "Name of the partner organization", example = "Organization ABC") + private String orgName; + + @Schema(description = "Type of the device (e.g., FACE, FINGER, IRIS)", example = "FINGER") + private String deviceType; + + @Schema(description = "Subtype of the device (e.g., single, double)", example = "single") + private String deviceSubType; + + @Schema(description = "Status of the device (e.g., approved, rejected, pending_approval, deactivated)", allowableValues = {"approved", "rejected", "pending_approval", "deactivated"}, example = "approved") + private String status; + + @Schema(description = "Make of the device", example = "Make123") + private String make; + + @Schema(description = "Model of the device", example = "Model02") + private String model; + + @Schema(description = "Date and time when the record was created", example = "2024-08-01T14:30:00Z") + private LocalDateTime createdDateTime; + + @Schema(description = "Unique identifier for the Secure Biometric Interface (SBI) associated with the device.", example = "sbi12") + private String sbiId; + + @Schema(description = "Software version of the Secure Biometric Interface (SBI).", example = "sw12") + private String sbiVersion; + +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/FtmChipDetailsDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/FtmChipDetailsDto.java new file mode 100644 index 0000000000..1d890c3533 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/FtmChipDetailsDto.java @@ -0,0 +1,47 @@ +package io.mosip.pms.device.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Date; + +@Data +public class FtmChipDetailsDto { + + @Schema(description = "Unique identifier for the FTM Chip details added by the partner", example = "ftp-001") + private String ftmId; + + @Schema(description = "Unique identifier for the partner", example = "partner123") + private String partnerId; + + @Schema(description = "Current status of the partner. Possible values are approved, deactivated and InProgress", example = "approved") + private String partnerStatus; + + @Schema(description = "Make of the FTM chip", example = "make-123") + private String make; + + @Schema(description = "Model of the FTM chip", example = "model-123") + private String model; + + @Schema(description = "Current status of the FTM chip details added by the partner. Possible values are pending_cert_upload, pending_approval, rejected, approved", example = "pending_approval") + private String status; + + @Schema(description = "Indicates whether the FTM chip details is active (true if active, false otherwise)", example = "false") + private Boolean isActive; + + @Schema(description = "Indicates whether the FTM Chip certificate is available (true if available, false otherwise)", example = "true") + private Boolean isCertificateAvailable; + + @Schema(description = "Date and time in ISO format indicating when the FTM Chip certificate was uploaded", example = "2024-07-15T10:00:00Z") + private LocalDateTime certificateUploadDateTime; + + @Schema(description = "Date and time in ISO format indicating when the FTM Chip certificate will expire", example = "2025-07-15T10:00:00Z") + private LocalDateTime certificateExpiryDateTime; + + @Schema(description = "Indicates whether the FTM certificate is expired (true if expired, false otherwise)", example = "false") + private Boolean isCertificateExpired; + + @Schema(description = "Date and time in ISO format indicating when the FTM Chip details were added by the partner", example = "2024-08-01T14:30:00Z") + private LocalDateTime createdDateTime; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/FtmChipFilterDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/FtmChipFilterDto.java new file mode 100644 index 0000000000..2caf827e0c --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/FtmChipFilterDto.java @@ -0,0 +1,13 @@ +package io.mosip.pms.device.dto; + +import lombok.Data; + +@Data +public class FtmChipFilterDto { + private String partnerId; + private String orgName; + private String ftmId; + private String make; + private String model; + private String status; +} \ No newline at end of file diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/SbiDetailsDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/SbiDetailsDto.java new file mode 100644 index 0000000000..44929b5572 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/SbiDetailsDto.java @@ -0,0 +1,47 @@ +package io.mosip.pms.device.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Data +@Getter +@Setter +public class SbiDetailsDto { + @Schema(description = "Unique identifier for the SBI", example = "sbi-001") + private String sbiId; + + @Schema(description = "Version of the SBI", example = "1.0.0") + private String sbiVersion; + + @Schema(description = "Unique identifier for the partner", example = "partner123") + private String partnerId; + + @Schema(description = "Current status of the SBI", example = "approved") + private String status; + + @Schema(description = "Indicates whether the SBI is active (true if active, false otherwise)", example = "false") + private boolean isSbiActive; + + @Schema(description = "Indicates whether the SBI is expired (true if expired, false otherwise)", example = "false") + private boolean isSbiExpired; + + @Schema(description = "Number of approved devices associated with the SBI", example = "29") + private Integer countOfApprovedDevices; + + @Schema(description = "Number of pending devices associated with the SBI", example = "10") + private Integer countOfPendingDevices; + + @Schema(description = "Date and time when the SBI was created", example = "2024-07-15T10:00:00Z") + private LocalDateTime sbiCreatedDateTime; + + @Schema(description = "Date and time when the SBI expires", example = "2025-07-15T10:00:00Z") + private LocalDateTime sbiExpiryDateTime; + + @Schema(description = "Date and time when the record was created", example = "2024-08-01T14:30:00Z") + private LocalDateTime createdDateTime; + +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/SbiFilterDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/SbiFilterDto.java new file mode 100644 index 0000000000..9e8b092091 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/dto/SbiFilterDto.java @@ -0,0 +1,14 @@ +package io.mosip.pms.device.dto; + +import lombok.Data; + +@Data +public class SbiFilterDto { + + private String partnerId; + private String orgName; + private String sbiId; + private String sbiVersion; + private String status; + private String sbiExpiryStatus; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/request/dto/DeactivateDeviceRequestDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/request/dto/DeactivateDeviceRequestDto.java new file mode 100644 index 0000000000..8f95c195d2 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/request/dto/DeactivateDeviceRequestDto.java @@ -0,0 +1,11 @@ +package io.mosip.pms.device.request.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class DeactivateDeviceRequestDto { + + @Schema(description = "Status for deactivate device", example = "De-Activate") + private String status; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/request/dto/DeactivateFtmRequestDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/request/dto/DeactivateFtmRequestDto.java new file mode 100644 index 0000000000..273aeb1e4e --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/request/dto/DeactivateFtmRequestDto.java @@ -0,0 +1,11 @@ +package io.mosip.pms.device.request.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class DeactivateFtmRequestDto { + + @Schema(description = "Status for deactivate FTM", example = "De-Activate") + private String status; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/request/dto/DeactivateSbiRequestDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/request/dto/DeactivateSbiRequestDto.java new file mode 100644 index 0000000000..8dd08b7779 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/request/dto/DeactivateSbiRequestDto.java @@ -0,0 +1,11 @@ +package io.mosip.pms.device.request.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class DeactivateSbiRequestDto { + + @Schema(description = "Status for deactivate SBI", example = "De-Activate") + private String status; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/DeviceDetailResponseDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/DeviceDetailResponseDto.java new file mode 100644 index 0000000000..6ab45e1286 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/DeviceDetailResponseDto.java @@ -0,0 +1,18 @@ +package io.mosip.pms.device.response.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class DeviceDetailResponseDto { + @Schema(description = "Unique identifier of Device", example = "12345") + private String deviceId; + + @Schema(description = "Status of the Device (e.g., approved, pending, rejected)", example = "approved") + private String status; + + @Schema(description = "Indicates whether the device is active (true if active, false otherwise)", example = "true") + @JsonProperty("isActive") + private boolean isActive; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/FtmDetailResponseDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/FtmDetailResponseDto.java new file mode 100644 index 0000000000..2b7c58f963 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/FtmDetailResponseDto.java @@ -0,0 +1,19 @@ +package io.mosip.pms.device.response.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class FtmDetailResponseDto { + + @Schema(description = "Unique identifier of FTM Chip Details", example = "ftm456") + private String ftmId; + + @Schema(description = "Status of the FTM Chip details. Possible values are pending_cert_upload, pending_approval, rejected, approved", example = "approved") + private String status; + + @Schema(description = "True indicates that record is Active", example = "false") + @JsonProperty("isActive") + private boolean isActive; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/FtmDetailSummaryDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/FtmDetailSummaryDto.java new file mode 100644 index 0000000000..70be223e31 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/FtmDetailSummaryDto.java @@ -0,0 +1,38 @@ +package io.mosip.pms.device.response.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Date; + +@Data +public class FtmDetailSummaryDto { + + @Schema(description = "Unique identifier for the FTM Chip details added by the partner", example = "ftp-001") + private String ftmId; + + @Schema(description = "Unique identifier for the partner", example = "partner123") + private String partnerId; + + @Schema(description = "Name of the organisation", example = "org123") + private String orgName; + + @Schema(description = "Make of the FTM chip", example = "make-123") + private String make; + + @Schema(description = "Model of the FTM chip", example = "model-123") + private String model; + + @Schema(description = "Current status of the FTM chip details added by the partner. Possible values are pending_cert_upload, pending_approval, rejected, approved, deactivated", example = "pending_approval") + private String status; + + @Schema(description = "Indicates whether the FTM chip details is active (true if active, false otherwise)", example = "false") + private Boolean isActive; + + @Schema(description = "Indicates whether the FTM Chip certificate is available (true if available, false otherwise)", example = "true") + private Boolean isCertificateAvailable; + + @Schema(description = "Date and time in ISO format indicating when the FTM Chip details were added by the partner", example = "2024-08-01T14:30:00Z") + private LocalDateTime createdDateTime; +} \ No newline at end of file diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/SbiDetailsResponseDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/SbiDetailsResponseDto.java new file mode 100644 index 0000000000..bf099935ee --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/SbiDetailsResponseDto.java @@ -0,0 +1,22 @@ +package io.mosip.pms.device.response.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class SbiDetailsResponseDto { + + @Schema(description = "Unique identifier for the SBI", example = "sbi-001") + private String sbiId; + + @Schema(description = "Version of the SBI", example = "1.0.0") + private String sbiVersion; + + @Schema(description = "Status of SBI (e.g., approved, pending, rejected)", example = "approved") + private String status; + + @Schema(description = "Indicates whether the device is active (true if active, false otherwise)", example = "true") + @JsonProperty("isActive") + private boolean isActive; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/SbiSummaryDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/SbiSummaryDto.java new file mode 100644 index 0000000000..d687088cee --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/device/response/dto/SbiSummaryDto.java @@ -0,0 +1,49 @@ +package io.mosip.pms.device.response.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class SbiSummaryDto { + + @Schema(description = "Unique identifier for the partner", example = "partner123") + private String partnerId; + + @Schema(description = "Name of the partner organisation", example = "abc") + private String orgName; + + @Schema(description = "Unique identifier for the SBI", example = "sbi-001") + private String sbiId; + + @Schema(description = "Version of the SBI", example = "1.0.0") + private String sbiVersion; + + @Schema(description = "Current status of the SBI", example = "approved") + private String status; + + @Schema(description = "Indicates whether the SBI is active (true if active, false otherwise)", example = "false") + private Boolean isActive; + + @Schema(description = "Date and time when the SBI was created", example = "2024-07-15T10:00:00Z") + private LocalDateTime sbiCreatedDateTime; + + @Schema(description = "Date and time when the SBI expires", example = "2025-07-15T10:00:00Z") + private LocalDateTime sbiExpiryDateTime; + + @Schema(description = "Current status of the SBI based on expiry date time", example = "expired") + private String sbiExpiryStatus; + + @Schema(description = "Number of approved devices associated with the SBI", example = "29") + private Long countOfAssociatedDevices; + + @Schema(description = "Number of approved devices associated with the SBI", example = "29") + private Long countOfApprovedDevices; + + @Schema(description = "Number of pending devices associated with the SBI", example = "10") + private Long countOfPendingDevices; + + @Schema(description = "Date and time when the record was created", example = "2024-08-01T14:30:00Z") + private LocalDateTime createdDateTime; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/controller/ClientManagementController.java b/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/controller/ClientManagementController.java index 8740dab378..a7b17092e7 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/controller/ClientManagementController.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/controller/ClientManagementController.java @@ -1,13 +1,17 @@ package io.mosip.pms.oauth.client.controller; +import io.mosip.pms.common.dto.PageResponseV2Dto; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; import io.mosip.pms.device.util.AuditUtil; import io.mosip.pms.oauth.client.dto.*; import io.mosip.pms.oidc.client.contant.ClientServiceAuditEnum; +import io.mosip.pms.partner.util.PartnerHelper; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; -import org.springframework.beans.factory.annotation.Value; import io.mosip.pms.oauth.client.service.ClientManagementService; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.RestController; @@ -30,12 +34,10 @@ public class ClientManagementController { ClientManagementService clientManagementService; @Autowired - AuditUtil auditUtil; - - @Value("${mosip.pms.api.id.all.oidc.clients.get}") - private String getAllOidcClientsId; + PartnerHelper partnerHelper; - public static final String VERSION = "1.0"; + @Autowired + AuditUtil auditUtil; @RequestMapping(value = "/oauth/client", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseWrapper createOAUTHClient( @@ -94,20 +96,51 @@ public ResponseWrapper getOIDCClient(@PathVariable("client_id") St return response; } - @PreAuthorize("hasAnyRole(@authorizedRoles.getGetalloidcclients())") - @GetMapping(value = "/getAllOidcClients") - @Operation(summary = "Get all Oidc clients", description = "fetch all oidc clients") + @PreAuthorize("hasAnyRole(@authorizedRoles.getGetoauthpartnersclients())") + @GetMapping(value = "/oauth/client") + @Operation(summary = "This endpoint retrieves a list of all OAuth clients created by the Auth Partners.", + description = "Available since release-1.3.x. This endpoint supports pagination, sorting, and and filtering based on optional query parameters. If the token used to access this endpoint, does not have the PARTNER_ADMIN role, then it will fetch all the OAuth clients created by all the partners associated with the logged in user only. If the token used to access this endpoint, has PARTNER_ADMIN role, then it will fetch all the OAuth clients created by all the partners. It is configured for PARTNER_ADMIN and AUTH_PARTNER roles.") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true)))}) - public ResponseWrapper> getAllOidcClients() { - ResponseWrapper> responseWrapper = new ResponseWrapper<>(); - responseWrapper.setId(getAllOidcClientsId); - responseWrapper.setVersion(VERSION); - responseWrapper.setResponse(clientManagementService.getAllOidcClients()); - return responseWrapper; + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true)))}) + public ResponseWrapperV2> getPartnersClients( + @RequestParam(value = "sortFieldName", required = false) String sortFieldName, + @RequestParam(value = "sortType", required = false) String sortType, + @RequestParam(value = "pageNo", required = false) Integer pageNo, + @RequestParam(value = "pageSize", required = false) Integer pageSize, + @RequestParam(value = "partnerId", required = false) String partnerId, + @RequestParam(value = "orgName", required = false) String orgName, + @RequestParam(value = "policyGroupName", required = false) String policyGroupName, + @RequestParam(value = "policyName", required = false) String policyName, + @RequestParam(value = "clientName", required = false) String clientName, + @Parameter( + description = "Status of OAuth client", + in = ParameterIn.QUERY, + schema = @Schema(allowableValues = {"ACTIVE", "INACTIVE"}) + ) + @RequestParam(value = "status", required = false) String status + ) { + partnerHelper.validateRequestParameters(partnerHelper.oidcClientsAliasToColumnMap, sortFieldName, sortType, pageNo, pageSize); + ClientFilterDto filterDto = new ClientFilterDto(); + if (partnerId != null) { + filterDto.setPartnerId(partnerId.toLowerCase()); + } + if (orgName != null) { + filterDto.setOrgName(orgName.toLowerCase()); + } + if (policyGroupName != null) { + filterDto.setPolicyGroupName(policyGroupName.toLowerCase()); + } + if (policyName != null) { + filterDto.setPolicyName(policyName.toLowerCase()); + } + if (clientName != null) { + filterDto.setClientName(clientName.toLowerCase()); + } + if (status != null) { + filterDto.setStatus(status); + } + return clientManagementService.getPartnersClients(sortFieldName, sortType, pageNo, pageSize, filterDto); } } \ No newline at end of file diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/dto/ClientFilterDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/dto/ClientFilterDto.java new file mode 100644 index 0000000000..47bb1e606d --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/dto/ClientFilterDto.java @@ -0,0 +1,13 @@ +package io.mosip.pms.oauth.client.dto; + +import lombok.Data; + +@Data +public class ClientFilterDto { + private String partnerId; + private String orgName; + private String policyGroupName; + private String policyName; + private String clientName; + private String status; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/dto/ClientSummaryDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/dto/ClientSummaryDto.java new file mode 100644 index 0000000000..94267802e3 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/dto/ClientSummaryDto.java @@ -0,0 +1,46 @@ +package io.mosip.pms.oauth.client.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +public class ClientSummaryDto { + + @Schema(description = "Unique identifier for the partner", example = "partner123") + private String partnerId; + + @Schema(description = "Name of the partner organisation", example = "abc") + private String orgName; + + @Schema(description = "Unique identifier for the policy group", example = "policyGroup789") + private String policyGroupId; + + @Schema(description = "Name of the policy group", example = "Security Policies") + private String policyGroupName; + + @Schema(description = "Description of the policy group", example = "Security Policies") + private String policyGroupDescription; + + @Schema(description = "Name of the policy", example = "Data Protection Policy") + private String policyName; + + @Schema(description = "Description of the policy", example = "Data Protection Policy") + private String policyDescription; + + @Schema(description = "Unique identifier for the OIDC (OpenID Connect) client", example = "oidcClient456") + private String clientId; + + @Schema(description = "Name of the OIDC client", example = "MyOIDCClient") + private String clientName; + + @Schema(description = "Current status of the OIDC client", example = "active") + private String status; + + @Schema(description = "Date and time when the record was last updated", example = "2024-08-08T12:00:00Z") + private Date updatedDateTime; + + @Schema(description = "Date and time when the record was created", example = "2024-08-08T10:00:00Z") + private Date createdDateTime; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/dto/OidcClientDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/dto/OidcClientDto.java deleted file mode 100644 index 08fedbc893..0000000000 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/dto/OidcClientDto.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.mosip.pms.oauth.client.dto; - -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Data -public class OidcClientDto { - private String UserId; - private String partnerId; - private String oidcClientId; - private String oidcClientName; - private String policyGroupId; - private String policyGroupName; - private String policyGroupDescription; - private String policyId; - private String policyName; - private String policyNameDescription; - private String relyingPartyId; - private String logoUri; - private List redirectUris; - private String publicKey; - private String status; - private List grantTypes; - private LocalDateTime crDtimes; - private LocalDateTime updDtimes; - private List clientAuthMethods; -} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/service/ClientManagementService.java b/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/service/ClientManagementService.java index 3329d4a400..0ccb4f739a 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/service/ClientManagementService.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/service/ClientManagementService.java @@ -1,5 +1,7 @@ package io.mosip.pms.oauth.client.service; +import io.mosip.pms.common.dto.PageResponseV2Dto; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; import io.mosip.pms.oauth.client.dto.*; import java.util.List; @@ -53,5 +55,5 @@ public interface ClientManagementService { ClientDetailResponse updateOAuthClient(String clientId, ClientDetailUpdateRequestV2 updateRequest) throws Exception; - List getAllOidcClients(); + ResponseWrapperV2> getPartnersClients(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, ClientFilterDto filterDto); } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/service/impl/ClientManagementServiceImpl.java b/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/service/impl/ClientManagementServiceImpl.java index 8d2c17ea52..040017dce7 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/service/impl/ClientManagementServiceImpl.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/oauth/client/service/impl/ClientManagementServiceImpl.java @@ -1,20 +1,29 @@ package io.mosip.pms.oauth.client.service.impl; -import java.io.ByteArrayInputStream; -import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; +import java.security.PublicKey; import java.util.*; +import com.nimbusds.jose.jwk.ECKey; +import com.nimbusds.jose.jwk.JWK; +import com.nimbusds.jose.jwk.OctetKeyPair; +import com.nimbusds.jose.jwk.RSAKey; import io.mosip.kernel.core.authmanager.authadapter.model.AuthUserDetails; import io.mosip.pms.common.entity.*; import io.mosip.pms.common.entity.ClientDetail; import io.mosip.pms.common.repository.*; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; import io.mosip.pms.device.util.AuditUtil; import io.mosip.pms.oauth.client.dto.*; import io.mosip.pms.oidc.client.contant.ClientServiceAuditEnum; -import io.mosip.pms.partner.request.dto.PartnerCertDownloadRequestDto; +import io.mosip.pms.partner.util.MultiPartnerUtil; +import io.mosip.pms.partner.util.PartnerHelper; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.http.MediaType; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @@ -33,6 +42,7 @@ import io.mosip.pms.common.dto.PartnerDataPublishDto; import io.mosip.pms.common.dto.PolicyPublishDto; import io.mosip.pms.common.dto.Type; +import io.mosip.pms.common.dto.PageResponseV2Dto; import io.mosip.pms.common.exception.ApiAccessibleException; import io.mosip.pms.common.helper.WebSubPublisher; import io.mosip.pms.common.util.AuthenticationContextRefUtil; @@ -43,16 +53,13 @@ import io.mosip.pms.oauth.client.service.ClientManagementService; import io.mosip.pms.partner.constant.ErrorCode; import io.mosip.pms.partner.constant.PartnerConstants; -import io.mosip.pms.partner.constant.PartnerServiceAuditEnum; import io.mosip.pms.partner.exception.PartnerServiceException; import io.mosip.pms.partner.response.dto.PartnerCertDownloadResponeDto; import java.io.IOException; -import java.security.NoSuchAlgorithmException; import java.time.LocalDateTime; import java.time.ZoneId; +import java.util.stream.Collectors; -import org.jose4j.jwk.RsaJsonWebKey; -import org.jose4j.lang.JoseException; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; @@ -75,6 +82,15 @@ public class ClientManagementServiceImpl implements ClientManagementService { private static final String ERROR_MESSAGE = "errorMessage"; public static final String ACTIVE = "ACTIVE"; public static final String BLANK_STRING = ""; + public static final String VERSION = "1.0"; + public static final String NONE_LANG_KEY = "@none"; + public static final String ENG_KEY = "eng"; + + @Value("${mosip.pms.api.id.oauth.clients.get}") + private String getClientsId; + + @Value("${mosip.pms.api.id.oauth.partners.clients.get}") + private String getPartnersClientsId; @Autowired ObjectMapper objectMapper; @@ -82,6 +98,9 @@ public class ClientManagementServiceImpl implements ClientManagementService { @Autowired ClientDetailRepository clientDetailRepository; + @Autowired + ClientSummaryRepository clientSummaryRepository; + @Autowired AuthPolicyRepository authPolicyRepository; @@ -109,6 +128,9 @@ public class ClientManagementServiceImpl implements ClientManagementService { @Autowired private AuthenticationContextRefUtil authenticationContextClassRefUtil; + @Autowired + PartnerHelper partnerHelper; + @Override public ClientDetailResponse createOIDCClient(ClientDetailCreateRequest createRequest) throws Exception { ProcessedClientDetail processedClientDetail = processCreateOIDCClient(createRequest); @@ -121,24 +143,52 @@ public ClientDetailResponse createOIDCClient(ClientDetailCreateRequest createReq response.setStatus(clientDetail.getStatus()); return response; } - + + private List validateUserId() { + String userId = getUserId(); + List partnerList = partnerServiceRepository.findByUserId(userId); + return partnerList; + } + + private boolean validatePartnerIdBelongsToUser(List partnerList, String partnerId) { + boolean isPartnerBelongsToUser = false; + for (Partner partner : partnerList) { + if (partner.getId().equals(partnerId)) { + isPartnerBelongsToUser = true; + break; + } + } + return isPartnerBelongsToUser; + } + @Override public ClientDetailResponse createOAuthClient(ClientDetailCreateRequestV2 createRequest) throws Exception { ProcessedClientDetail processedClientDetail = processCreateOIDCClient(createRequest); ClientDetail clientDetail = processedClientDetail.getClientDetail(); callEsignetService(clientDetail, environment.getProperty("mosip.pms.esignet.oauth-client-create-url"), true, createRequest.getClientNameLangMap()); + String clientName=getClientNameLanguageMapAsJsonString( + createRequest.getClientNameLangMap(), + createRequest.getName() + ); + clientDetail.setName(clientName); publishClientData(processedClientDetail.getPartner(), processedClientDetail.getPolicy(), clientDetail); clientDetailRepository.save(clientDetail); var response = new ClientDetailResponse(); response.setClientId(clientDetail.getId()); - response.setStatus(clientDetail.getStatus()); + response.setStatus(clientDetail.getStatus()); return response; - + } - public ProcessedClientDetail processCreateOIDCClient(ClientDetailCreateRequest createRequest) throws NoSuchAlgorithmException { - String publicKey = getJWKString(createRequest.getPublicKey()); - String clientId = CryptoUtil.encodeToURLSafeBase64(HMACUtils2.generateHash(publicKey.getBytes())); + public ProcessedClientDetail processCreateOIDCClient(ClientDetailCreateRequest createRequest) throws Exception { + //get the JWK from request + Map jwkKeyFromRequest = createRequest.getPublicKey(); + //get String form of JWK + String jwkKeyString = getJWKString(jwkKeyFromRequest); + //Generate a new public key using the key's most significant fields from the JWK + String generatedPublicKey = createPublicKeyFromJWK(jwkKeyFromRequest); + //Create a Base64-encoded hash of the newly generated public key to check for duplicate keys + String clientId = CryptoUtil.encodeToURLSafeBase64(HMACUtils2.generateHash(generatedPublicKey.getBytes())); Optional result = clientDetailRepository.findById(clientId); if (result.isPresent()) { LOGGER.error("createOIDCClient::Client with name {} already exists", createRequest.getName()); @@ -147,6 +197,28 @@ public ProcessedClientDetail processCreateOIDCClient(ClientDetailCreateRequest c throw new PartnerServiceException(ErrorCode.DUPLICATE_CLIENT.getErrorCode(), ErrorCode.DUPLICATE_CLIENT.getErrorMessage()); } + boolean isAdmin = partnerHelper.isPartnerAdmin(authUserDetails().getAuthorities().toString()); + // Skip the below checks if the user is logged in as a partner_admin + if (!isAdmin) { + // Validate the logged-in user ID and fetch the list of partners associated to it + List partnerList = validateUserId(); + if (partnerList.isEmpty()) { + LOGGER.error("sessionId", "idType", "id", "User id does not exist."); + auditUtil.setAuditRequestDto(ClientServiceAuditEnum.CREATE_CLIENT_FAILURE, createRequest.getName(), + clientId); + throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); + } + // Check if the partner ID belongs to the user. + boolean isValidPartner = validatePartnerIdBelongsToUser(partnerList, createRequest.getAuthPartnerId()); + if (!isValidPartner) { + LOGGER.error("sessionId", "idType", "id", "The given partner ID does not belong to the user."); + auditUtil.setAuditRequestDto(ClientServiceAuditEnum.CREATE_CLIENT_FAILURE, createRequest.getName(), + clientId); + throw new PartnerServiceException(ErrorCode.PARTNER_NOT_BELONGS_TO_THE_USER_CREATE_OIDC.getErrorCode(), + ErrorCode.PARTNER_NOT_BELONGS_TO_THE_USER_CREATE_OIDC.getErrorMessage()); + } + } Optional partner = partnerRepository.findById(createRequest.getAuthPartnerId()); if(partner.isEmpty()) { LOGGER.error("createOIDCClient::AuthPartner with Id {} doesn't exists", createRequest.getAuthPartnerId()); @@ -206,7 +278,7 @@ public ProcessedClientDetail processCreateOIDCClient(ClientDetailCreateRequest c } ClientDetail clientDetail = new ClientDetail(); - clientDetail.setPublicKey(publicKey); + clientDetail.setPublicKey(jwkKeyString); clientDetail.setId(clientId); clientDetail.setName(createRequest.getName()); clientDetail.setRpId(createRequest.getAuthPartnerId()); @@ -446,22 +518,27 @@ public ClientDetailResponse updateOIDCClient(String clientId, ClientDetailUpdate response.setStatus(clientDetail.getStatus()); notify(MapperUtils.mapClientDataToPublishDto(clientDetail), EventType.OIDC_CLIENT_UPDATED); return response; - } - - + } + + @Override public ClientDetailResponse updateOAuthClient(String clientId, ClientDetailUpdateRequestV2 updateRequest) throws Exception { - + ClientDetail clientDetail = processUpdateOIDCClient(clientId,updateRequest); makeUpdateEsignetServiceCall(clientDetail, environment.getProperty("mosip.pms.esignet.oauth-client-update-url"), true, updateRequest.getClientNameLangMap()); + String clientName=getClientNameLanguageMapAsJsonString( + updateRequest.getClientNameLangMap(), + updateRequest.getClientName() + ); + clientDetail.setName(clientName); clientDetail = clientDetailRepository.save(clientDetail); var response = new ClientDetailResponse(); response.setClientId(clientDetail.getId()); response.setStatus(clientDetail.getStatus()); notify(MapperUtils.mapClientDataToPublishDto(clientDetail), EventType.OIDC_CLIENT_UPDATED); return response; - } + } @@ -489,20 +566,48 @@ public ClientDetail processUpdateOIDCClient(String clientId, ClientDetailUpdateR throw new PartnerServiceException(ErrorCode.INVALID_PARTNERID.getErrorCode(), String.format(ErrorCode.INVALID_PARTNERID.getErrorMessage(), partnerId)); } - //check if Partner is Active or not - if (!partner.get().getIsActive()) { - LOGGER.error("updateOIDCClient::Partner is not Active with id {}", clientId); - auditUtil.setAuditRequestDto(ClientServiceAuditEnum.UPDATE_CLIENT_FAILURE); - throw new PartnerServiceException(ErrorCode.PARTNER_NOT_ACTIVE_EXCEPTION.getErrorCode(), - ErrorCode.PARTNER_NOT_ACTIVE_EXCEPTION.getErrorMessage()); + + boolean isAdmin = partnerHelper.isPartnerAdmin(authUserDetails().getAuthorities().toString()); + // Skip the below checks if the user is logged in as a partner_admin + if (!isAdmin) { + // Validate the logged-in user ID and fetch the list of partners associated to it + List partnerList = validateUserId(); + if (partnerList.isEmpty()) { + LOGGER.error("sessionId", "idType", "id", "User id does not exist."); + auditUtil.setAuditRequestDto(ClientServiceAuditEnum.UPDATE_CLIENT_FAILURE); + throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); + } + // Check if the partner ID belongs to the user. + boolean isValidPartner = validatePartnerIdBelongsToUser(partnerList, partnerId); + if (!isValidPartner) { + LOGGER.error("sessionId", "idType", "id", "The given partner ID does not belong to the user."); + auditUtil.setAuditRequestDto(ClientServiceAuditEnum.UPDATE_CLIENT_FAILURE); + throw new PartnerServiceException(ErrorCode.PARTNER_NOT_BELONGS_TO_THE_USER_UPDATE_OIDC.getErrorCode(), + ErrorCode.PARTNER_NOT_BELONGS_TO_THE_USER_UPDATE_OIDC.getErrorMessage()); + } + } + if ( !isAdmin || (isAdmin && result.get().getStatus().equalsIgnoreCase(updateRequest.getStatus()))) { + //check if Partner is Active or not + if (!partner.get().getIsActive()) { + LOGGER.error("updateOIDCClient::Partner is not Active with id {}", clientId); + auditUtil.setAuditRequestDto(ClientServiceAuditEnum.UPDATE_CLIENT_FAILURE); + throw new PartnerServiceException(ErrorCode.PARTNER_NOT_ACTIVE_EXCEPTION.getErrorCode(), + ErrorCode.PARTNER_NOT_ACTIVE_EXCEPTION.getErrorMessage()); + } } ClientDetail clientDetail = result.get(); + if (!result.get().getStatus().equalsIgnoreCase(updateRequest.getStatus())) { + clientDetail.setStatus(updateRequest.getStatus().toUpperCase()); + clientDetail.setUpdatedDateTime(LocalDateTime.now(ZoneId.of("UTC"))); + clientDetail.setUpdatedBy(getLoggedInUserId()); + return clientDetail; + } clientDetail.setName(updateRequest.getClientName()); clientDetail.setLogoUri(updateRequest.getLogoUri()); clientDetail.setRedirectUris(String.join(",", updateRequest.getRedirectUris())); clientDetail.setGrantTypes(String.join(",", updateRequest.getGrantTypes())); clientDetail.setClientAuthMethods(String.join(",", updateRequest.getClientAuthMethods())); - clientDetail.setStatus(updateRequest.getStatus().toUpperCase()); clientDetail.setUpdatedDateTime(LocalDateTime.now(ZoneId.of("UTC"))); clientDetail.setUpdatedBy(getLoggedInUserId()); return clientDetail; @@ -516,9 +621,9 @@ public ClientDetail processUpdateOIDCClient(String clientId, ClientDetailUpdateR */ private String getJWKString(Map jwk) { try { - RsaJsonWebKey jsonWebKey = new RsaJsonWebKey(jwk); - return jsonWebKey.toJson(); - } catch (JoseException e) { + JWK jsonWebKey = JWK.parse(jwk); + return objectMapper.writeValueAsString(jsonWebKey.toJSONObject()); + } catch (Exception e) { LOGGER.error("createOIDCClient::Failed to process Client Public Key"); throw new PartnerServiceException(ErrorCode.FAILED_TO_PROCESS_JWK.getErrorCode(), ErrorCode.FAILED_TO_PROCESS_JWK.getErrorMessage()); @@ -594,7 +699,26 @@ public io.mosip.pms.oauth.client.dto.ClientDetail getClientDetails(String client throw new PartnerServiceException(ErrorCode.CLIENT_NOT_EXISTS.getErrorCode(), ErrorCode.CLIENT_NOT_EXISTS.getErrorMessage()); } - + boolean isAdmin = partnerHelper.isPartnerAdmin(authUserDetails().getAuthorities().toString()); + // Skip the below checks if the user is logged in as a partner_admin + if (!isAdmin) { + // Validate the logged-in user ID and fetch the list of partners associated to it + List partnerList = validateUserId(); + if (partnerList.isEmpty()) { + LOGGER.error("sessionId", "idType", "id", "User id does not exist."); + auditUtil.setAuditRequestDto(ClientServiceAuditEnum.GET_CLIENT_FAILURE); + throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); + } + // Check if the partner ID belongs to the user. + boolean isValidPartner = validatePartnerIdBelongsToUser(partnerList, result.get().getRpId()); + if (!isValidPartner) { + LOGGER.error("sessionId", "idType", "id", "The given partner ID does not belong to the user."); + auditUtil.setAuditRequestDto(ClientServiceAuditEnum.GET_CLIENT_FAILURE); + throw new PartnerServiceException(ErrorCode.PARTNER_NOT_BELONGS_TO_THE_USER_GET_OIDC.getErrorCode(), + ErrorCode.PARTNER_NOT_BELONGS_TO_THE_USER_GET_OIDC.getErrorMessage()); + } + } io.mosip.pms.oauth.client.dto.ClientDetail dto = new io.mosip.pms.oauth.client.dto.ClientDetail(); Optional policyFromDb = authPolicyRepository.findById(result.get().getPolicyId()); dto.setId(result.get().getId()); @@ -613,65 +737,81 @@ public io.mosip.pms.oauth.client.dto.ClientDetail getClientDetails(String client return dto; } + private String getClientNameLanguageMapAsJsonString(Map clientNameMap, String clientName) { + clientNameMap.put(NONE_LANG_KEY, clientName); + JSONObject clientNameObject = new JSONObject(clientNameMap); + return clientNameObject.toString(); + } + @Override - public List getAllOidcClients() { - List oidcClientDtoList = new ArrayList<>(); + public ResponseWrapperV2> getPartnersClients(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, ClientFilterDto filterDto) { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); try { - String userId = getUserId(); - List partnerList = partnerServiceRepository.findByUserId(userId); - for (Partner partner : partnerList) { - String partnerId = partner.getId(); - if (Objects.isNull(partnerId) || partnerId.equals(BLANK_STRING)) { - LOGGER.info("Partner Id is null or empty for user id : " + userId); - throw new PartnerServiceException(ErrorCode.PARTNER_ID_NOT_EXISTS.getErrorCode(), - ErrorCode.PARTNER_ID_NOT_EXISTS.getErrorMessage()); + PageResponseV2Dto pageResponseV2Dto = new PageResponseV2Dto<>(); + + boolean isPartnerAdmin = partnerHelper.isPartnerAdmin(authUserDetails().getAuthorities().toString()); + List partnerIdList = null; + if (!isPartnerAdmin) { + String userId = getUserId(); + List partnerList = partnerServiceRepository.findByUserId(userId); + if (partnerList.isEmpty()) { + LOGGER.info("sessionId", "idType", "id", "User id does not exists."); + throw new PartnerServiceException(io.mosip.pms.partner.constant.ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + io.mosip.pms.partner.constant.ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); } - List clientDetailList = new ArrayList<>(); - clientDetailList = clientDetailRepository.findAllByPartnerId(partnerId); - for (ClientDetail clientDetail : clientDetailList){ - Optional authPolicy = authPolicyRepository.findById(clientDetail.getPolicyId()); - if (!authPolicy.isPresent()) { - LOGGER.info("Policy does not exists."); - throw new PartnerServiceException(ErrorCode.POLICY_NOT_EXIST.getErrorCode(), - ErrorCode.POLICY_NOT_EXIST.getErrorMessage()); - } - PolicyGroup policyGroup = authPolicy.get().getPolicyGroup(); - if (Objects.isNull(policyGroup)) { - LOGGER.info("Policy Group is null or empty"); - throw new PartnerServiceException(ErrorCode.POLICY_GROUP_NOT_EXISTS.getErrorCode(), - ErrorCode.POLICY_GROUP_NOT_EXISTS.getErrorMessage()); - } - OidcClientDto oidcClientDto = new OidcClientDto(); - oidcClientDto.setPartnerId(partnerId); - oidcClientDto.setUserId(userId); - oidcClientDto.setOidcClientId(clientDetail.getId()); - oidcClientDto.setOidcClientName(clientDetail.getName()); - oidcClientDto.setPolicyGroupId(policyGroup.getId()); - oidcClientDto.setPolicyGroupName(policyGroup.getName()); - oidcClientDto.setPolicyGroupDescription(policyGroup.getDesc()); - oidcClientDto.setPolicyId(authPolicy.get().getId()); - oidcClientDto.setPolicyName(authPolicy.get().getName()); - oidcClientDto.setPolicyNameDescription(authPolicy.get().getDescr()); - oidcClientDto.setRelyingPartyId(clientDetail.getRpId()); - oidcClientDto.setLogoUri(clientDetail.getLogoUri()); - oidcClientDto.setRedirectUris(convertStringToList(clientDetail.getRedirectUris())); - oidcClientDto.setPublicKey(clientDetail.getPublicKey()); - oidcClientDto.setStatus(clientDetail.getStatus()); - oidcClientDto.setGrantTypes(convertStringToList(clientDetail.getGrantTypes())); - oidcClientDto.setCrDtimes(clientDetail.getCreatedDateTime()); - oidcClientDto.setUpdDtimes(clientDetail.getUpdatedDateTime()); - oidcClientDto.setClientAuthMethods(convertStringToList(clientDetail.getClientAuthMethods())); - oidcClientDtoList.add(oidcClientDto); + partnerIdList = new ArrayList<>(); + for (Partner partner : partnerList) { + partnerHelper.validatePartnerId(partner, userId); + partnerHelper.validatePolicyGroupId(partner, userId); + partnerHelper.validatePolicyGroup(partner); + partnerIdList.add(partner.getId()); } } + + Pageable pageable = Pageable.unpaged(); + + // Pagination + boolean isPaginationEnabled = (pageNo != null && pageSize != null); + if (isPaginationEnabled) { + pageable = PageRequest.of(pageNo, pageSize); + } + + //Sorting + if (isPaginationEnabled && Objects.nonNull(sortFieldName) && Objects.nonNull(sortType)) { + Sort sort = partnerHelper.getSortingRequest(getSortColumn(partnerHelper.oidcClientsAliasToColumnMap, sortFieldName), sortType); + pageable = PageRequest.of(pageNo, pageSize, sort); + } + Page page = clientSummaryRepository. + getSummaryOfAllPartnerClients(filterDto.getPartnerId(), filterDto.getOrgName(), + filterDto.getPolicyGroupName(), filterDto.getPolicyName(), + filterDto.getClientName(), filterDto.getStatus(), partnerIdList, isPartnerAdmin, pageable); + if (Objects.nonNull(page) && !page.getContent().isEmpty()) { + List clientSummaryDtoList = MapperUtils.mapAll(page.getContent(), ClientSummaryDto.class); + pageResponseV2Dto.setPageNo(page.getNumber()); + pageResponseV2Dto.setPageSize(page.getSize()); + pageResponseV2Dto.setTotalResults(page.getTotalElements()); + pageResponseV2Dto.setData(clientSummaryDtoList); + } + responseWrapper.setResponse(pageResponseV2Dto); + + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In getAllPartnersClients method of ClientManagementServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); } catch (Exception ex) { LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); LOGGER.error("sessionId", "idType", "id", - "In getAllOidcClients method of ClientManagementServiceImpl - " + ex.getMessage()); - throw new PartnerServiceException(ErrorCode.OIDC_CLIENTS_FETCH_ERROR.getErrorCode(), - ErrorCode.OIDC_CLIENTS_FETCH_ERROR.getErrorMessage()); - } - return oidcClientDtoList; + "In getAllPartnersClients method of ClientManagementServiceImpl - " + ex.getMessage()); + String errorCode = ErrorCode.OIDC_CLIENTS_FETCH_ERROR.getErrorCode(); + String errorMessage = ErrorCode.OIDC_CLIENTS_FETCH_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getPartnersClientsId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + public String getSortColumn(Map aliasToColumnMap, String alias) { + return aliasToColumnMap.getOrDefault(alias, alias); // Return alias if no match found } private String getUserId() { @@ -682,6 +822,69 @@ private String getUserId() { private AuthUserDetails authUserDetails() { return (AuthUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); } + + /** + * Creates a public key from the provided JWK (JSON Web Key). + + * Supported JWK types: + * - RSA: Represented by "RSA" key type. + * - EC: Represented by "EC" key type (Elliptic Curve). + * - OKP: Represented by "OKP" key type (Octet Key Pair, typically used for EdDSA). + * + * @param jwk A map representing the JSON Web Key. + * @return A Base64 encoded string representation of the public key. + * @throws Exception If the JWK is invalid or an unsupported key type is provided. + */ + public String createPublicKeyFromJWK(Map jwk) throws Exception { + // Parse the JWK + JWK parsedJwk = JWK.parse(jwk); + byte[] publicKeyBytes; + + // Determine the key type and create the corresponding public key + switch (parsedJwk.getKeyType().getValue()) { + case "RSA": + publicKeyBytes = createRSAPublicKey((RSAKey) parsedJwk).getEncoded(); + break; + + case "EC": + publicKeyBytes = createECCPublicKey((ECKey) parsedJwk).getEncoded(); + break; + + case "OKP": + publicKeyBytes = createEdDSAPublicKey((OctetKeyPair) parsedJwk); + break; + + default: + // Throw an exception if the key type is unsupported + throw new UnsupportedOperationException("Unsupported key type: " + parsedJwk.getKeyType()); + } + // Return the public key as a Base64 encoded string + return Base64.getEncoder().encodeToString(publicKeyBytes); + } + + // Method to create an RSA PublicKey from an RSAKey JWK + private PublicKey createRSAPublicKey(RSAKey rsaJwk) throws Exception { + return rsaJwk.toPublicKey(); + } + + // Method to create an EC PublicKey from an ECKey JWK + private PublicKey createECCPublicKey(ECKey ecJwk) throws Exception { + return ecJwk.toPublicKey(); + } + + /* + * Note: The Nimbus library does not provide built-in support for creating + * PublicKey instances from "OKP" key type JWKs (EdDSA). As a workaround, + * the public key bytes are directly extracted from the JWK by retrieving + * the x-coordinate and decoding it from Base64 URL format. + */ + // Method to create an EdDSA PublicKey from an OctetKeyPair JWK + public byte[] createEdDSAPublicKey(OctetKeyPair octetJwk) throws Exception { + // Retrieve the x-coordinate from the EdDSA key and decode it from Base64 URL + String xValue = octetJwk.getX().toString(); + return Base64.getUrlDecoder().decode(xValue); + } + /** * * @param commaSeparatedString diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/oidc/client/contant/ClientServiceAuditEnum.java b/partner/partner-management-service/src/main/java/io/mosip/pms/oidc/client/contant/ClientServiceAuditEnum.java index 7efb5c08b2..70f5ebfd3c 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/oidc/client/contant/ClientServiceAuditEnum.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/oidc/client/contant/ClientServiceAuditEnum.java @@ -21,6 +21,9 @@ public enum ClientServiceAuditEnum { "NO_ID_TYPE", AuditConstant.APPLICATION_NAME, AuditConstant.APPLICATION_ID), UPDATE_CLIENT_FAILURE("PMS_PRT_305", AuditConstant.AUDIT_SYSTEM, "PUT UPDATE OIDC CLIENT", "Updating OIDC Client Failed", AuditConstant.PARTNER_MODULE_ID, AuditConstant.PARTNER_MODULE_NAME, "NO_ID", + "NO_ID_TYPE", AuditConstant.APPLICATION_NAME, AuditConstant.APPLICATION_ID), + GET_CLIENT_FAILURE("PMS_PRT_306", AuditConstant.AUDIT_SYSTEM, "GET OIDC CLIENT", + "Get OIDC Client", AuditConstant.PARTNER_MODULE_ID, AuditConstant.PARTNER_MODULE_NAME, "NO_ID", "NO_ID_TYPE", AuditConstant.APPLICATION_NAME, AuditConstant.APPLICATION_ID); private final String eventId; diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/constant/ErrorCode.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/constant/ErrorCode.java index 90a80c89b4..982b7715cf 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/constant/ErrorCode.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/constant/ErrorCode.java @@ -15,7 +15,9 @@ public enum ErrorCode { INVALID_PAGINATION("PMS_PRT_356", "Pagination cannot be null"), INVALID_SORT_TYPE("PMS_PRT_358", "Sort type %s is not supported"), ERROR_OCCURED_WHILE_SORTING("PMS_PRT_359", "Error occured while sorting"), - INVALID_SORT_FIELD("PMS_PRT_357", "Invalid sort field %s"), + INVALID_SORT_FIELD("PMS_PRT_357", "Invalid sort field %s"), + INVALID_PAGE_NO("PMS_PRT_360", "Invalid Page No"), + INVALID_PAGE_SIZE("PMS_PRT_361", "Invalid page size"), INVALID_VALUE("KER_PRT_390", "Invalid filter value"), PARTNER_ALREADY_REGISTERED_EXCEPTION("PMS_PRT_001", "A Partner is already registered with the same Name"), PARTNER_ALREADY_REGISTERED_WITH_ID_EXCEPTION("PMS_PRT_051", "A Partner is already registered with the same Id"), @@ -80,18 +82,77 @@ public enum ErrorCode { PARTNER_ID_NOT_EXISTS("PMS_CERTIFICATE_ERROR_003","Partner Id is null or empty."), PARTNER_TYPE_NOT_EXISTS("PMS_CERTIFICATE_ERROR_004","Partner Type is null or empty"), APPROVAL_STATUS_NOT_EXISTS("PMS_CERTIFICATE_ERROR_005","Approval Status is null or empty"), + UNABLE_TO_DECODE_CERTIFICATE("PMS_CERTIFICATE_ERROR_006", "Unable to decode the certificate data"), + PARTNER_DOES_NOT_BELONG_TO_THE_USER("PMS_CERTIFICATE_ERROR_007", "The given partner ID does not belong to the user.So unable to get the original partner certificates"), + CERTIFICATE_FETCH_ERROR("PMS_CERTIFICATE_ERROR_008","Error while fetching certificate."), + DEACTIVATED_PARTNER_CERTIFICATE_DOWNLOAD_ERROR("PMS_CERTIFICATE_ERROR_009","Unable to download the certificate for a deactivated partner"), + TRUST_CERTIFICATES_FETCH_ERROR("PMS_CERTIFICATE_ERROR_010", "Error while fetching trust certificates."), + DOWNLOAD_TRUST_CERTIFICATE_ERROR("PMS_CERTIFICATE_ERROR_011", "Error while downloading trust certificates."), + INVALID_CERTIFICATE_ID("PMS_CERTIFICATE_ERROR_012", "Certificate id is null or empty"), POLICY_GROUP_NOT_EXISTS("PMS_POLICY_ERROR_001","Policy Group does not exists."), PARTNER_POLICY_FETCH_ERROR("PMS_POLICY_ERROR_002","Error while fetching partner policies."), - POLICY_GROUP_FETCH_ERROR("PMS_POLICY_ERROR_003", "Error while fetching all approved partner Ids with policy groups."), MATCHING_POLICY_NOT_FOUND("PMS_POLICY_ERROR_004", "Matching Policy not found."), POLICY_GROUP_ID_NOT_EXISTS("PMS_POLICY_ERROR_005","Policy Group Id is empty."), OIDC_CLIENTS_FETCH_ERROR("PMS_POLICY_ERROR_006","Error while fetching OIDC clients list."), API_KEY_REQUESTS_FETCH_ERROR("PMS_POLICY_ERROR_007", "Error while fetching API Key requests"), - UNABLE_TO_DECODE_CERTIFICATE("PMS_CERTIFICATE_ERROR_006", "Unable to decode the certificate data"), - PARTNER_DOES_NOT_BELONG_TO_THE_USER("PMS_CERTIFICATE_ERROR_007", "The given partner ID does not belong to the user.So unable to get the original partner certificates"), + MATCHING_POLICY_GROUP_NOT_EXISTS("PMS_POLICY_ERROR_008", "No matching policy group was found for the provided partner"), + PARTNER_NOT_BELONGS_TO_THE_USER_CREATE_OIDC("PMS_POLICY_ERROR_009", "The given partner ID does not belong to the user.So unable to create OIDC client"), + PARTNER_NOT_BELONGS_TO_THE_USER_UPDATE_OIDC("PMS_POLICY_ERROR_010", "The given partner ID does not belong to the user.So unable to update OIDC client details"), + PARTNER_NOT_BELONGS_TO_THE_USER_GET_OIDC("PMS_POLICY_ERROR_011", "The given partner ID does not belong to the user.So unable to get OIDC client details"), PMS_CONSENT_ERR("PMS_CONSENT_ERROR_001", "Error while fetching partner consent."), PMS_CONSENT_UNABLE_TO_ADD("PMS_CONSENT_ERROR_002", "Error while saving partner consent."), - CLIENT_ALREADY_DEACTIVATED("PMS_ESI_008", "Client already deactivated."); + CLIENT_ALREADY_DEACTIVATED("PMS_ESI_008", "Client already deactivated."), + SBI_DETAILS_LIST_FETCH_ERROR("PMS_SBI_ERROR_001", "Unable to fetch SBI details."), + PARTNER_ID_NOT_ASSOCIATED_WITH_USER("PMS_DEVICE_ERROR_001", "Partner id is not associated with user."), + SBI_NOT_ASSOCIATED_WITH_PARTNER_ID("PMS_DEVICE_ERROR_002", "SBI is not associated with partner Id."), + INVALID_DEVICE_PARTNER_TYPE("PMS_DEVICE_ERROR_003", "Invalid partner type."), + DEVICES_LIST_FOR_SBI_FETCH_ERROR("PMS_SF_ERROR_001", "Error while fetching devices list for SBI."), + INVALID_REQUEST_PARAM("PMS_REQUEST_ERROR_001", "Invalid request."), + SBI_DEVICE_MAPPING_ALREADY_EXIST("PMS_DEVICE_ERROR_004", "SBI and Device mapping already exists."), + SBI_NOT_EXISTS("PMS_DEVICE_ERROR_005", "SBI do not exists."), + DEVICE_NOT_EXISTS("PMS_DEVICE_ERROR_006", "Device do not exists."), + DEVICE_NOT_ASSOCIATED_WITH_PARTNER_ID("PMS_DEVICE_ERROR_007", "Device is not associated with partner Id."), + CREATE_DEVICE_ERROR("PMS_DEVICE_ERROR_008", "Error while adding device for sbi."), + PENDING_APPROVAL_SBI("PMS_DEVICE_ERROR_009","Unable to add device because the associated SBI is not approved."), + DEVICE_NOT_PENDING_FOR_APPROVAL("PMS_DEVICE_ERROR_010","Given device details are not in pending for approval status."), + APPROVE_OR_REJECT_DEVICE_WITH_SBI_MAPPING_ERROR("PMS_DEVICE_ERROR_011", "Error while approving or rejecting device for Sbi Mapping."), + SBI_DEVICE_MAPPING_NOT_EXISTS("PMS_DEVICE_ERROR_012","SBI and Device mapping does not exists."), + INVALID_DEVICE_ID("PMS_DEVICE_ERROR_013", "Device Id is invalid"), + DEVICE_ALREADY_DEACTIVATED("PMS_DEVICE_ERROR_014", "The selected device has been already deactivated."), + DEACTIVATE_DEVICE_ERROR("PMS_DEVICE_ERROR_015", "Error while deactivating the device"), + DEVICE_NOT_ASSOCIATED_WITH_USER("PMS_DEVICE_ERROR_016", "Device is not associated with user."), + INVALID_SBI_ID("PMS_DEVICE_ERROR_017", "SBI Id is invalid"), + DEACTIVATE_SBI_ERROR("PMS_DEVICE_ERROR_018", "Error while deactivating the SBI"), + SBI_NOT_ASSOCIATED_WITH_USER("PMS_DEVICE_ERROR_019", "SBI is not associated with user."), + SBI_ALREADY_DEACTIVATED("PMS_DEVICE_ERROR_020", "The selected SBI is already deactivated."), + SBI_EXPIRED("PMS_DEVICE_ERROR_021", "SBI for which device is being added is expired"), + SBI_NOT_APPROVED("PMS_DEVICE_ERROR_022", "The selected SBI is not in an approved status."), + DEVICE_NOT_APPROVED("PMS_DEVICE_ERROR_023", "The selected Device is not in an approved status."), + NO_SBI_FOUND_FOR_APPROVE("PMS_DEVICE_ERROR_024", "This device cannot be approved as it does not have any SBI associated to it."), + NO_SBI_FOUND_FOR_REJECT("PMS_DEVICE_ERROR_025", "This device cannot be rejected as it does not have any SBI associated to it."), + DEACTIVATE_STATUS_CODE("PMS_DEVICE_ERROR_026", "Request status should be De-Activate"), + APPROVE_REJECT_STATUS_CODE("PMS_DEVICE_ERROR_027", "Request status should be either approved or rejected"), + REJECTED_SBI("PMS_DEVICE_ERROR_028","Unable to add device because the associated SBI is already rejected"), + DEACTIVATED_SBI("PMS_DEVICE_ERROR_029","Unable to add device because the associated SBI is already deactivated"), + GET_ALL_DEVICE_DETAILS_FETCH_ERROR("PMS_FTM_ERROR_024", "Error occurred while retrieving all device details"), + FTM_CHIP_DETAILS_LIST_FETCH_ERROR("PMS_FTM_ERROR_001", "Error while fetching the FTM chip details"), + DEACTIVATE_FTM_ERROR("PMS_FTM_ERROR_003", "Error while deactivating the FTM"), + INVALID_FTM_ID("PMS_FTM_ERROR_004", "FTM Id is invalid"), + FTM_NOT_EXISTS("PMS_FTM_ERROR_005", "FTM Details do not exists."), + FTM_NOT_ASSOCIATED_WITH_USER("PMS_FTM_ERROR_006", "FTM is not associated with user."), + FTM_ALREADY_DEACTIVATED("PMS_FTM_ERROR_007", "The selected FTM is already deactivated."), + DOWNLOAD_CERTIFICATE_FTM_INVALID_STATUS("PMS_FTM_ERROR_008", "The selected FTM must have a status of either pending_approval or approved."), + DOWNLOAD_CERTIFICATE_FTM_DEACTIVATED_ERROR("PMS_FTM_ERROR_009", "Cannot download the certificate for a deactivated FTM"), + UNABLE_TO_DOWNLOAD_ORIGINAL_FTM_CERTIFICATE("PMS_FTM_ERROR_009", "Unable to download original FTM certificate"), + FTM_NOT_APPROVED("PMS_FTM_ERROR_010", "The selected FTM is not in an approved status."), + PARTNERS_FETCH_ERROR("PMS_PS_ERROR_001", "Error while fetching partners list"), + PARTNER_DOES_NOT_EXIST_ERROR("PMS_PS_ERROR_002", "Partner does not exists"), + PARTNER_POLICIES_FETCH_ERROR("PMS_PS_ERROR_003", "Error while fetching partner policies"), + PARTNER_NOT_APPROVED_ERROR("PMS_PS_ERROR_004", "The Given partner is not approved"), + NOT_AUTH_PARTNER_TYPE_ERROR("PMS_PS_ERROR_005", "The specified partner is not of type Authentication Partner"), + INVALID_PAGE_PARAMETERS("PMS_PS_ERROR_006", "Invalid pagination request: 'pageNo' and 'pageSize' must be specified together." ), + INVALID_SORT_PARAMETERS("PMS_PS_ERROR_007", "Invalid Sorting request: 'sortType' and 'sortFieldName' must be specified together." ), + MISSING_PAGINATION_FOR_SORT("PMS_PS_ERROR_008", "Please provide pagination parameters ('pageNo' and 'pageSize') when requesting sorted data."); /** * The error code. */ diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/constant/PartnerConstants.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/constant/PartnerConstants.java index a216246435..c78991590c 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/constant/PartnerConstants.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/constant/PartnerConstants.java @@ -35,4 +35,12 @@ public final class PartnerConstants { public static final String PARTNER_DOMAIN = "partnerDomain"; public static final String CLIENT_DATA="clientData"; + + public static final String ASC = "asc"; + + public static final String DESC = "desc"; + + public static final String PARTNER_ADMIN = "PARTNER_ADMIN"; + + public static final String DEACTIVATE = "De-Activate"; } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/controller/MultiPartnerServiceController.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/controller/MultiPartnerServiceController.java deleted file mode 100644 index a9e08c3244..0000000000 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/controller/MultiPartnerServiceController.java +++ /dev/null @@ -1,206 +0,0 @@ -package io.mosip.pms.partner.controller; - -import io.mosip.pms.common.response.dto.ResponseWrapper; -import io.mosip.pms.partner.dto.*; -import io.mosip.pms.partner.service.MultiPartnerService; -import io.swagger.annotations.Api; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@RestController -@RequestMapping(value = "/partners") -@Api(tags = { "Multi Partner Service Controller" }) -public class MultiPartnerServiceController { - - @Value("${mosip.pms.oidc.clients.grantTypes:authorization_code}") - private String grantTypes; - - @Value("${mosip.pms.oidc.clients.clientAuthMethods:private_key_jwt}") - private String clientAuthMethods; - - @Value("${mosip.pms.session.inactivity.timer}") - private String inActivityTimer; - - @Value("${mosip.pms.session.inactivity.prompt.timer}") - private String inActivityPromptTimer; - - @Value("${mosip.pms.axios.timeout}") - private String axiosTimeout; - - @Value("${mosip.pms.api.id.all.certificates.details.get}") - private String getAllCertificatesDetailsId; - - @Value("${mosip.pms.api.id.all.requested.policies.get}") - private String getAllRequestedPoliciesId; - - @Value("${mosip.pms.api.id.all.approved.auth.partners.policies.get}") - private String getAllApprovedAuthPartnersPoliciesId; - - @Value("${mosip.pms.api.id.all.approved.partner.ids.with.policy.groups.get}") - private String getAllApprovedPartnerIdsWithPolicyGroupsId; - - @Value("${mosip.pms.api.id.configs.get}") - private String getConfigsId; - - @Value("${mosip.pms.api.id.all.api.keys.for.auth.partners.get}") - private String getAllApiKeysForAuthPartners; - - @Value("${mosip.pms.api.id.save.user.consent.given.post}") - private String postSaveUserConsentGivenId; - - @Value("${mosip.pms.api.id.user.consent.given.get}") - private String getUserConsentGivenId; - - public static final String VERSION = "1.0"; - - @Autowired - MultiPartnerService multiPartnerService; - - @PreAuthorize("hasAnyRole(@authorizedRoles.getGetallcertificatedetails())") - @GetMapping(value = "/getAllCertificateDetails") - @Operation(summary = "Get partner certificates", description = "fetch partner certificates") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true)))}) - public ResponseWrapper> getAllCertificateDetails() { - ResponseWrapper> responseWrapper = new ResponseWrapper<>(); - responseWrapper.setId(getAllCertificatesDetailsId); - responseWrapper.setVersion(VERSION); - responseWrapper.setResponse(multiPartnerService.getAllCertificateDetails()); - return responseWrapper; - } - - @PreAuthorize("hasAnyRole(@authorizedRoles.getGetallrequestedpolicies())") - @GetMapping(value = "/getAllRequestedPolicies") - @Operation(summary = "Get all policies", description = "fetch all policies") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true)))}) - public ResponseWrapper> getAllRequestedPolicies() { - ResponseWrapper> responseWrapper = new ResponseWrapper<>(); - responseWrapper.setId(getAllRequestedPoliciesId); - responseWrapper.setVersion(VERSION); - responseWrapper.setResponse(multiPartnerService.getAllRequestedPolicies()); - return responseWrapper; - } - - @PreAuthorize("hasAnyRole(@authorizedRoles.getGetallapprovedauthpartnerpolicies())") - @GetMapping(value = "/getAllApprovedAuthPartnerPolicies") - @Operation(summary = "Get all approved auth partner policies", description = "fetch all approved auth partner policies") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true)))}) - public ResponseWrapper> getAllApprovedAuthPartnerPolicies() { - ResponseWrapper> responseWrapper = new ResponseWrapper<>(); - responseWrapper.setId(getAllApprovedAuthPartnersPoliciesId); - responseWrapper.setVersion(VERSION); - responseWrapper.setResponse(multiPartnerService.getAllApprovedAuthPartnerPolicies()); - return responseWrapper; - } - - @PreAuthorize("hasAnyRole(@authorizedRoles.getGetallapprovedpartneridswithpolicygroups())") - @GetMapping(value = "/getAllApprovedPartnerIdsWithPolicyGroups") - @Operation(summary = "Get all approved partner id's with policy groups", description = "fetch all approved partner id's with policy groups") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true)))}) - public ResponseWrapper> getAllApprovedPartnerIdsWithPolicyGroups() { - ResponseWrapper> responseWrapper = new ResponseWrapper<>(); - responseWrapper.setId(getAllApprovedPartnerIdsWithPolicyGroupsId); - responseWrapper.setVersion(VERSION); - responseWrapper.setResponse(multiPartnerService.getAllApprovedPartnerIdsWithPolicyGroups()); - return responseWrapper; - } - - @GetMapping(value = "/configs") - @Operation(summary = "Get config", description = "Get configuration values") - @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "201", description = "Created" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) - public ResponseWrapper> getConfigValues() { - ResponseWrapper> responseWrapper = new ResponseWrapper<>(); - responseWrapper.setId(getConfigsId); - responseWrapper.setVersion(VERSION); - Map configMap = new HashMap(); - configMap.put("grantTypes", grantTypes); - configMap.put("clientAuthMethods", clientAuthMethods); - configMap.put("inActivityTimer", inActivityTimer); - configMap.put("inActivityPromptTimer", inActivityPromptTimer); - configMap.put("axiosTimeout", axiosTimeout); - responseWrapper.setResponse(configMap); - System.out.println(responseWrapper); - return responseWrapper; - } - - @PreAuthorize("hasAnyRole(@authorizedRoles.getGetallapikeysforauthpartners())") - @GetMapping(value = "/getAllApiKeysForAuthPartners") - @Operation(summary = "Get all api keys for auth partners", description = "fetch all api keys for auth partners") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true)))}) - public ResponseWrapper> getAllApiKeysForAuthPartners() { - ResponseWrapper> responseWrapper = new ResponseWrapper<>(); - responseWrapper.setId(getAllApiKeysForAuthPartners); - responseWrapper.setVersion(VERSION); - responseWrapper.setResponse(multiPartnerService.getAllApiKeysForAuthPartners()); - return responseWrapper; - } - - @PreAuthorize("hasAnyRole(@authorizedRoles.getUserconsent())") - @PostMapping(value = "/saveUserConsentGiven") - @Operation(summary = "save user consent", description = "Store the user consent in the database.") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true)))}) - public ResponseWrapper saveUserConsentGiven() { - ResponseWrapper responseWrapper = new ResponseWrapper<>(); - responseWrapper.setId(postSaveUserConsentGivenId); - responseWrapper.setVersion(VERSION); - responseWrapper.setResponse(multiPartnerService.saveUserConsentGiven()); - return responseWrapper; - } - - @PreAuthorize("hasAnyRole(@authorizedRoles.getUserconsent())") - @GetMapping(value = "/isUserConsentGiven") - @Operation(summary = "Retrieve the user consent status.", description = "Retrieve the user consent status.") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true)))}) - public ResponseWrapper isUserConsentGiven() { - ResponseWrapper responseWrapper = new ResponseWrapper<>(); - responseWrapper.setId(getUserConsentGivenId); - responseWrapper.setVersion(VERSION); - responseWrapper.setResponse(multiPartnerService.isUserConsentGiven()); - return responseWrapper; - } -} \ No newline at end of file diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/controller/PartnerServiceController.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/controller/PartnerServiceController.java index 3d0b16f674..86a1f01e02 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/controller/PartnerServiceController.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/controller/PartnerServiceController.java @@ -2,20 +2,18 @@ import java.io.IOException; import java.security.cert.CertificateException; -import java.time.LocalDateTime; import java.util.List; import javax.validation.Valid; import javax.validation.constraints.NotNull; -import io.mosip.pms.partner.constant.PartnerConstants; -import io.mosip.pms.partner.dto.CertificateDto; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.partner.dto.*; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -37,7 +35,6 @@ import io.mosip.pms.device.response.dto.FilterResponseCodeDto; import io.mosip.pms.device.util.AuditUtil; import io.mosip.pms.partner.constant.PartnerServiceAuditEnum; -import io.mosip.pms.partner.dto.PartnerPolicyMappingResponseDto; import io.mosip.pms.partner.manager.constant.PartnerManageEnum; import io.mosip.pms.partner.manager.service.PartnerManagerService; import io.mosip.pms.partner.request.dto.APIKeyGenerateRequestDto; @@ -81,18 +78,14 @@ public class PartnerServiceController { PartnerManagerService partnerManagerService; String msg = "mosip.partnermanagement.partners.retrieve"; - String version = "1.0"; @Autowired AuditUtil auditUtil; - @Value("${mosip.pms.api.id.original.partner.certificate.get}") - private String getOriginalPartnerCertificateId; - public static final String VERSION = "1.0"; - + /** - * This API would be used for self registration by partner to create Auth/E-KYC + * This endpoint would be used for self registration by partner to create Auth/E-KYC * Partners. Partner Management module would be integrating with Kernel IAM * module for generation of user id and password for partners. * @@ -203,7 +196,7 @@ public ResponseEntity> getCreden */ @PreAuthorize("hasAnyRole(@authorizedRoles.getPostpartnerscontactadd())") @RequestMapping(value = "{partnerId}/contact/add", method = RequestMethod.POST) - @Operation(summary = "Service to add additional contact deatils of partner", description = "Service to add additional contact deatils of partner") + @Operation(summary = "Service to add additional contact details of partner", description = "Service to add additional contact details of partner") public ResponseEntity> addContact(@PathVariable String partnerId,@RequestBody @Valid RequestWrapperrequest){ ResponseWrapper response = new ResponseWrapper<>(); auditUtil.setAuditRequestDto(PartnerServiceAuditEnum.ADD_CONTACTS, partnerId, "partnerId"); @@ -213,7 +206,7 @@ public ResponseEntity> addContact(@PathVariable String p return new ResponseEntity<>(response, HttpStatus.OK); } /** - * This API would be used to update Auth/E-KYC Partner's details. + * This endpoint would be used to update Auth/E-KYC Partner's details. * * @param request * this class contains partner updated details @@ -223,7 +216,7 @@ public ResponseEntity> addContact(@PathVariable String p */ @PreAuthorize("hasAnyRole(@authorizedRoles.getPutpartners())") @RequestMapping(value = "/{partnerId}", method = RequestMethod.PUT) - @Operation(summary = "Service to update deatils of partner", description = "Service to update deatils of partner") + @Operation(summary = "Service to update details of partner", description = "Service to update details of partner") public ResponseEntity> updatePartnerDetails( @RequestBody @Valid RequestWrapper request, @PathVariable String partnerId) { ResponseWrapper response = new ResponseWrapper<>(); @@ -239,7 +232,7 @@ public ResponseEntity> updatePartnerDetails( @PreAuthorize("hasAnyRole(@authorizedRoles.getPutpartnersnew())") @RequestMapping(value = "/v2/{partnerId}", method = RequestMethod.PUT) - @Operation(summary = "Service to update deatils of partner", description = "Service to update deatils of partner") + @Operation(summary = "Service to update details of partner", description = "Service to update details of partner") public ResponseEntity> updatePartnerInfo( @RequestBody @Valid RequestWrapper request, @PathVariable String partnerId) { ResponseWrapper response = new ResponseWrapper<>(); @@ -253,7 +246,7 @@ public ResponseEntity> updatePartnerInfo( } /** - * This API would be used to retrieve Auth/E-KYC Partner details + * This endpoint would be used to retrieve Auth/E-KYC Partner details * * @param partnerId * this is unique id created after self registered by partner @@ -261,37 +254,28 @@ public ResponseEntity> updatePartnerInfo( */ @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpartnerspartnerid())") @RequestMapping(value = "/{partnerId}", method = RequestMethod.GET) - @Operation(summary = "Service to get deatils of partner", description = "Service to get deatils of partner") + @Operation(summary = "Service to get details of partner", description = "Service to get details of partner") public ResponseEntity> retrievePartnerDetails( @PathVariable String partnerId) { ResponseWrapper response = new ResponseWrapper<>(); RetrievePartnerDetailsResponse retrievePartnerDetailsResponse = null; retrievePartnerDetailsResponse = partnerService.getPartnerDetails(partnerId); response.setId(msg); - response.setVersion(version); + response.setVersion(VERSION); response.setResponse(retrievePartnerDetailsResponse); return new ResponseEntity<>(response, HttpStatus.OK); - } + } - /** - * This API would be used to retrieve all API key requests submitted by partner - * till date. - * - * @param partnerId - * this is unique id created after self registered by partner - * @return partnersRetrieveApiKeyRequests this is a list of partner request for - * creation of partner API Key - */ @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpartnersapikeyrequest())") @RequestMapping(value = "/{partnerId}/apikey/request", method = RequestMethod.GET) - @Operation(summary = "Service to get api key requests of partner", description = "Service to get api key requests of partner") + @Operation(summary = "Service to get API key requests of partner") public ResponseEntity>> getAPIKeyRequestsOfPartner( @PathVariable String partnerId) { ResponseWrapper> response = new ResponseWrapper<>(); List apikeyRequestsList = null; apikeyRequestsList = partnerService.retrieveAllApiKeyRequestsSubmittedByPartner(partnerId); response.setId(msg); - response.setVersion(version); + response.setVersion(VERSION); response.setResponse(apikeyRequestsList); return new ResponseEntity<>(response, HttpStatus.OK); } @@ -339,19 +323,9 @@ public ResponseWrapper uploadPartnerCertificate( return response; } - /** - * To Download Partner Certificate. - * - * @param certDownloadRequestDto {@link PartnerCertDownloadRequestDto} request - * @return {@link PartnerCertDownloadResponeDto} encrypted Data - * @throws IOException - * @throws JsonProcessingException - * @throws JsonMappingException - * @throws JsonParseException - */ @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpartnerscertificate())") @RequestMapping(value = "/{partnerId}/certificate", method = RequestMethod.GET) - @Operation(summary = "Service to get partner certificate", description = "Service to get partner certificate") + @Operation(summary = "Service to get partner certificate") public ResponseWrapper getPartnerCertificate( @ApiParam("To download resigned partner certificate.") @PathVariable("partnerId") @NotNull String partnerId) throws JsonParseException, JsonMappingException, JsonProcessingException, IOException { ResponseWrapper response = new ResponseWrapper<>(); @@ -362,26 +336,57 @@ public ResponseWrapper getPartnerCertificate( } @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpartnerscertificate())") - @RequestMapping(value = "/{partnerId}/originalPartnerCertificate", method = RequestMethod.GET) - @Operation(summary = "Service to get original partner certificate", description = "Service to get original partner certificate") - public ResponseWrapper getOriginalPartnerCertificate( + @GetMapping(value = "/{partnerId}/certificate-data") + @Operation(summary = "This endpoint retrieves both the CA signed certificate uploaded by the partner and the MOSIP-signed certificate generated by PMS.", + description = "Available since release-1.3.x. It is configured for role any of the partner type or PARTNER_ADMIN.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true)))}) + public ResponseWrapperV2 getPartnerCertificateData( @ApiParam("To download original partner certificate.") @PathVariable("partnerId") @NotNull String partnerId) throws JsonParseException, JsonMappingException, JsonProcessingException, IOException, CertificateException { - ResponseWrapper response = new ResponseWrapper<>(); - response.setId(getOriginalPartnerCertificateId); - response.setVersion(VERSION); PartnerCertDownloadRequestDto requestDto = new PartnerCertDownloadRequestDto(); requestDto.setPartnerId(partnerId); - response.setId("mosip.pms.api.id.getOriginalPartnerCertificate"); - response.setVersion("1.0"); - response.setResponse(partnerService.getOriginalPartnerCertificate(requestDto)); - response.setResponsetime(LocalDateTime.now()); - return response; + return partnerService.getPartnerCertificateData(requestDto); } - + + @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpartnercertificates())") + @GetMapping(value = "/partner-certificates-details") + @Operation(summary = "This endpoint retrieves a list of all Partner Certicates uploaded by the logged in user", + description = "Available since release-1.3.x. It is configured for role any of the partner type or PARTNER_ADMIN.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true)))}) + public ResponseWrapperV2> getPartnerCertificatesDetails() { + return partnerService.getPartnerCertificatesDetails(); + } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpartnersv3())") + @GetMapping(value = "/v3") + @Operation(summary = "This endpoint retrieves a list of Partners associated with the logged in user, based on the query parameters", + description = "Available since release-1.3.x. It is configured for role any of the partner type or PARTNER_ADMIN.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true)))}) + public ResponseWrapperV2> getPartnersV3( + @RequestParam(name = "status") String status, + @RequestParam(name = "policyGroupAvailable", required = false) Boolean policyGroupAvailable, + @RequestParam(name = "partnerType", required = false) String partnerType) { + + return partnerService.getPartnersV3(status, policyGroupAvailable, partnerType); + } + + /* + * This endpoint has been deprecated since the release-1.3.x + * It has been replaced by the new GET /partners/v3 endpoint. + * The functionality provided by this API is now available in the new endpoint. + * Please use the new endpoint for all future requests. + */ + @Deprecated(since = "release-1.3.x") @ResponseFilter @PostMapping("/search") @PreAuthorize("hasAnyRole(@authorizedRoles.getPostpartnerssearch())") - @Operation(summary = "Service to search partner details", description = "Service to search partner details") + @Operation(summary = "Service to search partner details - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since the release-1.3.x and replaced by the GET /admin-partners endpoint") public ResponseWrapper> searchPartner( @RequestBody @Valid RequestWrapper request) { ResponseWrapper> responseWrapper = new ResponseWrapper<>(); @@ -401,11 +406,19 @@ public ResponseWrapper> searchPartnerType( responseWrapper.setResponse(partnerService.searchPartnerType(request.getRequest())); return responseWrapper; } - + + /* + * This endpoint has been deprecated since the release-1.3.x + * It has been replaced by the new GET /partners/v3 endpoint. + * The functionality provided by this API is now available in the new endpoint. + * Please use the new endpoint for all future requests. + */ + @Deprecated(since = "release-1.3.x") @ResponseFilter @PostMapping("/filtervalues") @PreAuthorize("hasAnyRole(@authorizedRoles.getPostpartnersfiltervalues())") - @Operation(summary = "Service to filter partner details", description = "Service to filter partner details") + @Operation(summary = "Service to filter partner details - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since the release-1.3.x and replaced by the GET /admin-partners endpoint") public ResponseWrapper filterValues( @RequestBody @Valid RequestWrapper request) { ResponseWrapper responseWrapper = new ResponseWrapper<>(); @@ -413,11 +426,19 @@ public ResponseWrapper filterValues( responseWrapper.setResponse(partnerService.filterValues(request.getRequest())); return responseWrapper; } - + + /* + * This endpoint has been deprecated since the release-1.3.x + * It has been replaced by the new GET /partner-policy-requests endpoint. + * The functionality provided by this API is now available in the new endpoint. + * Please use the new endpoint for all future requests. + */ + @Deprecated(since = "release-1.3.x") @ResponseFilter @PostMapping("/apikey/request/filtervalues") @PreAuthorize("hasAnyRole(@authorizedRoles.getPostpartnersapikeyrequestfiltervalues())") - @Operation(summary = "Service to filter api key requests", description = "Service to filter api key requests") + @Operation(summary = "Service to filter API key requests - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since the release-1.3.x and replaced by the GET /partner-policy-requests endpoint") public ResponseWrapper apikeyRequetsFilterValues( @RequestBody @Valid RequestWrapper request) { ResponseWrapper responseWrapper = new ResponseWrapper<>(); @@ -425,11 +446,19 @@ public ResponseWrapper apikeyRequetsFilterValues( responseWrapper.setResponse(partnerService.apiKeyRequestFilter(request.getRequest())); return responseWrapper; } - + + /* + * This endpoint has been deprecated since the release-1.3.x + * It has been replaced by the new GET /partner-policy-requests endpoint. + * The functionality provided by this API is now available in the new endpoint. + * Please use the new endpoint for all future requests. + */ + @Deprecated(since = "release-1.3.x") @ResponseFilter @PostMapping("/apikey/request/search") @PreAuthorize("hasAnyRole(@authorizedRoles.getPostpartnersapikeyrequestsearch())") - @Operation(summary = "Service to search api key requests", description = "Service to search api key requests") + @Operation(summary = "Service to search API key requests - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since the release-1.3.x and replaced by the GET /partner-policy-requests endpoint.") public ResponseWrapper> searchApikeyRequest( @RequestBody @Valid RequestWrapper request) { ResponseWrapper> responseWrapper = new ResponseWrapper<>(); @@ -437,11 +466,19 @@ public ResponseWrapper> searchAp responseWrapper.setResponse(partnerService.searchPartnerApiKeyRequests(request.getRequest())); return responseWrapper; } - + + /* + * This endpoint has been deprecated since the release-1.3.x + * It has been replaced by the new GET /partner-api-keys endpoint. + * The functionality provided by this API is now available in the new endpoint. + * Please use the new endpoint for all future requests. + */ + @Deprecated(since = "release-1.3.x") @ResponseFilter @PostMapping("/apikey/search") @PreAuthorize("hasAnyRole(@authorizedRoles.getPostpartnersapikeysearch())") - @Operation(summary = "Service to search api key", description = "Service to search api key") + @Operation(summary = "Service to search API key - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since the release-1.3.x and replaced by the GET /partner-api-keys endpoint.") public ResponseWrapper> searchApikey( @RequestBody @Valid RequestWrapper request) { ResponseWrapper> responseWrapper = new ResponseWrapper<>(); @@ -486,7 +523,7 @@ public ResponseEntity> mapPolic } @PreAuthorize("hasAnyRole(@authorizedRoles.getPatchpartnersgenerateapikey())") - @Operation(summary = "To generate apiKeys for approved policies", description = "To generate apiKeys for approved policies") + @Operation(summary = "To generate API Key for approved policies", description = "To generate API Key for approved policies") @RequestMapping(value = "/{partnerId}/generate/apikey",method = RequestMethod.PATCH) public ResponseEntity> generateAPIKey( @ApiParam("partner id") @PathVariable("partnerId") @NotNull String partnerId, diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/ActivePolicyDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/ActivePolicyDto.java deleted file mode 100644 index 6a2894ff29..0000000000 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/ActivePolicyDto.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.mosip.pms.partner.dto; - -import lombok.Data; -import lombok.Getter; -import lombok.Setter; - -@Data -@Getter -@Setter -public class ActivePolicyDto { - private String policyName; - private String policyId; - private String policyDescription; - private String status; -} \ No newline at end of file diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/ApiKeyResponseDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/ApiKeyResponseDto.java index 6839cee473..3990e1b0be 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/ApiKeyResponseDto.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/ApiKeyResponseDto.java @@ -1,24 +1,43 @@ package io.mosip.pms.partner.dto; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.Getter; import lombok.Setter; -import java.util.Date; +import java.time.LocalDateTime; @Data @Getter @Setter public class ApiKeyResponseDto { + @Schema(description = "Current status of the entity", example = "active") private String status; + + @Schema(description = "Label or identifier for the API key", example = "api-key-001") private String apiKeyLabel; + + @Schema(description = "Unique identifier for the partner", example = "partner123") private String partnerId; + + @Schema(description = "Unique identifier for the policy group", example = "policyGroup456") private String policyGroupId; + + @Schema(description = "Name of the policy group", example = "Compliance Policies") private String policyGroupName; + + @Schema(description = "Description of the policy group", example = "Group of policies related to regulatory compliance and standards") private String policyGroupDescription; + + @Schema(description = "Unique identifier for the policy", example = "policy789") private String policyId; + + @Schema(description = "Name of the policy", example = "Data Protection Policy") private String policyName; - private String policyNameDescription; - private Date crDtimes; - private Date updDtimes; + + @Schema(description = "Description of the policy name", example = "Policy that outlines data protection measures") + private String policyDescription; + + @Schema(description = "Date and time when the record was created", example = "2024-07-15T10:00:00Z") + private LocalDateTime createdDateTime; } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/ApprovedPolicyDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/ApprovedPolicyDto.java deleted file mode 100644 index 3bcb2bc06e..0000000000 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/ApprovedPolicyDto.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.mosip.pms.partner.dto; - -import lombok.Data; -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -@Data -@Getter -@Setter -public class ApprovedPolicyDto { - private String partnerId; - private String partnerType; - private String policyGroupId; - private String policyGroupDescription; - private String policyGroupName; - List activePolicies; -} \ No newline at end of file diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/AuthorizedRolesDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/AuthorizedRolesDto.java index c519291d02..1bda1b9e8c 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/AuthorizedRolesDto.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/AuthorizedRolesDto.java @@ -52,6 +52,10 @@ public class AuthorizedRolesDto { private List postftpchipdetailsearch; + private List getpartnersftmchipdetails; + + private List getallsbidetails; + //Secure Biometric Interface controller private List postsecurebiometricinterface; @@ -130,6 +134,8 @@ public class AuthorizedRolesDto { private List putpartnerspolicymapping; private List patchpartnerspolicyapikeystatus; + + private List getadminpartners; //MISP License controller @@ -147,20 +153,44 @@ public class AuthorizedRolesDto { //Multi Partner Service Controller - private List getallcertificatedetails; + private List getpartnercertificates; - private List getallrequestedpolicies; + private List getapikeysforauthpartners; - private List getallapprovedauthpartnerpolicies; + private List getoauthclients; - private List getallapprovedpartneridswithpolicygroups; + private List userconsent; - private List getallapikeysforauthpartners; + private List getsbidetails; - private List getalloidcclients; + private List postadddevicetosbi; - //user consent + private List postdevicewithsbimapping; - private List userconsent; + private List patchdeactivatedevice; + + private List patchdeactivatesbi; + + private List getftmchipdetails; + + private List patchdeactivateftm; + + private List getoriginalftmcertificate; + + private List getpartnerdetails; + + private List getallpartnerpolicymappingrequests; + + private List getoauthpartnersclients; + + private List getpartnersapikeyrequests; + + private List getalldevicedetails; + + private List gettrustcertificates; + + private List getdownloadtrustcertificates; + + private List getpartnersv3; } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/CertificateDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/CertificateDto.java index 49eb94a9c1..eee5fcd6d1 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/CertificateDto.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/CertificateDto.java @@ -1,5 +1,6 @@ package io.mosip.pms.partner.dto; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.Getter; import lombok.Setter; @@ -10,10 +11,24 @@ @Getter @Setter public class CertificateDto { - private String certificateName; - private Date certificateUploadDate; - private Date certificateExpiryDate; - private String partnerType; + @Schema(description = "Unique identifier for the partner", example = "partner123") private String partnerId; + + @Schema(description = "Name of the certificate issued to the partner", example = "cert-001") + private String certificateIssuedTo; + + @Schema(description = "Date when the certificate was uploaded", example = "2024-07-15T10:00:00Z") + private Date certificateUploadDateTime; + + @Schema(description = "Date when the certificate expires", example = "2025-07-15T10:00:00Z") + private Date certificateExpiryDateTime; + + @Schema(description = "Type of partner (e.g., distributor, supplier, etc.)", example = "distributor") + private String partnerType; + + @Schema(description = "Indicates whether the certificate is available (true if available, false otherwise)", example = "true") private Boolean isCertificateAvailable; + + @Schema(description = "Indicates if the partner is active. 'true' means active and 'false' means inactive.", example = "true") + private Boolean isPartnerActive; } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/DeviceDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/DeviceDto.java new file mode 100644 index 0000000000..1abdc98fb9 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/DeviceDto.java @@ -0,0 +1,44 @@ +package io.mosip.pms.partner.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Data +@Getter +@Setter +public class DeviceDto { + + @Schema(description = "Code representing the id of the device. The id can either be provided by the user as a unique ID or left as null. If it's provided, that unique ID will be used as the device_detail_id. If it's null, the service will automatically generate a unique ID for the device_detail_id.", example = "12345") + private String deviceId; + + @Schema(description = "Code representing the type of device", example = "DT001") + private String deviceTypeCode; + + @Schema(description = "Code representing the subtype of the device", example = "DST001") + private String deviceSubTypeCode; + + @Schema(description = "Unique identifier for the device provider", example = "provider123") + private String deviceProviderId; + + @Schema(description = "Manufacturer of the device", example = "AcmeCorp") + private String make; + + @Schema(description = "Model of the device", example = "X1000") + private String model; + + @Schema(description = "Approval status of the device (e.g., approved, pending, rejected)", example = "approved") + private String status; + + @Schema(description = "Indicates whether the device is active (true if active, false otherwise)", example = "true") + @JsonProperty("isActive") + private boolean isActive; + + @Schema(description = "Date and time when the record was created", example = "2024-08-08T10:00:00Z") + private LocalDateTime createdDateTime; + +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/DeviceProviderDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/DeviceProviderDto.java new file mode 100644 index 0000000000..cff3535742 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/DeviceProviderDto.java @@ -0,0 +1,14 @@ +package io.mosip.pms.partner.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +@Data +@Getter +@Setter +public class DeviceProviderDto { + @Schema(description = "Unique identifier for the partner", example = "partner123") + private String partnerId; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/FtmProviderDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/FtmProviderDto.java new file mode 100644 index 0000000000..5e341c4e50 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/FtmProviderDto.java @@ -0,0 +1,11 @@ +package io.mosip.pms.partner.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class FtmProviderDto { + + @Schema(description = "Unique identifier for the partner", example = "partner123") + private String partnerId; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/KeycloakUserDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/KeycloakUserDto.java new file mode 100644 index 0000000000..cecc4a8198 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/KeycloakUserDto.java @@ -0,0 +1,16 @@ +package io.mosip.pms.partner.dto; + +import lombok.Data; + +/** + * DTO is used for fetching user details from Keycloak. + */ +@Data +public class KeycloakUserDto { + + private String username; + private String email; + private String firstName; + private String lastName; + +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/PartnerDtoV3.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/PartnerDtoV3.java new file mode 100644 index 0000000000..3c6cff2563 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/PartnerDtoV3.java @@ -0,0 +1,26 @@ +package io.mosip.pms.partner.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +@Data +@Getter +@Setter +public class PartnerDtoV3 { + @Schema(description = "Unique identifier for the partner", example = "partner123") + private String partnerId; + + @Schema(description = "Type of partner", example = "AUTH_PARTNER") + private String partnerType; + + @Schema(description = "Unique identifier for the policy group", example = "policyGroup456") + private String policyGroupId; + + @Schema(description = "Name of the policy group", example = "Compliance Policies") + private String policyGroupName; + + @Schema(description = "Description of the policy group", example = "Group of policies related to regulatory compliance and standards") + private String policyGroupDescription; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/PolicyDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/PolicyDto.java deleted file mode 100644 index 2badf367a9..0000000000 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/PolicyDto.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.mosip.pms.partner.dto; - -import lombok.Data; -import lombok.Getter; -import lombok.Setter; - -import java.util.Date; - -@Data -@Getter -@Setter -public class PolicyDto { - private String partnerId; - private String partnerType; - private String policyName; - private Date createDate; - private String status; - private String policyGroupId; - private String policyGroupDescription; - private String policyGroupName; - private String policyId; - private String policyDescription; - private String partnerComments; - private Date updDtimes; -} \ No newline at end of file diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/PolicyGroupDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/PolicyGroupDto.java deleted file mode 100644 index 58bc0fc3e2..0000000000 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/PolicyGroupDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.mosip.pms.partner.dto; - -import lombok.Data; -import lombok.Getter; -import lombok.Setter; - -@Data -@Getter -@Setter -public class PolicyGroupDto { - private String partnerId; - private String partnerType; - private String policyGroupId; - private String policyGroupName; - private String policyGroupDescription; -} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/UserDetailsDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/UserDetailsDto.java index 2933edccf4..e5f73f4b67 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/UserDetailsDto.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/dto/UserDetailsDto.java @@ -2,6 +2,7 @@ import java.time.LocalDateTime; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.Getter; import lombok.Setter; @@ -11,10 +12,13 @@ @Setter public class UserDetailsDto { + @Schema(description = "Unique identifier for the user", example = "user123") private String userId; + @Schema(description = "Indicates whether consent has been given (true if consent is given, false otherwise)", example = "true") private boolean consentGiven; - private LocalDateTime consentGivenDtimes; + @Schema(description = "Date and time when consent was given", example = "2024-08-08T10:00:00Z") + private LocalDateTime consentGivenDateTime; } \ No newline at end of file diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/constant/ErrorCode.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/constant/ErrorCode.java index 135039b7bf..11fe0c0560 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/constant/ErrorCode.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/constant/ErrorCode.java @@ -41,7 +41,13 @@ public enum ErrorCode { PARTNER_POLICY_LABEL_EXISTS("PMS_PRT_110","Given label already exists.Provide unique label."), PARTNER_POLICY_LABEL_NOT_EXISTS("PMS_PRT_111","API key not exists for the given combination"), LOGGEDIN_USER_NOT_AUTHORIZED("PMS_PRT_055","User not authorized."), - JSON_NOT_VALID("PMS_PRT_096","Json is not valid"); + JSON_NOT_VALID("PMS_PRT_096","Json is not valid"), + FETCH_PARTNER_DETAILS_ERROR("PMS_PM_059","Error while fetching partner details."), + CERTIFICATE_NOT_AVAILABLE_IN_KM("PMS_PM_060","The certificate for the specified partner is not available in the store"), + FETCH_ALL_PARTNER_DETAILS_ERROR("PMS_PM_061", "Error while fetching all partners details"), + FETCH_ALL_PARTNER_POLICY_MAPPING_REQUEST_ERROR("PMS_PM_062", "Error while fetching all partner policy mapping requests"), + PARTNER_ALREADY_DEACTIVATED("PMS_PM_063", "The selected partner has already been deactivated."), + FETCH_ALL_API_KEY_REQUESTS_ERROR("PMS_PM_064", "Error while fetching all api key requests"); /** diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/controller/PartnerManagementController.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/controller/PartnerManagementController.java index 1631503a5b..f0ae7f7d5c 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/controller/PartnerManagementController.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/controller/PartnerManagementController.java @@ -4,7 +4,19 @@ import java.util.Optional; import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import io.mosip.pms.common.dto.PageResponseV2Dto; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.partner.manager.dto.*; +import io.mosip.pms.partner.util.PartnerHelper; +import io.swagger.annotations.ApiParam; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -15,19 +27,12 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.GetMapping; import io.mosip.pms.common.request.dto.RequestWrapper; import io.mosip.pms.common.response.dto.ResponseWrapper; import io.mosip.pms.device.util.AuditUtil; import io.mosip.pms.partner.manager.constant.PartnerManageEnum; -import io.mosip.pms.partner.manager.dto.StatusRequestDto; -import io.mosip.pms.partner.manager.dto.ApikeyRequests; -import io.mosip.pms.partner.manager.dto.PartnerAPIKeyRequestsResponse; -import io.mosip.pms.partner.manager.dto.PartnerAPIKeyToPolicyMappingsResponse; -import io.mosip.pms.partner.manager.dto.PartnerDetailsResponse; -import io.mosip.pms.partner.manager.dto.PartnersPolicyMappingRequest; -import io.mosip.pms.partner.manager.dto.PartnersPolicyMappingResponse; -import io.mosip.pms.partner.manager.dto.RetrievePartnerDetailsResponse; import io.mosip.pms.partner.manager.service.PartnerManagerService; import io.mosip.pms.partner.request.dto.APIkeyStatusUpdateRequestDto; import io.swagger.annotations.Api; @@ -50,7 +55,6 @@ */ @RestController -@RequestMapping(value = "/partners") @Api(tags = { "Partner Management Controller" }) public class PartnerManagementController { @@ -59,21 +63,24 @@ public class PartnerManagementController { @Autowired AuditUtil auditUtil; + + @Autowired + PartnerHelper partnerHelper; String msg = "mosip.partnermanagement.partners.retrieve"; String version = "1.0"; - + /** - * This API would be used by partner Manager, to update Partner api key to Policy Mappings. + * This endpoint would be used by partner Manager, to update Partner API key to Policy Mappings. * @param request this class contain oldPolicyID and newPolicyID * @param partnerId this is unique id created after self registered by partner * @param partnerApiKey this is unique id created by partner manager at the time of approving partner request * @return response this class contains massage about API key created successfully */ @PreAuthorize("hasAnyRole(@authorizedRoles.getPutpartnersapikeypolicies())") - @RequestMapping(value = "/{partnerId}/apikey/{apikey}/policies", method = RequestMethod.PUT) - @Operation(summary = "Service to update policies against to api key", description = "Service to update policies against to api key") + @RequestMapping(value = "/partners/{partnerId}/apikey/{apikey}/policies", method = RequestMethod.PUT) + @Operation(summary = "Service to update policies against to API key", description = "Service to update policies against to API key") public ResponseEntity> partnerApiKeyToPolicyMappings( @RequestBody @Valid RequestWrapper request, @PathVariable String partnerId, @@ -92,13 +99,13 @@ public ResponseEntity> partnerApi } /** - * This API would be used to activate/deactivate Auth/E-KYC Partners + * This endpoint would be used to activate/deactivate Auth/E-KYC Partners * @param partnerId this is unique id created after self registered by partner * @param request this class contains the status of activate/deactivate Auth/E-KYC Partners * @return respons this class contains massage about Partner status updated successfully */ @PreAuthorize("hasAnyRole(@authorizedRoles.getPatchpartners())") - @RequestMapping(value = "/{partnerId}", method = RequestMethod.PATCH) + @RequestMapping(value = "/partners/{partnerId}", method = RequestMethod.PATCH) @Operation(summary = "Service to activate/de-activate partner", description = "Service to activate/de-activate partner") public ResponseEntity> activateDeactivatePartner( @PathVariable String partnerId, @@ -114,15 +121,19 @@ public ResponseEntity> activateDe response.setResponse(partnersPolicyMappingResponse); auditUtil.setAuditRequestDto(PartnerManageEnum.ACTIVATE_DEACTIVATE_KYC_PARTNERS_SUCCESS); return new ResponseEntity<>(response, HttpStatus.OK); - } - - /** - * This API would be used to retrieve all Auth/E-KYC Partners for the policy group. - * @return response this class contains list of Auth/E-KYC Partners for the policy group + } + + /* + * This endpoint has been deprecated since the release-1.3.x + * It has been replaced by the new GET /partners/v3 endpoint. + * The functionality provided by this API is now available in the new endpoint. + * Please use the new endpoint for all future requests. */ + @Deprecated(since = "release-1.3.x") @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpartners())") - @RequestMapping(method = RequestMethod.GET) - @Operation(summary = "Service to get partner details", description = "Service to get partner details") + @RequestMapping(value = "/partners", method = RequestMethod.GET) + @Operation(summary = "Service to get partner details - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since the release-1.3.x and replaced by the GET /admin-partners endpoint") public ResponseEntity> getPartners( @RequestParam("partnerType") Optional partnerType){ ResponseWrapper response=new ResponseWrapper<>(); @@ -133,14 +144,18 @@ public ResponseEntity> getPartne response.setResponse(retrievePartnerDetailsResponse); return new ResponseEntity<>(response, HttpStatus.OK); } - - /** - * This API would be used to retrieve all Auth/E-KYC Partners for the policy group. - * @return response this class contains list of Auth/E-KYC Partners for the policy group + + /* + * This endpoint has been deprecated since the release-1.3.x + * It has been replaced by the new GET /partners/v3 endpoint. + * The functionality provided by this API is now available in the new endpoint. + * Please use the new endpoint for all future requests. */ + @Deprecated(since = "release-1.3.x") @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpartnersnew())") - @RequestMapping(value = "/v2", method = RequestMethod.GET) - @Operation(summary = "Service to get partner details", description = "Service to get partners details") + @RequestMapping(value = "/partners/v2", method = RequestMethod.GET) + @Operation(summary = "Service to get partner details - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since the release-1.3.x and replaced by the GET /admin-partners endpoint") public ResponseEntity> getPartnersDeatils( @RequestParam("partnerType") Optional partnerType){ ResponseWrapper response=new ResponseWrapper<>(); @@ -164,8 +179,8 @@ public ResponseEntity> getPartnersDeatil * @return response this class contains partnerID and policyId */ @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpartnersapikey())") - @RequestMapping(value = "/{partnerId}/apikey/{apikey}" , method = RequestMethod.GET) - @Operation(summary = "Service to get policy for given api key", description = "Service to get policy for given api key") + @RequestMapping(value = "/partners/{partnerId}/apikey/{apikey}" , method = RequestMethod.GET) + @Operation(summary = "Service to get policy for given API key", description = "Service to get policy for given API key") public ResponseEntity> getPolicyMappedToAPIKey( @PathVariable String partnerId, @PathVariable String apikey){ @@ -178,14 +193,18 @@ public ResponseEntity> ge response.setResponse(partnerAPIKeyToPolicyMappingsResponse); return new ResponseEntity<>(response , HttpStatus.OK); } - - /** - * This API would be used to retrieve all Partner API Key requests as received by partner manager - * @return response this class contains all Partner API Key requests as received by partner manager + + /* + * This endpoint has been deprecated since the release-1.3.x + * It has been replaced by the new GET /partner-policy-requests endpoint. + * The functionality provided by this API is now available in the new endpoint. + * Please use the new endpoint for all future requests. */ + @Deprecated(since = "release-1.3.x") @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpartnersapikey())") - @RequestMapping(value = "/apikey" , method = RequestMethod.GET) - @Operation(summary = "Service to get api key requests", description = "Service to get api key requests") + @RequestMapping(value = "/partners/apikey" , method = RequestMethod.GET) + @Operation(summary = "Service to get API key requests - deprecated since release-1.3.x.", + description = "This endpoint has been deprecated since the release-1.3.x and replaced by the GET /partner-policy-requests endpoint") public ResponseEntity> getAPIKeyRequests(){ List apikeyRequests = null; ResponseWrapper response = new ResponseWrapper<>(); @@ -199,13 +218,13 @@ public ResponseEntity> getAPIKeyR } /** - * This API would be used to retrieve the request for Partner API key to Policy Mappings for given request id. + * This endpoint would be used to retrieve the request for Partner API key to Policy Mappings for given request id. * @param apiKeyReqId this is unique id created after partner request for Partner API Key * @return response this class contains details related to Partner API key to Policy Mappings */ @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpartnersapikey())") - @RequestMapping(value = "/apikey/{apikey}" , method = RequestMethod.GET) - @Operation(summary = "Service to get api key request", description = "Service to get api key request") + @RequestMapping(value = "/partners/apikey/{apikey}" , method = RequestMethod.GET) + @Operation(summary = "Service to get API key request", description = "Service to get API key request") public ResponseEntity> getAPIKeyRequest( @PathVariable String apikey) { ResponseWrapper response = new ResponseWrapper<>(); @@ -218,7 +237,7 @@ public ResponseEntity> getAPIKeyRequest( } @PreAuthorize("hasAnyRole(@authorizedRoles.getPutpartnerspolicymapping())") - @RequestMapping(value = "/policy/{mappingkey}", method = RequestMethod.PUT) + @RequestMapping(value = "/partners/policy/{mappingkey}", method = RequestMethod.PUT) @Operation(summary = "Service to approve/reject partner policy mapping", description = "Service to approve/reject partner policy mapping") public ResponseEntity> approveRejectPolicyMappings( @RequestBody @Valid RequestWrapper request, @@ -232,8 +251,8 @@ public ResponseEntity> approveRejectPolicyMappings( } @PreAuthorize("hasAnyRole(@authorizedRoles.getPatchpartnerspolicyapikeystatus())") - @RequestMapping(value = "/{partnerId}/policy/{policyId}/apiKey/status", method = RequestMethod.PATCH) - @Operation(summary = "Service to activate/de-activate partner api key", description = "Service to activate/de-activate partner api key") + @RequestMapping(value = "/partners/{partnerId}/policy/{policyId}/apiKey/status", method = RequestMethod.PATCH) + @Operation(summary = "Service to activate/de-activate partner API key", description = "Service to activate/de-activate partner API key") public ResponseEntity> activateDeactivatePartnerAPIKey(@PathVariable String partnerId, @PathVariable String policyId, @RequestBody @Valid RequestWrapper request) { ResponseWrapper response = new ResponseWrapper<>(); @@ -244,4 +263,240 @@ public ResponseEntity> activateDeactivatePartnerAPIKey(@ auditUtil.setAuditRequestDto(PartnerManageEnum.ACTIVATE_DEACTIVATE_API_PARTNERS_SUCCESS); return new ResponseEntity<>(response, HttpStatus.OK); } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpartnerdetails())") + @GetMapping(value = "/admin-partners/{partnerId}") + @Operation(summary = "This endpoint retrieves all the details of the Partner based on Partner Id.", + description = "Available since release-1.3.x. It is configured for the role PARTNER_ADMIN.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + public ResponseWrapperV2 getPartnerDetails(@PathVariable String partnerId) { + return partnerManagementService.getPartnerDetails(partnerId); + } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getGetadminpartners())") + @GetMapping(value = "/admin-partners") + @Operation(summary = "This endpoint retrieves a list of all Partners.", + description = "Available since release-1.3.x. This endpoint supports pagination, sorting, and filtering. It is configured for the role PARTNER_ADMIN.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + public ResponseWrapperV2> getAdminPartners( + @RequestParam(value = "sortFieldName", required = false) String sortFieldName, + @RequestParam(value = "sortType", required = false) String sortType, // e.g., ASC or DESC + @RequestParam(value = "pageNo", defaultValue = "0") Integer pageNo, + @RequestParam(value = "pageSize", defaultValue = "8") Integer pageSize, + @RequestParam(value = "partnerId", required = false) String partnerId, + @RequestParam(value = "partnerType", required = false) String partnerType, + @RequestParam(value = "isActive", required = false) Boolean isActive, + @RequestParam(value = "orgName", required = false) String orgName, + @RequestParam(value = "emailAddress", required = false) String emailAddress, + @Parameter( + description = "Status of certificate upload", + in = ParameterIn.QUERY, + schema = @Schema(allowableValues = {"uploaded", "not_uploaded"}) + ) + @RequestParam(value = "certificateUploadStatus", required = false) String certificateUploadStatus, + @RequestParam(value = "policyGroupName", required = false) String policyGroupName + ) { + partnerHelper.validateRequestParameters(partnerHelper.partnerAliasToColumnMap, sortFieldName, sortType, pageNo, pageSize); + PartnerFilterDto partnerFilterDto = new PartnerFilterDto(); + if (partnerId != null) { + partnerFilterDto.setPartnerId(partnerId.toLowerCase()); + } + if (partnerType != null) { + partnerFilterDto.setPartnerTypeCode(partnerType.toLowerCase()); + } + if (orgName != null) { + partnerFilterDto.setOrganizationName(orgName.toLowerCase()); + } + if (policyGroupName != null) { + partnerFilterDto.setPolicyGroupName(policyGroupName.toLowerCase()); + } + if (certificateUploadStatus != null) { + partnerFilterDto.setCertificateUploadStatus(certificateUploadStatus); + } + if (emailAddress != null) { + partnerFilterDto.setEmailAddress(emailAddress.toLowerCase()); + } + if (isActive != null) { + partnerFilterDto.setIsActive(isActive); + } + return partnerManagementService.getAdminPartners(sortFieldName, sortType, pageNo, pageSize, partnerFilterDto); + } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getGetallpartnerpolicymappingrequests())") + @GetMapping(value = "/partner-policy-requests") + @Operation(summary = "This endpoint fetches list of all the policy requests made by the partners.", + description = "Available since release-1.3.x. This endpoint supports pagination, sorting, and filtering based on optional query parameters. If the token used to access this endpoint, does not have the PARTNER_ADMIN role, then it will fetch all the policy requests made by all the partners associated with the logged in user only.If the token used to access this endpoint, has PARTNER_ADMIN role, then it will fetch all the policy requests made by all the partners.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + public ResponseWrapperV2> getAllPartnerPolicyRequests( + @RequestParam(value = "sortFieldName", required = false) String sortFieldName, + @RequestParam(value = "sortType", required = false) String sortType, + @RequestParam(value = "pageNo", required = false) Integer pageNo, + @RequestParam(value = "pageSize", required = false) Integer pageSize, + @RequestParam(value = "partnerId", required = false) String partnerId, + @RequestParam(value = "partnerComment", required = false) String partnerComment, + @RequestParam(value = "orgName", required = false) String orgName, + @Parameter( + description = "Status of request", + in = ParameterIn.QUERY, + schema = @Schema(allowableValues = {"approved", "rejected", "InProgress"}) + ) + @RequestParam(value = "status", required = false) String status, + @RequestParam(value = "policyId", required = false) String policyId, + @RequestParam(value = "policyName", required = false) String policyName, + @RequestParam(value = "policyGroupName", required = false) String policyGroupName, + @RequestParam(value = "partnerType", required = false) String partnerType + ) { + partnerHelper.validateRequestParameters(partnerHelper.partnerPolicyMappingAliasToColumnMap, sortFieldName, sortType, pageNo, pageSize); + PartnerPolicyRequestFilterDto filterDto = new PartnerPolicyRequestFilterDto(); + if (partnerId != null) { + filterDto.setPartnerId(partnerId.toLowerCase()); + } + if (partnerComment != null) { + filterDto.setPartnerComment(partnerComment.toLowerCase()); + } + if (orgName != null) { + filterDto.setOrganizationName(orgName.toLowerCase()); + } + if (status != null) { + filterDto.setStatus(status); + } + if (policyId != null) { + filterDto.setPolicyId(policyId.toLowerCase()); + } + if (policyName != null) { + filterDto.setPolicyName(policyName.toLowerCase()); + } + if (policyGroupName != null) { + filterDto.setPolicyGroupName(policyGroupName.toLowerCase()); + } + if (partnerType != null) { + filterDto.setPartnerType(partnerType.toLowerCase()); + } + return partnerManagementService.getAllPartnerPolicyRequests(sortFieldName, sortType, pageNo, pageSize, filterDto); + } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpartnersapikeyrequests())") + @GetMapping(value = "/partner-api-keys") + @Operation(summary = "This endpoint retrieves a list of all the API keys created by the Auth Partners.", + description = "Available since release-1.3.x. This endpoint supports pagination, sorting, and and filtering based on optional query parameters. If the token used to access this endpoint, does not have the PARTNER_ADMIN role, then it will fetch all the API keys created by all the partners associated with the logged in user only. If the token used to access this endpoint, has PARTNER_ADMIN role, then it will fetch all the API keys created by all the partners.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + public ResponseWrapperV2> getAllApiKeyRequests( + @RequestParam(value = "sortFieldName", required = false) String sortFieldName, + @RequestParam(value = "sortType", required = false) String sortType, + @RequestParam(value = "pageNo", required = false) Integer pageNo, + @RequestParam(value = "pageSize", required = false) Integer pageSize, + @RequestParam(value = "partnerId", required = false) String partnerId, + @RequestParam(value = "apiKeyLabel", required = false) String apiKeyLabel, + @RequestParam(value = "orgName", required = false) String orgName, + @Parameter( + description = "Status of request", + in = ParameterIn.QUERY, + schema = @Schema(allowableValues = {"activated", "deactivated"}) + ) + @RequestParam(value = "status", required = false) String status, + @RequestParam(value = "policyName", required = false) String policyName, + @RequestParam(value = "policyGroupName", required = false) String policyGroupName + ) { + partnerHelper.validateRequestParameters(partnerHelper.apiKeyAliasToColumnMap, sortFieldName, sortType, pageNo, pageSize); + ApiKeyFilterDto filterDto = new ApiKeyFilterDto(); + if (partnerId != null) { + filterDto.setPartnerId(partnerId.toLowerCase()); + } + if (apiKeyLabel != null) { + filterDto.setApiKeyLabel(apiKeyLabel.toLowerCase()); + } + if (orgName != null) { + filterDto.setOrgName(orgName.toLowerCase()); + } + if (status != null) { + filterDto.setStatus(status); + } + if (policyName != null) { + filterDto.setPolicyName(policyName.toLowerCase()); + } + if (policyGroupName != null) { + filterDto.setPolicyGroupName(policyGroupName.toLowerCase()); + } + return partnerManagementService.getAllApiKeyRequests(sortFieldName, sortType, pageNo, pageSize, filterDto); + } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getGettrustcertificates())") + @GetMapping(value = "/trust-chain-certificates") + @Operation(summary = "This endpoint retrieves a list of all the Trust Certificates uploaded by the Partner Admin.", + description = "Available since release-1.3.x. This endpoint supports pagination, sorting, and filtering. It is configured for the role PARTNER_ADMIN.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + public ResponseWrapperV2> getTrustCertificates( + @RequestParam(value = "sortFieldName", required = false) String sortFieldName, + @RequestParam(value = "sortType", required = false) String sortType, // e.g., ASC or DESC + @RequestParam(value = "pageNo", defaultValue = "0") Integer pageNo, + @RequestParam(value = "pageSize", defaultValue = "8") Integer pageSize, + @Parameter( + description = "Type of CA certificate", + in = ParameterIn.QUERY, + schema = @Schema(allowableValues = {"ROOT", "INTERMEDIATE"}) + ) + @RequestParam(value = "caCertificateType", required = false) String caCertificateType, + @RequestParam(value = "certificateId", required = false) String certificateId, + @Parameter( + description = "Type of partner domain", + in = ParameterIn.QUERY, + schema = @Schema(allowableValues = {"FTM", "DEVICE", "AUTH"}) + ) + @RequestParam(value = "partnerDomain", required = false) String partnerDomain, + @RequestParam(value = "issuedTo", required = false) String issuedTo, + @RequestParam(value = "issuedBy", required = false) String issuedBy + ) { + partnerHelper.validateRequestParameters(partnerHelper.trustCertificateAliasToColumnMap, sortFieldName, sortType, pageNo, pageSize); + TrustCertificateFilterDto filterDto = new TrustCertificateFilterDto(); + if (caCertificateType != null) { + filterDto.setCaCertificateType(caCertificateType); + } + if (certificateId != null) { + filterDto.setCertificateId(certificateId); + } + if (partnerDomain != null) { + filterDto.setPartnerDomain(partnerDomain); + } + if (issuedTo != null) { + filterDto.setIssuedTo(issuedTo); + } + if (issuedBy != null) { + filterDto.setIssuedBy(issuedBy); + } + return partnerManagementService.getTrustCertificates(sortFieldName, sortType, pageNo, pageSize, filterDto); + } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getGetdownloadtrustcertificates())") + @GetMapping(value = "/trust-chain-certificates/{certificateId}/certificateFile") + @Operation(summary = "This endpoint will download p7b file for a CA / Intermediate CA certificate along with the trust chain based on Certificate Id.", + description = "Available since release-1.3.x. It is configured for the role PARTNER_ADMIN.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + ResponseWrapperV2 downloadTrustCertificates( + @ApiParam("To download trust certificates.") @PathVariable("certificateId") @NotNull String certificateId) { + return partnerManagementService.downloadTrustCertificates(certificateId); + } } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/ApiKeyFilterDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/ApiKeyFilterDto.java new file mode 100644 index 0000000000..0ca73a6cbe --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/ApiKeyFilterDto.java @@ -0,0 +1,22 @@ +package io.mosip.pms.partner.manager.dto; + +import lombok.Data; + +import java.util.Date; + +@Data +public class ApiKeyFilterDto { + + private String partnerId; + + private String apiKeyLabel; + + private String orgName; + + private String policyName; + + private String policyGroupName; + + private String status; + +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/ApiKeyRequestSummaryDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/ApiKeyRequestSummaryDto.java new file mode 100644 index 0000000000..a5c7c713ce --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/ApiKeyRequestSummaryDto.java @@ -0,0 +1,44 @@ +package io.mosip.pms.partner.manager.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +public class ApiKeyRequestSummaryDto { + + @Schema(description = "Unique identifier for the partner", example = "partner123") + private String partnerId; + + @Schema(description = "Label of the API key", example = "Sample API Key") + private String apiKeyLabel; + + @Schema(description = "Name of the partner organization", example = "Organization ABC") + private String orgName; + + @Schema(description = "Name of the associated policy", example = "Access Control Policy") + private String policyName; + + @Schema(description = "Id of the associated policy", example = "123") + private String policyId; + + @Schema(description = "Description of the policy name the partner has selected", example = "policy for authentication") + private String policyDescription; + + @Schema(description = "Unique identifier for the policy group", example = "policyGroup789") + private String policyGroupId; + + @Schema(description = "Name of the policy group", example = "Security Policies") + private String policyGroupName; + + @Schema(description = "Description of the policy group the partner has selected", example = "PolicyGroup123") + private String policyGroupDescription; + + @Schema(description = "Status of the API key (e.g., activated, deactivated)", example = "activated") + private String status; + + @Schema(description = "Date and time when the API key was created", example = "2024-08-01T14:30:00Z") + private Date createdDateTime; + +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerDetailsV3Dto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerDetailsV3Dto.java new file mode 100644 index 0000000000..510373704e --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerDetailsV3Dto.java @@ -0,0 +1,60 @@ +package io.mosip.pms.partner.manager.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; +import java.util.Date; + +@Data +@Getter +@Setter +public class PartnerDetailsV3Dto { + + @Schema(description = "Unique identifier for the partner", example = "partner123") + private String partnerId; + + @Schema(description = "First name of the partner", example = "John") + private String firstName; + + @Schema(description = "Last name of the partner", example = "Doe") + private String lastName; + + @Schema(description = "Status of the partner", example = "approved") + private String approvalStatus; + + @Schema(description = "Created Date time of the partner Id.", example = "2024-07-15T10:00:00Z") + private LocalDateTime createdDateTime; + + @Schema(description = "Type of partner (e.g., distributor, supplier, etc.)", example = "distributor") + private String partnerType; + + @Schema(description = "Name of the organization the partner belongs to", example = "Org") + private String organizationName; + + @Schema(description = "Contact Number of the partner", example = "8983983332") + private String contactNumber; + + @Schema(description = "Name of the policy group name the partner has selected", example = "Policy123") + private String policyGroupName; + + @Schema(description = "Description of the policy group the partner has selected", example = "PolicyGroup123") + private String policyGroupDescription; + + @Schema(description = "Email address of the partner", example = "partner@email.com") + private String emailId; + + @Schema(description = "Date when the certificate was uploaded", example = "2024-07-15T10:00:00Z") + private Date certificateUploadDateTime; + + @Schema(description = "Date when the certificate expires", example = "2025-07-15T10:00:00Z") + private Date certificateExpiryDateTime; + + @Schema(description = "Indicates whether the certificate is available (true if available, false otherwise)", example = "true") + private Boolean isCertificateAvailable; + + @Schema(description = "Indicates whether the partner is active (true if active, false otherwise)", example = "true") + private Boolean isActive; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerFilterDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerFilterDto.java new file mode 100644 index 0000000000..9f6c917d80 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerFilterDto.java @@ -0,0 +1,14 @@ +package io.mosip.pms.partner.manager.dto; + +import lombok.Data; + +@Data +public class PartnerFilterDto { + private String partnerId; + private String partnerTypeCode; + private String organizationName; + private String policyGroupName; + private String certificateUploadStatus; + private String emailAddress; + private Boolean isActive; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerPolicyRequestFilterDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerPolicyRequestFilterDto.java new file mode 100644 index 0000000000..b7aa0eab56 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerPolicyRequestFilterDto.java @@ -0,0 +1,15 @@ +package io.mosip.pms.partner.manager.dto; + +import lombok.Data; + +@Data +public class PartnerPolicyRequestFilterDto { + private String partnerId; + private String partnerType; + private String partnerComment; + private String organizationName; + private String policyId; + private String policyName; + private String status; + private String policyGroupName; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerPolicyRequestSummaryDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerPolicyRequestSummaryDto.java new file mode 100644 index 0000000000..06f985c595 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerPolicyRequestSummaryDto.java @@ -0,0 +1,56 @@ +package io.mosip.pms.partner.manager.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +public class PartnerPolicyRequestSummaryDto { + + @Schema(description = "Unique identifier for the partner policy mapping request", example = "1213") + private String id; + + @Schema(description = "Unique identifier for the partner", example = "partner123") + private String partnerId; + + @Schema(description = "Status of the partner (e.g., approved, InProgress, deactivated)", example = "approved") + private String partnerStatus; + + @Schema(description = "Name of the partner organisation", example = "abc") + private String orgName; + + @Schema(description = "Name of the policy", example = "Compliance Policy") + private String policyName; + + @Schema(description = "Unique Id for policy group", example = "Compliance Policy group") + private String policyGroupId; + + @Schema(description = "Name of the policy group", example = "Compliance Policy group") + private String policyGroupName; + + @Schema(description = "Request details about partner-policy mapping", example = "Requesting for compliance policies") + private String partnerComment; + + @Schema(description = "Status of the partner policy mapping request (e.g., approved, InProgress)", example = "approved") + private String status; + + @Schema(description = "Date and time when the request was created", example = "2024-08-01T14:30:00Z") + private Date createdDateTime; + + @Schema(description = "Type of partner (e.g., Auth_Partner, Device_Provider, etc.)", example = "Auth_partner") + private String partnerType; + + @Schema(description = "Unique Id for policy", example = "12345") + private String policyId; + + @Schema(description = "Date and time when the request was updated", example = "2024-08-01T14:30:00Z") + private Date updatedDateTime; + + @Schema(description = "A description of the policy", example = "policy for compliance") + private String policyDescription; + + @Schema(description = "A description of policy group", example = "contains all compliance policies") + private String policyGroupDescription; + +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerSummaryDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerSummaryDto.java new file mode 100644 index 0000000000..22b92436bb --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/PartnerSummaryDto.java @@ -0,0 +1,41 @@ +package io.mosip.pms.partner.manager.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +public class PartnerSummaryDto { + + @Schema(description = "Unique identifier for the partner", example = "partner123") + private String partnerId; + + @Schema(description = "Type of partner (e.g., Auth_Partner, Device_Provider, etc.)", example = "Auth_partner") + private String partnerType; + + @Schema(description = "Name of the partner organisation", example = "abc") + private String orgName; + + @Schema(description = "Unique Id for policy group", example = "12345") + private String policyGroupId; + + @Schema(description = "Name of the policy group", example = "Compliance Policies") + private String policyGroupName; + + @Schema(description = "Partner email address", example = "abc@gmail.com") + private String emailAddress; + + @Schema(description = "Status of partner certificate (e.g. uploaded, notUploaded)", example = "uploaded") + private String certificateUploadStatus; + + @Schema(description = "Status of the partner (e.g., approved, InProgress)", example = "approved") + private String status; + + @Schema(description = "Indicates whether the partner is active (true if active, false otherwise)", example = "true") + private Boolean isActive; + + @Schema(description = "Date and time when the record was created", example = "2024-08-01T14:30:00Z") + private Date createdDateTime; + +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertTypeListRequestDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertTypeListRequestDto.java new file mode 100644 index 0000000000..5f8db7d55c --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertTypeListRequestDto.java @@ -0,0 +1,94 @@ +package io.mosip.pms.partner.manager.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(description = "Model representing request to get CA/Sub-CA certificates.") +public class TrustCertTypeListRequestDto { + + /** + * Certificate Type + */ + @ApiModelProperty(notes = "Partner Certificate Type", required = false) + String caCertificateType; + + /** + * Domain Name + */ + @ApiModelProperty(notes = "Domain Name", required = false) + String partnerDomain; + + @ApiModelProperty(notes = "Flag to force exclude the mosip CA Certificates", example = "false", required = false) + private Boolean excludeMosipCA; + + /** + * CA Certificate Id + */ + @ApiModelProperty(notes = "CA Certificate Id", required = false) + private String certId; + + /** + * Ca Certificate Issued To + */ + @ApiModelProperty(notes = "Issued To", required = false) + private String issuedTo; + + /** + * Ca Certificate Issued By + */ + @ApiModelProperty(notes = "Issued By", required = false) + private String issuedBy; + + /** + * Ca Certificate Valid From + */ + @ApiModelProperty(notes = "Valid From", required = false) + private LocalDateTime validFromDate; + + /** + * Ca Certificate Valid Till + */ + @ApiModelProperty(notes = "Valid Till", required = false) + private LocalDateTime validTillDate; + + /** + * Ca Certificate uploaded time + */ + @ApiModelProperty(notes = "Upload Time", required = false) + private LocalDateTime uploadTime; + + /** + * Sort By Field Name + */ + @ApiModelProperty(notes = "Sort By Field", required = false) + private String sortByFieldName; + + /** + * Sort Direction: ASC, DESC + */ + @ApiModelProperty(notes = "Sort Direction", required = false) + String sortOrder; + + /** + * Page Number + */ + @ApiModelProperty(notes = "Page Number", required = false) + @NotNull + int pageNumber; + + /** + * Number of Certificate + */ + @ApiModelProperty(notes = "Number of Certificates", required = false) + @NotNull + int pageSize; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertTypeListResponseDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertTypeListResponseDto.java new file mode 100644 index 0000000000..102f190a28 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertTypeListResponseDto.java @@ -0,0 +1,21 @@ +package io.mosip.pms.partner.manager.dto; + +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(description = "Class representing All CA Certificate Data Response") +public class TrustCertTypeListResponseDto { + private int pageNumber; + private int pageSize; + private long totalRecords; + private int totalPages; + private List allPartnerCertificates; + +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertificateFilterDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertificateFilterDto.java new file mode 100644 index 0000000000..7c13f08f89 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertificateFilterDto.java @@ -0,0 +1,13 @@ +package io.mosip.pms.partner.manager.dto; + +import lombok.Data; + +@Data +public class TrustCertificateFilterDto { + + private String caCertificateType; + private String certificateId; + private String partnerDomain; + private String issuedTo; + private String issuedBy; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertificateResponseDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertificateResponseDto.java new file mode 100644 index 0000000000..3929aa792c --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertificateResponseDto.java @@ -0,0 +1,23 @@ +package io.mosip.pms.partner.manager.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TrustCertificateResponseDto { + + /** + * CA Certificate Data + */ + private String p7bFile; + + /** + * Response Timestamp + */ + private LocalDateTime timestamp; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertificateSummaryDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertificateSummaryDto.java new file mode 100644 index 0000000000..9b8c9ac8fd --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/dto/TrustCertificateSummaryDto.java @@ -0,0 +1,40 @@ +package io.mosip.pms.partner.manager.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class TrustCertificateSummaryDto { + + @Schema(description = "Type of the CA certificate (e.g., ROOT, INTERMEDIATE)", example = "ROOT") + private String caCertificateType; + + @Schema(description = "Unique identifier for the CA certificate", example = "cert123") + private String certId; + + @Schema(description = "Type of the partner domain (e.g., FTM, DEVICE, and AUTH)", example = "FTM") + private String partnerDomain; + + @Schema(description = "The entity or person receiving the certificate.", example = "Company A") + private String issuedTo; + + @Schema(description = "The entity or person issuing the certificate.", example = "Certificate Authority X") + private String issuedBy; + + @Schema(description = "The unique hash of the certificate.", example = "xyx-abc-123") + private String certThumbprint; + + @Schema(description = "The start date and time of the certificate's validity period", example = "2023-12-01T00:00:00") + private LocalDateTime validFromDate; + + @Schema(description = "The end date and time of the certificate's validity period", example = "2024-12-01T00:00:00") + private LocalDateTime validTillDate; + + @Schema(description = "The date and time when the certificate was uploaded", example = "2023-11-30T10:15:30") + private LocalDateTime uploadTime; + + @Schema(description = "Indicates whether the certificate is active (true if active, false otherwise)", example = "true") + private Boolean status; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/service/PartnerManagerService.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/service/PartnerManagerService.java index 86c8b6b11a..bd7f3b8099 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/service/PartnerManagerService.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/service/PartnerManagerService.java @@ -3,16 +3,14 @@ import java.util.List; import java.util.Optional; -import io.mosip.pms.partner.manager.dto.StatusRequestDto; -import io.mosip.pms.partner.manager.dto.ApikeyRequests; -import io.mosip.pms.partner.manager.dto.PartnerAPIKeyToPolicyMappingsResponse; -import io.mosip.pms.partner.manager.dto.PartnerDetailsResponse; -import io.mosip.pms.partner.manager.dto.PartnersPolicyMappingRequest; -import io.mosip.pms.partner.manager.dto.PartnersPolicyMappingResponse; -import io.mosip.pms.partner.manager.dto.RetrievePartnerDetailsResponse; +import io.mosip.pms.common.dto.PageResponseV2Dto; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.partner.manager.dto.TrustCertificateFilterDto; +import io.mosip.pms.partner.manager.dto.*; import io.mosip.pms.partner.request.dto.APIKeyGenerateRequestDto; import io.mosip.pms.partner.request.dto.APIkeyStatusUpdateRequestDto; import io.mosip.pms.partner.response.dto.APIKeyGenerateResponseDto; +import io.mosip.pms.partner.manager.dto.TrustCertificateSummaryDto; public interface PartnerManagerService { @@ -94,4 +92,15 @@ public PartnersPolicyMappingResponse activateDeactivateAuthEKYCPartner(String pa */ public PartnerDetailsResponse getPartners(Optional partnerType); + public ResponseWrapperV2 getPartnerDetails(String partnerId); + + public ResponseWrapperV2> getAdminPartners(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, PartnerFilterDto partnerFilterDto); + + public ResponseWrapperV2> getAllPartnerPolicyRequests(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, PartnerPolicyRequestFilterDto filterDto); + + public ResponseWrapperV2> getAllApiKeyRequests(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, ApiKeyFilterDto filterDto); + + public ResponseWrapperV2> getTrustCertificates(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, TrustCertificateFilterDto filterDto); + + public ResponseWrapperV2 downloadTrustCertificates(String certificateId); } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/service/impl/PartnerManagementServiceImpl.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/service/impl/PartnerManagementServiceImpl.java index 484cf17e8c..c3b79e7ee3 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/service/impl/PartnerManagementServiceImpl.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/manager/service/impl/PartnerManagementServiceImpl.java @@ -1,6 +1,7 @@ package io.mosip.pms.partner.manager.service.impl; import java.io.IOException; +import java.security.cert.X509Certificate; import java.sql.Timestamp; import java.time.LocalDateTime; import java.util.ArrayList; @@ -10,14 +11,33 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Objects; import javax.transaction.Transactional; +import io.mosip.kernel.core.authmanager.authadapter.model.AuthUserDetails; +import io.mosip.pms.common.dto.*; +import io.mosip.pms.common.entity.*; +import io.mosip.pms.common.repository.*; +import io.mosip.pms.common.request.dto.RequestWrapper; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.partner.dto.KeycloakUserDto; +import io.mosip.pms.partner.exception.PartnerServiceException; +import io.mosip.pms.partner.manager.dto.*; +import io.mosip.pms.partner.request.dto.PartnerCertDownloadRequestDto; +import io.mosip.pms.partner.util.MultiPartnerUtil; +import io.mosip.pms.partner.util.PartnerHelper; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.http.MediaType; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.JsonNode; @@ -27,26 +47,8 @@ import io.mosip.pms.common.constant.ApiAccessibleExceptionConstant; import io.mosip.pms.common.constant.ConfigKeyConstants; import io.mosip.pms.common.constant.EventType; -import io.mosip.pms.common.dto.APIKeyDataPublishDto; -import io.mosip.pms.common.dto.PartnerDataPublishDto; -import io.mosip.pms.common.dto.PolicyPublishDto; -import io.mosip.pms.common.dto.Type; -import io.mosip.pms.common.entity.AuthPolicy; -import io.mosip.pms.common.entity.BiometricExtractorProvider; -import io.mosip.pms.common.entity.MISPLicenseEntity; -import io.mosip.pms.common.entity.Partner; -import io.mosip.pms.common.entity.PartnerPolicy; -import io.mosip.pms.common.entity.PartnerPolicyRequest; import io.mosip.pms.common.exception.ApiAccessibleException; import io.mosip.pms.common.helper.WebSubPublisher; -import io.mosip.pms.common.repository.AuthPolicyRepository; -import io.mosip.pms.common.repository.BiometricExtractorProviderRepository; -import io.mosip.pms.common.repository.MispLicenseRepository; -import io.mosip.pms.common.repository.MispServiceRepository; -import io.mosip.pms.common.repository.PartnerPolicyRepository; -import io.mosip.pms.common.repository.PartnerPolicyRequestRepository; -import io.mosip.pms.common.repository.PartnerRepository; -import io.mosip.pms.common.repository.PolicyGroupRepository; import io.mosip.pms.common.response.dto.NotificationDto; import io.mosip.pms.common.service.NotificatonService; import io.mosip.pms.common.util.MapperUtils; @@ -57,15 +59,6 @@ import io.mosip.pms.partner.constant.PartnerConstants; import io.mosip.pms.partner.manager.constant.ErrorCode; import io.mosip.pms.partner.manager.constant.PartnerManageEnum; -import io.mosip.pms.partner.manager.dto.StatusRequestDto; -import io.mosip.pms.partner.manager.dto.ApikeyRequests; -import io.mosip.pms.partner.manager.dto.PartnerAPIKeyToPolicyMappingsResponse; -import io.mosip.pms.partner.manager.dto.PartnerDetailsDto; -import io.mosip.pms.partner.manager.dto.PartnerDetailsResponse; -import io.mosip.pms.partner.manager.dto.PartnersPolicyMappingRequest; -import io.mosip.pms.partner.manager.dto.PartnersPolicyMappingResponse; -import io.mosip.pms.partner.manager.dto.RetrievePartnerDetailsResponse; -import io.mosip.pms.partner.manager.dto.RetrievePartnersDetails; import io.mosip.pms.partner.manager.exception.PartnerManagerServiceException; import io.mosip.pms.partner.manager.service.PartnerManagerService; import io.mosip.pms.partner.request.dto.APIKeyGenerateRequestDto; @@ -79,10 +72,38 @@ public class PartnerManagementServiceImpl implements PartnerManagerService { private static final Logger LOGGER = PMSLogger.getLogger(PartnerManagementServiceImpl.class); + public static final String DEVICE_PROVIDER = "Device_Provider"; + public static final String FTM_PROVIDER = "FTM_Provider"; + private static final String APPROVED = "approved"; + public static final String BLANK_STRING = ""; + + @Value("${mosip.pms.api.id.admin.partners.get}") + private String getAdminPartnersId; + + @Value("${mosip.pms.api.id.all.partner.policy.mapping.requests.get}") + private String getAllPartnerPolicyMappingRequestsId; + + @Value("${mosip.pms.api.id.all.api.key.requests.get}") + private String getAllApiKeyRequestsId; + + @Value("${mosip.pms.api.id.trust.certificates.get}") + private String getTrustCertificatesId; + + @Value("${mosip.pms.api.id.download.trust.certificates.get}") + private String getDownloadTrustCertificateId; + + @Autowired + PartnerSummaryRepository partnerSummaryRepository; + + @Autowired + PartnerPolicyMappingRequestRepository partnerPolicyMappingRequestRepository; @Autowired PartnerPolicyRepository partnerPolicyRepository; + @Autowired + ApiKeyRequestSummaryRepository apiKeyRequestSummaryRepository; + @Autowired PartnerRepository partnerRepository; @@ -122,12 +143,23 @@ public class PartnerManagementServiceImpl implements PartnerManagerService { @Autowired private ObjectMapper mapper; + @Autowired + PartnerHelper partnerHelper; + + @Autowired + PartnerServiceRepository partnerServiceRepository; + @Value("${pmp.bioextractors.required.partner.types}") private String biometricExtractorsRequiredPartnerTypes; @Value("${mosip.pmp.partner.policy.expiry.period.indays}") private int partnerPolicyExpiryInDays; + @Value("${mosip.pms.api.id.partner.details.get}") + private String getPartnerDetailsId; + + public static final String VERSION = "1.0"; + @Override public PartnersPolicyMappingResponse updatePolicyAgainstApikey(PartnersPolicyMappingRequest request, String partnerId, String partnerApikey) { @@ -190,6 +222,10 @@ public PartnersPolicyMappingResponse activateDeactivateAuthEKYCPartner(String pa ErrorCode.PARTNER_ID_DOES_NOT_EXIST_EXCEPTION.getErrorMessage()); } Partner updatePartnerObject = partnerFromDb.get(); + if (updatePartnerObject.getApprovalStatus().equals(APPROVED) && !updatePartnerObject.getIsActive()){ + throw new PartnerManagerServiceException(ErrorCode.PARTNER_ALREADY_DEACTIVATED.getErrorCode(), + ErrorCode.PARTNER_ALREADY_DEACTIVATED.getErrorMessage()); + } updatePartnerObject.setUpdBy(getUser()); updatePartnerObject.setUpdDtimes(Timestamp.valueOf(LocalDateTime.now())); PartnersPolicyMappingResponse response = new PartnersPolicyMappingResponse(); @@ -609,7 +645,7 @@ public APIKeyGenerateResponseDto generateAPIKey(String partnerId, APIKeyGenerate ErrorCode.PARTNER_POLICY_MAPPING_NOT_EXISTS.getErrorMessage()); } PartnerPolicy policyByLabel = partnerPolicyRepository.findByPartnerIdPolicyIdAndLabel( - partnerFromDb.get().getId(), validPolicy.getId(), requestDto.getLabel()); + partnerFromDb.get().getId(), validPolicy.getId(), PartnerUtil.trimAndReplace(requestDto.getLabel())); if(policyByLabel != null) { auditUtil.setAuditRequestDto(PartnerManageEnum.GENERATE_API_KEY_FAILURE, partnerId, "partnerId"); throw new PartnerManagerServiceException(ErrorCode.PARTNER_POLICY_LABEL_EXISTS.getErrorCode(), @@ -675,16 +711,18 @@ public String updateAPIKeyStatus(String partnerId, String policyId, APIkeyStatus throw new PartnerManagerServiceException(ErrorCode.PARTNER_POLICY_LABEL_NOT_EXISTS.getErrorCode(), ErrorCode.PARTNER_POLICY_LABEL_NOT_EXISTS.getErrorMessage()); } - /* - // check if Partner is Active or not - if (policyByLabel.getPartner() != null && !policyByLabel.getPartner().getIsActive()) { - LOGGER.error("Partner is not Active, hence status of API key cannot be updated, for partner: " + partnerId); - auditUtil.setAuditRequestDto(PartnerManageEnum.ACTIVATE_DEACTIVATE_API_PARTNERS_FAILED, partnerId, - "partnerId"); - throw new PartnerManagerServiceException(ErrorCode.PARTNER_NOT_ACTIVE_EXCEPTION.getErrorCode(), - ErrorCode.PARTNER_NOT_ACTIVE_EXCEPTION.getErrorMessage()); + //check if logged in user is admin + boolean isAdmin = partnerHelper.isPartnerAdmin(authUserDetails().getAuthorities().toString()); + if (!isAdmin){ + // check if Partner is Active or not. + if (policyByLabel.getPartner() != null && !policyByLabel.getPartner().getIsActive()) { + LOGGER.error("Partner is not Active, hence status of API key cannot be updated, for partner: " + partnerId); + auditUtil.setAuditRequestDto(PartnerManageEnum.ACTIVATE_DEACTIVATE_API_PARTNERS_FAILED, partnerId, + "partnerId"); + throw new PartnerManagerServiceException(ErrorCode.PARTNER_NOT_ACTIVE_EXCEPTION.getErrorCode(), + ErrorCode.PARTNER_NOT_ACTIVE_EXCEPTION.getErrorMessage()); + } } - */ // check if API key has been already deactivated if (!policyByLabel.getIsActive() && request.getStatus().equalsIgnoreCase(PartnerConstants.DEACTIVE)) { LOGGER.error( @@ -716,6 +754,415 @@ public String updateAPIKeyStatus(String partnerId, String policyId, APIkeyStatus LOGGER.info(request.getStatus() + " : is Invalid Input Parameter, it should be (Active/De-Active)"); throw new PartnerManagerServiceException(ErrorCode.INVALID_STATUS_CODE_ACTIVE_DEACTIVE.getErrorCode(), ErrorCode.INVALID_STATUS_CODE_ACTIVE_DEACTIVE.getErrorMessage()); - } + } + + @Override + public ResponseWrapperV2 getPartnerDetails(String partnerId) { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + try { + String userId = getUserId(); + List partnerList = partnerServiceRepository.findByUserId(userId); + if (partnerList.isEmpty()) { + LOGGER.info("sessionId", "idType", "id", "User id does not exists."); + throw new PartnerServiceException(io.mosip.pms.partner.constant.ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + io.mosip.pms.partner.constant.ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); + } + if (Objects.isNull(partnerId) || partnerId.isEmpty()) { + throw new PartnerServiceException( + io.mosip.pms.partner.constant.ErrorCode.INVALID_REQUEST_PARAM.getErrorCode(), + io.mosip.pms.partner.constant.ErrorCode.INVALID_REQUEST_PARAM.getErrorMessage() + ); + } + Optional optionalPartner = partnerServiceRepository.findById(partnerId); + if (optionalPartner.isEmpty()) { + throw new PartnerServiceException( + io.mosip.pms.partner.constant.ErrorCode.PARTNER_DOES_NOT_EXIST_EXCEPTION.getErrorCode(), + io.mosip.pms.partner.constant.ErrorCode.PARTNER_DOES_NOT_EXIST_EXCEPTION.getErrorMessage() + ); + } + PartnerDetailsV3Dto partnerDetailsV3Dto = new PartnerDetailsV3Dto(); + Partner partner = optionalPartner.get(); + partnerDetailsV3Dto.setPartnerId(partner.getId()); + partnerDetailsV3Dto.setApprovalStatus(partner.getApprovalStatus()); + partnerDetailsV3Dto.setIsActive(partner.getIsActive()); + partnerDetailsV3Dto.setCreatedDateTime(partner.getCrDtimes().toLocalDateTime()); + partnerDetailsV3Dto.setPartnerType(partner.getPartnerTypeCode()); + partnerDetailsV3Dto.setOrganizationName(partner.getName()); + partnerDetailsV3Dto.setEmailId(partner.getEmailId()); + partnerDetailsV3Dto.setContactNumber(partner.getContactNo()); + if ((!partner.getPartnerTypeCode().equals(FTM_PROVIDER) && + !partner.getPartnerTypeCode().equals(DEVICE_PROVIDER) && + (Objects.isNull(partner.getPolicyGroupId()) || partner.getPolicyGroupId().isEmpty()))) { + LOGGER.info("sessionId", "idType", "id", + "Policy Group Id is empty for partner Id -" + partner.getId()); + throw new PartnerServiceException( + io.mosip.pms.partner.constant.ErrorCode.POLICY_GROUP_ID_NOT_EXISTS.getErrorCode(), + io.mosip.pms.partner.constant.ErrorCode.POLICY_GROUP_ID_NOT_EXISTS.getErrorMessage() + ); + } + if (Objects.nonNull(partner.getPolicyGroupId())) { + PolicyGroup policyGroup = policyGroupRepository.findPolicyGroupById(partner.getPolicyGroupId()); + if (Objects.isNull(policyGroup)) { + throw new PartnerServiceException( + io.mosip.pms.partner.constant.ErrorCode.MATCHING_POLICY_GROUP_NOT_EXISTS.getErrorCode(), + io.mosip.pms.partner.constant.ErrorCode.MATCHING_POLICY_GROUP_NOT_EXISTS.getErrorMessage() + ); + } + partnerDetailsV3Dto.setPolicyGroupName(policyGroup.getName()); + partnerDetailsV3Dto.setPolicyGroupDescription(policyGroup.getDesc()); + } + if (Objects.isNull(partner.getCertificateAlias())){ + partnerDetailsV3Dto.setIsCertificateAvailable(false); + } else { + PartnerCertDownloadRequestDto requestDto = new PartnerCertDownloadRequestDto(); + requestDto.setPartnerId(partner.getId()); + + PartnerCertDownloadResponeDto partnerCertDownloadResponeDto = partnerHelper.getCertificate(partner.getCertificateAlias(), + "pmp.partner.certificaticate.get.rest.uri", PartnerCertDownloadResponeDto.class); + X509Certificate cert = MultiPartnerUtil.decodeCertificateData(partnerCertDownloadResponeDto.getCertificateData()); + partnerDetailsV3Dto.setCertificateUploadDateTime(cert.getNotBefore()); + partnerDetailsV3Dto.setCertificateExpiryDateTime(cert.getNotAfter()); + partnerDetailsV3Dto.setIsCertificateAvailable(true); + } + Optional keycloakUserDto = partnerHelper.getUserDetailsByPartnerId(partnerId); + if (keycloakUserDto.isPresent()){ + partnerDetailsV3Dto.setFirstName(keycloakUserDto.get().getFirstName()); + partnerDetailsV3Dto.setLastName(keycloakUserDto.get().getLastName()); + } + responseWrapper.setResponse(partnerDetailsV3Dto); + } catch (ApiAccessibleException ex) { + LOGGER.info("sessionId", "idType", "id", + "In getPartnerDetails method of PartnerManagementServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", + "In getPartnerDetails method of PartnerManagementServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.error("sessionId", "idType", "id", + "Error in getPartnerDetails method of PartnerManagementServiceImpl - " + ex.getMessage()); + String errorCode = ErrorCode.FETCH_PARTNER_DETAILS_ERROR.getErrorCode(); + String errorMessage = ErrorCode.FETCH_PARTNER_DETAILS_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getPartnerDetailsId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + @Override + public ResponseWrapperV2> getAdminPartners(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, PartnerFilterDto partnerFilterDto) { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + try { + PageResponseV2Dto pageResponseV2Dto = new PageResponseV2Dto<>(); + // Pagination + Pageable pageable = PageRequest.of(pageNo, pageSize); + + //Sorting + if (Objects.nonNull(sortFieldName) && Objects.nonNull(sortType)) { + if (sortFieldName.equalsIgnoreCase("certificateUploadStatus") || sortFieldName.equalsIgnoreCase("isActive")) { + sortType = sortType.equalsIgnoreCase(PartnerConstants.ASC) ? PartnerConstants.DESC : PartnerConstants.ASC; + } + Sort sort = partnerHelper.getSortingRequest(getSortColumn(partnerHelper.partnerAliasToColumnMap, sortFieldName), sortType); + pageable = PageRequest.of(pageNo, pageSize, sort); + } + + Page page = partnerSummaryRepository. + getSummaryOfAllPartners(partnerFilterDto.getPartnerId(), partnerFilterDto.getPartnerTypeCode(), + partnerFilterDto.getOrganizationName(), partnerFilterDto.getPolicyGroupName(), + partnerFilterDto.getCertificateUploadStatus(), partnerFilterDto.getEmailAddress(), + partnerFilterDto.getIsActive(), pageable); + if (Objects.nonNull(page) && !page.getContent().isEmpty()) { + List partnerSummaryDtoList = MapperUtils.mapAll(page.getContent(), PartnerSummaryDto.class); + pageResponseV2Dto.setPageNo(pageNo); + pageResponseV2Dto.setPageSize(pageSize); + pageResponseV2Dto.setTotalResults(page.getTotalElements()); + pageResponseV2Dto.setData(partnerSummaryDtoList); + } + responseWrapper.setResponse(pageResponseV2Dto); + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In getAdminPartners method of PartnerManagementServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In getAdminPartners method of PartnerManagementServiceImpl - " + ex.getMessage()); + String errorCode = ErrorCode.FETCH_ALL_PARTNER_DETAILS_ERROR.getErrorCode(); + String errorMessage = ErrorCode.FETCH_ALL_PARTNER_DETAILS_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getAdminPartnersId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + @Override + public ResponseWrapperV2> getAllPartnerPolicyRequests(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, PartnerPolicyRequestFilterDto filterDto) { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + try { + PageResponseV2Dto pageResponseV2Dto = new PageResponseV2Dto<>(); + + boolean isPartnerAdmin = partnerHelper.isPartnerAdmin(authUserDetails().getAuthorities().toString()); + List partnerIdList = null; + if (!isPartnerAdmin) { + String userId = getUserId(); + List partnerList = partnerServiceRepository.findByUserId(userId); + if (partnerList.isEmpty()) { + LOGGER.info("sessionId", "idType", "id", "User id does not exists."); + throw new PartnerServiceException(io.mosip.pms.partner.constant.ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + io.mosip.pms.partner.constant.ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); + } + partnerIdList = new ArrayList<>(); + for (Partner partner : partnerList) { + if (!partnerHelper.skipDeviceOrFtmPartner(partner)) { + partnerHelper.validatePartnerId(partner, userId); + partnerHelper.validatePolicyGroupId(partner, userId); + partnerHelper.validatePolicyGroup(partner); + partnerIdList.add(partner.getId()); + } + } + } + + Pageable pageable = Pageable.unpaged(); + + // Pagination + boolean isPaginationEnabled = (pageNo != null && pageSize != null); + if (isPaginationEnabled) { + pageable = PageRequest.of(pageNo, pageSize); + } + + //Sorting + if (isPaginationEnabled && Objects.nonNull(sortFieldName) && Objects.nonNull(sortType)) { + Sort sort = partnerHelper.getSortingRequest(getSortColumn(partnerHelper.partnerPolicyMappingAliasToColumnMap, sortFieldName), sortType); + pageable = PageRequest.of(pageNo, pageSize, sort); + } + + Page page = partnerPolicyMappingRequestRepository. + getSummaryOfAllPartnerPolicyRequests(filterDto.getPartnerId(), filterDto.getPartnerType(), + filterDto.getOrganizationName(), filterDto.getPolicyId(), filterDto.getPolicyName(), + filterDto.getStatus(), filterDto.getPartnerComment(), + filterDto.getPolicyGroupName(), partnerIdList, isPartnerAdmin, pageable); + if (Objects.nonNull(page) && !page.getContent().isEmpty()) { + List partnerPolicyRequestSummaryDtoList = MapperUtils.mapAll(page.getContent(), PartnerPolicyRequestSummaryDto.class); + pageResponseV2Dto.setPageNo(page.getNumber()); + pageResponseV2Dto.setPageSize(page.getSize()); + pageResponseV2Dto.setTotalResults(page.getTotalElements()); + pageResponseV2Dto.setData(partnerPolicyRequestSummaryDtoList); + } + responseWrapper.setResponse(pageResponseV2Dto); + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In getAllPartnerPolicyRequests method of PartnerManagementServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In getAllPartnerPolicyRequests method of PartnerManagementServiceImpl - " + ex.getMessage()); + String errorCode = ErrorCode.FETCH_ALL_PARTNER_POLICY_MAPPING_REQUEST_ERROR.getErrorCode(); + String errorMessage = ErrorCode.FETCH_ALL_PARTNER_POLICY_MAPPING_REQUEST_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getAllPartnerPolicyMappingRequestsId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + @Override + public ResponseWrapperV2> getAllApiKeyRequests(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, ApiKeyFilterDto filterDto) { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + try { + PageResponseV2Dto pageResponseV2Dto = new PageResponseV2Dto<>(); + boolean isPartnerAdmin = partnerHelper.isPartnerAdmin(authUserDetails().getAuthorities().toString()); + List partnerIdList = null; + if (!isPartnerAdmin) { + String userId = getUserId(); + List partnerList = partnerServiceRepository.findByUserId(userId); + if (partnerList.isEmpty()) { + LOGGER.info("sessionId", "idType", "id", "User id does not exists."); + throw new PartnerServiceException(io.mosip.pms.partner.constant.ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + io.mosip.pms.partner.constant.ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); + } + partnerIdList = new ArrayList<>(); + for (Partner partner : partnerList) { + partnerHelper.validatePartnerId(partner, userId); + partnerHelper.validatePolicyGroupId(partner, userId); + partnerHelper.validatePolicyGroup(partner); + partnerIdList.add(partner.getId()); + } + } + + Pageable pageable = Pageable.unpaged(); + + // Pagination + boolean isPaginationEnabled = (pageNo != null && pageSize != null); + if (isPaginationEnabled) { + pageable = PageRequest.of(pageNo, pageSize); + } + + //Sorting + if (isPaginationEnabled && Objects.nonNull(sortFieldName) && Objects.nonNull(sortType)) { + if (sortFieldName.equalsIgnoreCase("status")) { + sortType = sortType.equalsIgnoreCase(PartnerConstants.ASC) ? PartnerConstants.DESC : PartnerConstants.ASC; + } + Sort sort = partnerHelper.getSortingRequest(getSortColumn(partnerHelper.apiKeyAliasToColumnMap, sortFieldName), sortType); + pageable = PageRequest.of(pageNo, pageSize, sort); + } + + Page page = apiKeyRequestSummaryRepository. + getSummaryOfAllApiKeyRequests(filterDto.getPartnerId(), filterDto.getApiKeyLabel(), + filterDto.getOrgName(), filterDto.getPolicyName(), filterDto.getPolicyGroupName(), + filterDto.getStatus(), partnerIdList, isPartnerAdmin, pageable); + if (Objects.nonNull(page) && !page.getContent().isEmpty()) { + List partnerPolicyRequestSummaryDtoList = MapperUtils.mapAll(page.getContent(), ApiKeyRequestSummaryDto.class); + pageResponseV2Dto.setPageNo(page.getNumber()); + pageResponseV2Dto.setPageSize(page.getSize()); + pageResponseV2Dto.setTotalResults(page.getTotalElements()); + pageResponseV2Dto.setData(partnerPolicyRequestSummaryDtoList); + } + responseWrapper.setResponse(pageResponseV2Dto); + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In getAllApiKeyRequests method of PartnerManagementServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In getAllApiKeyRequests method of PartnerManagementServiceImpl - " + ex.getMessage()); + String errorCode = ErrorCode.FETCH_ALL_API_KEY_REQUESTS_ERROR.getErrorCode(); + String errorMessage = ErrorCode.FETCH_ALL_API_KEY_REQUESTS_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getAllApiKeyRequestsId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + @Override + public ResponseWrapperV2> getTrustCertificates(String sortFieldName, String sortType, Integer pageNo, Integer pageSize, TrustCertificateFilterDto filterDto) { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + try { + PageResponseV2Dto pageResponseV2Dto = new PageResponseV2Dto<>(); + TrustCertTypeListRequestDto trustCertTypeListRequestDto = new TrustCertTypeListRequestDto(); + trustCertTypeListRequestDto.setCaCertificateType(filterDto.getCaCertificateType()); + trustCertTypeListRequestDto.setExcludeMosipCA(true); + trustCertTypeListRequestDto.setPartnerDomain(filterDto.getPartnerDomain()); + trustCertTypeListRequestDto.setCertId(filterDto.getCertificateId()); + trustCertTypeListRequestDto.setIssuedTo(filterDto.getIssuedTo()); + trustCertTypeListRequestDto.setIssuedBy(filterDto.getIssuedBy()); + trustCertTypeListRequestDto.setPageNumber(pageNo + 1); + trustCertTypeListRequestDto.setPageSize(pageSize); + if (Objects.nonNull(sortFieldName) && Objects.nonNull(sortType)) { + trustCertTypeListRequestDto.setSortByFieldName(getSortColumn(partnerHelper.trustCertificateAliasToColumnMap, sortFieldName)); + trustCertTypeListRequestDto.setSortOrder(sortType); + } + RequestWrapper request = new RequestWrapper<>(); + request.setRequest(trustCertTypeListRequestDto); + TrustCertTypeListResponseDto responseObject = null; + Map apiResponse = restUtil.postApi(environment.getProperty("pmp.trust.certificates.post.rest.uri"), null, "", "", + MediaType.APPLICATION_JSON, request, Map.class); + + if (apiResponse.get("response") == null && apiResponse.containsKey(PartnerConstants.ERRORS)) { + List> certServiceErrorList = (List>) apiResponse + .get(PartnerConstants.ERRORS); + if (!certServiceErrorList.isEmpty()) { + LOGGER.error("Error occurred while getting the trust certificates list from keymanager"); + throw new ApiAccessibleException(certServiceErrorList.get(0).get(PartnerConstants.ERRORCODE).toString(), + certServiceErrorList.get(0).get(PartnerConstants.ERRORMESSAGE).toString()); + } else { + LOGGER.error("Error occurred while getting the trust certificates list from keymanager {}", apiResponse); + throw new ApiAccessibleException(ApiAccessibleExceptionConstant.UNABLE_TO_PROCESS.getErrorCode(), + ApiAccessibleExceptionConstant.UNABLE_TO_PROCESS.getErrorMessage()); + } + } + if (apiResponse.get("response") == null) { + throw new ApiAccessibleException(ApiAccessibleExceptionConstant.API_NULL_RESPONSE_EXCEPTION.getErrorCode(), + ApiAccessibleExceptionConstant.API_NULL_RESPONSE_EXCEPTION.getErrorMessage()); + } + responseObject = mapper.readValue(mapper.writeValueAsString(apiResponse.get("response")), TrustCertTypeListResponseDto.class); + pageResponseV2Dto.setPageNo((responseObject.getPageNumber() - 1)); + pageResponseV2Dto.setPageSize(responseObject.getPageSize()); + pageResponseV2Dto.setTotalResults(responseObject.getTotalRecords()); + pageResponseV2Dto.setData(responseObject.getAllPartnerCertificates()); + responseWrapper.setResponse(pageResponseV2Dto); + } catch (ApiAccessibleException ex) { + LOGGER.info("sessionId", "idType", "id", "In getTrustCertificates method of PartnerManagementServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In getTrustCertificates method of PartnerManagementServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In getTrustCertificates method of PartnerManagementServiceImpl - " + ex.getMessage()); + String errorCode = io.mosip.pms.partner.constant.ErrorCode.TRUST_CERTIFICATES_FETCH_ERROR.getErrorCode(); + String errorMessage = io.mosip.pms.partner.constant.ErrorCode.TRUST_CERTIFICATES_FETCH_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getTrustCertificatesId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + public ResponseWrapperV2 downloadTrustCertificates(String certificateId) { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + try { + if (Objects.isNull(certificateId) || certificateId.equals(BLANK_STRING)) { + LOGGER.info("sessionId", "idType", "id", "Certificate Id is null or empty -" + certificateId); + throw new PartnerServiceException(io.mosip.pms.partner.constant.ErrorCode.INVALID_CERTIFICATE_ID.getErrorCode(), + io.mosip.pms.partner.constant.ErrorCode.INVALID_CERTIFICATE_ID.getErrorMessage() + ); + } + TrustCertificateResponseDto responseObject = null; + Map pathsegments = new HashMap<>(); + pathsegments.put("caCertId", certificateId); + Map apiResponse = restUtil.getApi(environment.getProperty("pmp.download.trust.certificates.get.rest.uri"), pathsegments, Map.class); + if (apiResponse.get("response") == null && apiResponse.containsKey(PartnerConstants.ERRORS)) { + List> certServiceErrorList = (List>) apiResponse + .get(PartnerConstants.ERRORS); + if (!certServiceErrorList.isEmpty()) { + LOGGER.error("Error occurred while downloading the trust certificates from keymanager"); + throw new ApiAccessibleException(certServiceErrorList.get(0).get(PartnerConstants.ERRORCODE).toString(), + certServiceErrorList.get(0).get(PartnerConstants.ERRORMESSAGE).toString()); + } else { + LOGGER.error("Error occurred while downloading the trust certificates from keymanager {}", apiResponse); + throw new ApiAccessibleException(ApiAccessibleExceptionConstant.UNABLE_TO_PROCESS.getErrorCode(), + ApiAccessibleExceptionConstant.UNABLE_TO_PROCESS.getErrorMessage()); + } + } + if (apiResponse.get("response") == null) { + throw new ApiAccessibleException(ApiAccessibleExceptionConstant.API_NULL_RESPONSE_EXCEPTION.getErrorCode(), + ApiAccessibleExceptionConstant.API_NULL_RESPONSE_EXCEPTION.getErrorMessage()); + } + responseObject = mapper.readValue(mapper.writeValueAsString(apiResponse.get("response")), TrustCertificateResponseDto.class); + responseWrapper.setResponse(responseObject); + } catch (ApiAccessibleException ex) { + LOGGER.info("sessionId", "idType", "id", "In downloadTrustCertificates method of PartnerManagementServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In downloadTrustCertificates method of PartnerManagementServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In downloadTrustCertificates method of PartnerManagementServiceImpl - " + ex.getMessage()); + String errorCode = io.mosip.pms.partner.constant.ErrorCode.DOWNLOAD_TRUST_CERTIFICATE_ERROR.getErrorCode(); + String errorMessage = io.mosip.pms.partner.constant.ErrorCode.DOWNLOAD_TRUST_CERTIFICATE_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getDownloadTrustCertificateId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + public String getSortColumn(Map aliasToColumnMap, String alias) { + return aliasToColumnMap.getOrDefault(alias, alias); // Return alias if no match found + } + + private AuthUserDetails authUserDetails() { + return (AuthUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + } + + private String getUserId() { + String userId = authUserDetails().getUserId(); + return userId; + } } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/request/dto/SbiAndDeviceMappingRequestDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/request/dto/SbiAndDeviceMappingRequestDto.java new file mode 100644 index 0000000000..6ffd725656 --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/request/dto/SbiAndDeviceMappingRequestDto.java @@ -0,0 +1,16 @@ +package io.mosip.pms.partner.request.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class SbiAndDeviceMappingRequestDto { + @Schema(description = "Unique identifier for the partner", example = "partner123") + private String partnerId; + + @Schema(description = "Unique identifier for the SBI", example = "sbi456") + private String sbiId; + + @Schema(description = "status of the SBI and Device mapping request", example = "approved") + private String status; +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/response/dto/FtmCertificateDownloadResponseDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/response/dto/FtmCertificateDownloadResponseDto.java new file mode 100644 index 0000000000..ba84bcc2ab --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/response/dto/FtmCertificateDownloadResponseDto.java @@ -0,0 +1,42 @@ +package io.mosip.pms.partner.response.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class FtmCertificateDownloadResponseDto { + /** + * CA Signed Partner Certificate Data. + */ + @Schema(description = "Data for the CA (Certificate Authority) signed partner certificate", example = "MIICIjANBgkqhkiG9w0BAQEFA...") // Example value should be a realistic but truncated certificate string + private String caSignedCertificateData; + + @Schema(description = "DateTime when the CA certificate was uploaded", example = "2024-07-15T10:00:00Z") + private LocalDateTime caSignedCertUploadDateTime; + + @Schema(description = "DateTime when the CA certificate will get expired", example = "2024-07-15T10:00:00Z") + private LocalDateTime caSignedCertExpiryDateTime; + + @Schema(description = "Indicates whether the CA signed certificate is expired (true if expired, false otherwise)", example = "false") + private Boolean isCaSignedCertificateExpired; + + /** + * MOSIP Signed Partner Certificate Data. + */ + @Schema(description = "Data for the MOSIP signed partner certificate", example = "MIICIjANBgkqhkiG9w0BAQEFA...") // Example value should be a realistic but truncated certificate string + private String mosipSignedCertificateData; + + @Schema(description = "DateTime when the mosip certificate was uploaded", example = "2024-07-15T10:00:00Z") + private LocalDateTime mosipSignedCertUploadDateTime; + + @Schema(description = "DateTime when the mosip certificate will get expired", example = "2024-07-15T10:00:00Z") + private LocalDateTime mosipSignedCertExpiryDateTime; + + @Schema(description = "Indicates whether the MOSIP signed certificate is expired (true if expired, false otherwise)", example = "true") + private Boolean isMosipSignedCertificateExpired; + /** + * Response timestamp. + */ +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/response/dto/OriginalCertDownloadResponseDto.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/response/dto/OriginalCertDownloadResponseDto.java index 5d46b7e809..bf8b1ad304 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/response/dto/OriginalCertDownloadResponseDto.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/response/dto/OriginalCertDownloadResponseDto.java @@ -1,23 +1,28 @@ package io.mosip.pms.partner.response.dto; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import java.time.LocalDateTime; - @Data public class OriginalCertDownloadResponseDto { + /** * CA Signed Partner Certificate Data. */ + @Schema(description = "Data for the CA (Certificate Authority) signed partner certificate", example = "MIICIjANBgkqhkiG9w0BAQEFA...") // Example value should be a realistic but truncated certificate string private String caSignedCertificateData; + + @Schema(description = "Indicates whether the CA signed certificate is expired (true if expired, false otherwise)", example = "false") private Boolean isCaSignedCertificateExpired; + /** * MOSIP Signed Partner Certificate Data. */ + @Schema(description = "Data for the MOSIP signed partner certificate", example = "MIICIjANBgkqhkiG9w0BAQEFA...") // Example value should be a realistic but truncated certificate string private String mosipSignedCertificateData; + + @Schema(description = "Indicates whether the MOSIP signed certificate is expired (true if expired, false otherwise)", example = "true") private Boolean isMosipSignedCertificateExpired; - /** - * Response timestamp. - */ - private LocalDateTime timestamp; + + } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/service/MultiPartnerService.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/service/MultiPartnerService.java deleted file mode 100644 index 15086e0ef6..0000000000 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/service/MultiPartnerService.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.mosip.pms.partner.service; - -import io.mosip.pms.partner.dto.ApprovedPolicyDto; -import io.mosip.pms.partner.dto.CertificateDto; -import io.mosip.pms.partner.dto.PolicyDto; -import io.mosip.pms.partner.dto.PolicyGroupDto; -import io.mosip.pms.partner.dto.ApiKeyResponseDto; -import io.mosip.pms.partner.dto.UserDetailsDto; - -import java.util.List; - -public interface MultiPartnerService { - - public List getAllCertificateDetails(); - - public List getAllRequestedPolicies(); - - public List getAllApprovedAuthPartnerPolicies(); - - public List getAllApprovedPartnerIdsWithPolicyGroups(); - - public List getAllApiKeysForAuthPartners(); - - public UserDetailsDto saveUserConsentGiven(); - - public UserDetailsDto isUserConsentGiven(); -} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/service/PartnerService.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/service/PartnerService.java index b061d5954a..c5522f24b2 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/service/PartnerService.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/service/PartnerService.java @@ -14,9 +14,9 @@ import io.mosip.pms.common.dto.PolicyRequestSearchResponseDto; import io.mosip.pms.common.dto.SearchDto; import io.mosip.pms.common.entity.PartnerType; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; import io.mosip.pms.device.response.dto.FilterResponseCodeDto; -import io.mosip.pms.partner.dto.CertificateDto; -import io.mosip.pms.partner.dto.PartnerPolicyMappingResponseDto; +import io.mosip.pms.partner.dto.*; import io.mosip.pms.partner.request.dto.AddContactRequestDto; import io.mosip.pms.partner.request.dto.CACertificateRequestDto; import io.mosip.pms.partner.request.dto.ExtractorsDto; @@ -124,7 +124,7 @@ public interface PartnerService { * @throws JsonMappingException * @throws JsonParseException */ - public OriginalCertDownloadResponseDto getOriginalPartnerCertificate(PartnerCertDownloadRequestDto certDownloadRequestDto) throws JsonParseException, JsonMappingException, JsonProcessingException, IOException, CertificateException; + public ResponseWrapperV2 getPartnerCertificateData(PartnerCertDownloadRequestDto certDownloadRequestDto) throws JsonParseException, JsonMappingException, JsonProcessingException, IOException, CertificateException; /** * Function to add biometric extractors @@ -232,4 +232,8 @@ public interface PartnerService { */ public PartnerResponse registerPartner(PartnerRequestDto request); + public ResponseWrapperV2> getPartnerCertificatesDetails(); + + ResponseWrapperV2> getPartnersV3(String status, Boolean policyGroupAvailable, String partnerType); + } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/service/impl/MultiPartnerServiceImpl.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/service/impl/MultiPartnerServiceImpl.java deleted file mode 100644 index 659b1cda43..0000000000 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/service/impl/MultiPartnerServiceImpl.java +++ /dev/null @@ -1,522 +0,0 @@ -package io.mosip.pms.partner.service.impl; - -import io.mosip.kernel.core.authmanager.authadapter.model.AuthUserDetails; -import io.mosip.kernel.core.logger.spi.Logger; -import io.mosip.pms.common.dto.UserDetails; -import io.mosip.pms.common.entity.*; -import io.mosip.pms.common.repository.AuthPolicyRepository; -import io.mosip.pms.common.repository.PartnerPolicyRepository; -import io.mosip.pms.common.repository.PolicyGroupRepository; -import io.mosip.pms.common.repository.PartnerServiceRepository; -import io.mosip.pms.common.repository.UserDetailsRepository; -import io.mosip.pms.common.util.PMSLogger; -import io.mosip.pms.partner.constant.ErrorCode; -import io.mosip.pms.partner.dto.*; -import io.mosip.pms.partner.exception.PartnerServiceException; -import io.mosip.pms.partner.request.dto.PartnerCertDownloadRequestDto; -import io.mosip.pms.partner.response.dto.PartnerCertDownloadResponeDto; -import io.mosip.pms.partner.service.MultiPartnerService; -import io.mosip.pms.partner.util.MultiPartnerUtil; -import io.mosip.pms.partner.util.PartnerUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Service; - -import java.security.cert.X509Certificate; -import java.time.LocalDateTime; -import java.util.*; - -@Service -public class MultiPartnerServiceImpl implements MultiPartnerService { - - private static final Logger LOGGER = PMSLogger.getLogger(MultiPartnerServiceImpl.class); - public static final String BLANK_STRING = ""; - public static final String DEVICE_PROVIDER = "Device_Provider"; - public static final String FTM_PROVIDER = "FTM_Provider"; - public static final String AUTH_PARTNER = "Auth_Partner"; - public static final String APPROVED = "approved"; - public static final String ACTIVE = "ACTIVE"; - public static final String INACTIVE = "INACTIVE"; - private static final String BEGIN_CERTIFICATE = "-----BEGIN CERTIFICATE-----"; - private static final String END_CERTIFICATE = "-----END CERTIFICATE-----"; - public static final String YES = "YES"; - - @Autowired - PartnerServiceRepository partnerRepository; - - @Autowired - PolicyGroupRepository policyGroupRepository; - - @Autowired - AuthPolicyRepository authPolicyRepository; - - @Autowired - PartnerPolicyRepository partnerPolicyRepository; - - @Autowired - PartnerServiceImpl partnerServiceImpl; - - @Autowired - UserDetailsRepository userDetailsRepository; - - @Override - public List getAllCertificateDetails() { - List certificateDtoList = new ArrayList<>(); - try { - String userId = getUserId(); - List partnerList = partnerRepository.findByUserId(userId); - if (!partnerList.isEmpty()) { - for (Partner partner : partnerList) { - CertificateDto certificateDto = new CertificateDto(); - try { - if (Objects.isNull(partner.getId()) || partner.getId().equals(BLANK_STRING)) { - LOGGER.info("Partner Id is null or empty for user id : " + userId); - throw new PartnerServiceException(ErrorCode.PARTNER_ID_NOT_EXISTS.getErrorCode(), - ErrorCode.PARTNER_ID_NOT_EXISTS.getErrorMessage()); - } - PartnerCertDownloadRequestDto requestDto = new PartnerCertDownloadRequestDto(); - requestDto.setPartnerId(partner.getId()); - PartnerCertDownloadResponeDto partnerCertDownloadResponeDto = partnerServiceImpl.getPartnerCertificate(requestDto); - X509Certificate cert = MultiPartnerUtil.decodeCertificateData(partnerCertDownloadResponeDto.getCertificateData()); - - certificateDto.setIsCertificateAvailable(true); - certificateDto.setCertificateName(getCertificateName(cert.getSubjectDN().getName())); - certificateDto.setCertificateUploadDate(cert.getNotBefore()); - certificateDto.setCertificateExpiryDate(cert.getNotAfter()); - certificateDto.setPartnerId(partner.getId()); - certificateDto.setPartnerType(partner.getPartnerTypeCode()); - } catch (PartnerServiceException ex) { - LOGGER.info("Could not fetch partner certificate :" + ex.getMessage()); - certificateDto.setIsCertificateAvailable(false); - certificateDto.setPartnerId(partner.getId()); - certificateDto.setPartnerType(partner.getPartnerTypeCode()); - } - certificateDtoList.add(certificateDto); - } - } else { - LOGGER.info("sessionId", "idType", "id", "User id does not exists."); - throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), - ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); - } - } catch (PartnerServiceException ex) { - LOGGER.info("sessionId", "idType", "id", "In getAllCertificateDetails method of MultiPartnerServiceImpl - " + ex.getMessage()); - throw ex; - } catch (Exception ex) { - LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); - LOGGER.error("sessionId", "idType", "id", - "In getAllCertificateDetails method of MultiPartnerServiceImpl - " + ex.getMessage()); - throw new PartnerServiceException(ErrorCode.PARTNER_CERTIFICATES_FETCH_ERROR.getErrorCode(), - ErrorCode.PARTNER_CERTIFICATES_FETCH_ERROR.getErrorMessage()); - } - return certificateDtoList; - } - - @Override - public List getAllRequestedPolicies() { - List policyDtoList = new ArrayList<>(); - try { - String userId = getUserId(); - List partnerList = partnerRepository.findByUserId(userId); - if (!partnerList.isEmpty()) { - for (Partner partner : partnerList) { - try { - if (!skipDeviceOrFtmPartner(partner)) { - validatePartnerId(partner, userId); - validatePolicyGroupId(partner, userId); - PolicyGroup policyGroup = validatePolicyGroup(partner); - List partnerPolicyRequestList = partner.getPartnerPolicyRequests(); - if (!partnerPolicyRequestList.isEmpty()) { - for (PartnerPolicyRequest partnerPolicyRequest : partnerPolicyRequestList) { - AuthPolicy policyDetails = authPolicyRepository.findByPolicyGroupAndId(partner.getPolicyGroupId(), partnerPolicyRequest.getPolicyId()); - if (Objects.nonNull(policyDetails)) { - PolicyDto policyDto = new PolicyDto(); - policyDto.setPartnerId(partner.getId()); - policyDto.setPartnerType(partner.getPartnerTypeCode()); - - policyDto.setPolicyGroupId(policyGroup.getId()); - policyDto.setPolicyGroupDescription(policyGroup.getDesc()); - policyDto.setPolicyGroupName(policyGroup.getName()); - - policyDto.setPolicyId(policyDetails.getId()); - policyDto.setPolicyDescription(policyDetails.getDescr()); - policyDto.setPolicyName(policyDetails.getName()); - - policyDto.setPartnerComments(partnerPolicyRequest.getRequestDetail()); - policyDto.setUpdDtimes(partnerPolicyRequest.getUpdDtimes()); - policyDto.setCreateDate(partnerPolicyRequest.getCrDtimes()); - policyDto.setStatus(partnerPolicyRequest.getStatusCode()); - policyDtoList.add(policyDto); - } else { - LOGGER.info("No matching policy not found for policy group ID :" + partner.getPolicyGroupId() + "and Policy ID :" + partnerPolicyRequest.getPolicyId()); - throw new PartnerServiceException(ErrorCode.MATCHING_POLICY_NOT_FOUND.getErrorCode(), - ErrorCode.MATCHING_POLICY_NOT_FOUND.getErrorMessage()); - } - } - } - } - } catch (PartnerServiceException ex) { - LOGGER.info("Could not fetch policies :" + ex.getMessage()); - } - } - } else { - LOGGER.info("sessionId", "idType", "id", "User id does not exists."); - throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), - ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); - } - } catch (PartnerServiceException ex) { - LOGGER.info("sessionId", "idType", "id", "In getAllPolicies method of MultiPartnerServiceImpl - " + ex.getMessage()); - throw ex; - } catch (Exception ex) { - LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); - LOGGER.error("sessionId", "idType", "id", - "In getAllPolicies method of MultiPartnerServiceImpl - " + ex.getMessage()); - throw new PartnerServiceException(ErrorCode.PARTNER_POLICY_FETCH_ERROR.getErrorCode(), - ErrorCode.PARTNER_POLICY_FETCH_ERROR.getErrorMessage()); - } - return policyDtoList; - } - - @Override - public List getAllApprovedPartnerIdsWithPolicyGroups() { - List policyGroupDtoList = new ArrayList<>(); - try { - String userId = getUserId(); - List partnerList = partnerRepository.findByUserId(userId); - if (!partnerList.isEmpty()) { - for (Partner partner : partnerList) { - String partnerType = partner.getPartnerTypeCode(); - // Ignore, If the partner is a DEVICE or FTM partnertype - if (!skipDeviceOrFtmPartner(partner) - && partner.getApprovalStatus().equalsIgnoreCase(APPROVED)) { - PolicyGroupDto policyGroupDto = new PolicyGroupDto(); - try { - validatePartnerId(partner, userId); - validatePolicyGroupId(partner, userId); - PolicyGroup policyGroup = validatePolicyGroup(partner); - policyGroupDto.setPartnerId(partner.getId()); - policyGroupDto.setPartnerType(partner.getPartnerTypeCode()); - policyGroupDto.setPolicyGroupId(partner.getPolicyGroupId()); - policyGroupDto.setPolicyGroupName(policyGroup.getName()); - policyGroupDto.setPolicyGroupDescription(policyGroup.getDesc()); - } catch (PartnerServiceException ex) { - LOGGER.info("Could not fetch all approved policy groups :" + ex.getMessage()); - } - policyGroupDtoList.add(policyGroupDto); - } - } - } else { - LOGGER.info("sessionId", "idType", "id", "User id does not exists."); - throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), - ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); - } - } catch (PartnerServiceException ex) { - LOGGER.info("sessionId", "idType", "id", "In getAllApprovedPolicyGroups method of MultiPartnerServiceImpl - " + ex.getMessage()); - throw ex; - } catch (Exception ex) { - LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); - LOGGER.error("sessionId", "idType", "id", - "In getAllApprovedPolicyGroups method of MultiPartnerServiceImpl - " + ex.getMessage()); - throw new PartnerServiceException(ErrorCode.POLICY_GROUP_FETCH_ERROR.getErrorCode(), - ErrorCode.POLICY_GROUP_FETCH_ERROR.getErrorMessage()); - } - return policyGroupDtoList; - } - - @Override - public List getAllApprovedAuthPartnerPolicies() { - List approvedPolicyList = new ArrayList<>(); - try { - String userId = getUserId(); - List partnerList = partnerRepository.findByUserId(userId); - if (!partnerList.isEmpty()) { - for (Partner partner : partnerList) { - try { - if (checkIfPartnerIsApprovedAuthPartner(partner)) { - validatePartnerId(partner, userId); - validatePolicyGroupId(partner, userId); - PolicyGroup policyGroup = validatePolicyGroup(partner); - ApprovedPolicyDto approvedPolicyDto = new ApprovedPolicyDto(); - approvedPolicyDto.setPartnerId(partner.getId()); - approvedPolicyDto.setPartnerType(partner.getPartnerTypeCode()); - approvedPolicyDto.setPolicyGroupId(policyGroup.getId()); - approvedPolicyDto.setPolicyGroupDescription(policyGroup.getDesc()); - approvedPolicyDto.setPolicyGroupName(policyGroup.getName()); - List partnerPolicyRequestList = partner.getPartnerPolicyRequests(); - List activePolicyDtoList = new ArrayList<>(); - if (!partnerPolicyRequestList.isEmpty()) { - for (PartnerPolicyRequest partnerPolicyRequest : partnerPolicyRequestList) { - if (partnerPolicyRequest.getStatusCode().equals(APPROVED)) { - AuthPolicy policyDetails = authPolicyRepository.findActivePoliciesByPolicyGroupId(partner.getPolicyGroupId(), partnerPolicyRequest.getPolicyId()); - if (Objects.nonNull(policyDetails)) { - ActivePolicyDto activePolicyDto = new ActivePolicyDto(); - activePolicyDto.setPolicyId(policyDetails.getId()); - activePolicyDto.setPolicyDescription(policyDetails.getDescr()); - activePolicyDto.setPolicyName(policyDetails.getName()); - activePolicyDto.setStatus(partnerPolicyRequest.getStatusCode()); - activePolicyDtoList.add(activePolicyDto); - } else { - LOGGER.info("No matching policy not found for policy group ID :" + partner.getPolicyGroupId() + "and Policy ID :" + partnerPolicyRequest.getPolicyId()); - throw new PartnerServiceException(ErrorCode.MATCHING_POLICY_NOT_FOUND.getErrorCode(), - ErrorCode.MATCHING_POLICY_NOT_FOUND.getErrorMessage()); - } - } - } - approvedPolicyDto.setActivePolicies(activePolicyDtoList); - approvedPolicyList.add(approvedPolicyDto); - } else { - approvedPolicyDto.setActivePolicies(activePolicyDtoList); - approvedPolicyList.add(approvedPolicyDto); - } - } - } catch (PartnerServiceException ex) { - LOGGER.info("Could not fetch policies :" + ex.getMessage()); - } - } - } else { - LOGGER.info("sessionId", "idType", "id", "User id does not exists."); - throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), - ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); - } - } catch (PartnerServiceException ex) { - LOGGER.info("sessionId", "idType", "id", "In getAllPolicies method of MultiPartnerServiceImpl - " + ex.getMessage()); - throw ex; - } catch (Exception ex) { - LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); - LOGGER.error("sessionId", "idType", "id", - "In getAllPolicies method of MultiPartnerServiceImpl - " + ex.getMessage()); - throw new PartnerServiceException(ErrorCode.PARTNER_POLICY_FETCH_ERROR.getErrorCode(), - ErrorCode.PARTNER_POLICY_FETCH_ERROR.getErrorMessage()); - } - return approvedPolicyList; - } - - public static boolean checkIfPartnerIsApprovedAuthPartner(Partner partner) { - String partnerType = partner.getPartnerTypeCode(); - String approvalStatus = partner.getApprovalStatus(); - if (Objects.isNull(partnerType) || partnerType.equals(BLANK_STRING)) { - LOGGER.info("Partner Type is null or empty for partner id : " + partner.getId()); - throw new PartnerServiceException(ErrorCode.PARTNER_TYPE_NOT_EXISTS.getErrorCode(), - ErrorCode.PARTNER_TYPE_NOT_EXISTS.getErrorMessage()); - } - if ((Objects.isNull(approvalStatus) || approvalStatus.equals(BLANK_STRING))) { - LOGGER.info("Approval status is null or empty for partner id : " + partner.getId()); - throw new PartnerServiceException(ErrorCode.APPROVAL_STATUS_NOT_EXISTS.getErrorCode(), - ErrorCode.APPROVAL_STATUS_NOT_EXISTS.getErrorMessage()); - } - return partnerType.equals(AUTH_PARTNER) && approvalStatus.equals(APPROVED); - } - - public static void validatePartnerId(Partner partner, String userId) { - if (Objects.isNull(partner.getId()) || partner.getId().equals(BLANK_STRING)) { - LOGGER.info("Partner Id is null or empty for user id : " + userId); - throw new PartnerServiceException(ErrorCode.PARTNER_ID_NOT_EXISTS.getErrorCode(), - ErrorCode.PARTNER_ID_NOT_EXISTS.getErrorMessage()); - } - } - - public static void validatePolicyGroupId(Partner partner, String userId) { - if (Objects.isNull(partner.getPolicyGroupId()) || partner.getPolicyGroupId().equals(BLANK_STRING)) { - LOGGER.info("Policy group Id is null or empty for user id : " + userId); - throw new PartnerServiceException(ErrorCode.POLICY_GROUP_ID_NOT_EXISTS.getErrorCode(), - ErrorCode.POLICY_GROUP_ID_NOT_EXISTS.getErrorMessage()); - } - } - - public static boolean skipDeviceOrFtmPartner(Partner partner) { - String partnerType = partner.getPartnerTypeCode(); - if (Objects.isNull(partnerType) || partnerType.equals(BLANK_STRING)) { - LOGGER.info("Partner Type is null or empty for partner id : " + partner.getId()); - throw new PartnerServiceException(ErrorCode.PARTNER_TYPE_NOT_EXISTS.getErrorCode(), - ErrorCode.PARTNER_TYPE_NOT_EXISTS.getErrorMessage()); - } - return partnerType.equals(DEVICE_PROVIDER) || partnerType.equals(FTM_PROVIDER); - } - - private PolicyGroup validatePolicyGroup(Partner partner) throws PartnerServiceException { - PolicyGroup policyGroup = policyGroupRepository.findPolicyGroupById(partner.getPolicyGroupId()); - if (Objects.isNull(policyGroup) || Objects.isNull(policyGroup.getName()) || policyGroup.getName().isEmpty()) { - LOGGER.info("Policy Group is null or empty for partner id : {}", partner.getId()); - throw new PartnerServiceException(ErrorCode.POLICY_GROUP_NOT_EXISTS.getErrorCode(), ErrorCode.POLICY_GROUP_NOT_EXISTS.getErrorMessage()); - } - return policyGroup; - } - - @Override - public List getAllApiKeysForAuthPartners() { - List apiKeyResponseDtoList = new ArrayList<>(); - try { - String userId = getUserId(); - List partnerList = partnerRepository.findByUserId(userId); - if (!partnerList.isEmpty()) { - for (Partner partner : partnerList) { - try { - if (checkIfPartnerIsApprovedAuthPartner(partner)) { - validatePartnerId(partner, userId); - validatePolicyGroupId(partner, userId); - List apiKeyRequestsList = partnerPolicyRepository.findAPIKeysByPartnerId(partner.getId()); - if (!apiKeyRequestsList.isEmpty()) { - for (PartnerPolicy partnerPolicy: apiKeyRequestsList) { - Optional authPolicy = authPolicyRepository.findById(partnerPolicy.getPolicyId()); - if (!authPolicy.isPresent()) { - LOGGER.info("Policy does not exists."); - throw new PartnerServiceException(ErrorCode.POLICY_NOT_EXIST.getErrorCode(), - ErrorCode.POLICY_NOT_EXIST.getErrorMessage()); - } - PolicyGroup policyGroup = authPolicy.get().getPolicyGroup(); - if (Objects.isNull(policyGroup)) { - LOGGER.info("Policy Group is null or empty"); - throw new PartnerServiceException(ErrorCode.POLICY_GROUP_NOT_EXISTS.getErrorCode(), - ErrorCode.POLICY_GROUP_NOT_EXISTS.getErrorMessage()); - } - ApiKeyResponseDto apiKeyResponseDto = new ApiKeyResponseDto(); - apiKeyResponseDto.setApiKeyLabel(partnerPolicy.getLabel()); - if (partnerPolicy.getIsActive()) { - apiKeyResponseDto.setStatus(ACTIVE); - } else { - apiKeyResponseDto.setStatus(INACTIVE); - } - apiKeyResponseDto.setPartnerId(partner.getId()); - apiKeyResponseDto.setPolicyGroupId(policyGroup.getId()); - apiKeyResponseDto.setPolicyGroupName(policyGroup.getName()); - apiKeyResponseDto.setPolicyGroupDescription(policyGroup.getDesc()); - apiKeyResponseDto.setPolicyId(authPolicy.get().getId()); - apiKeyResponseDto.setPolicyName(authPolicy.get().getName()); - apiKeyResponseDto.setPolicyNameDescription(authPolicy.get().getDescr()); - apiKeyResponseDto.setCrDtimes(partnerPolicy.getCrDtimes()); - apiKeyResponseDto.setUpdDtimes(partnerPolicy.getUpdDtimes()); - apiKeyResponseDtoList.add(apiKeyResponseDto); - } - } - } - } catch (PartnerServiceException ex) { - LOGGER.info("Could not fetch api requests :" + ex.getMessage()); - } - } - } else { - LOGGER.info("sessionId", "idType", "id", "User id does not exists."); - throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), - ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); - } - } catch (PartnerServiceException ex) { - LOGGER.info("sessionId", "idType", "id", "In getAllApiKeysForAuthPartners method of MultiPartnerServiceImpl - " + ex.getMessage()); - throw ex; - } catch (Exception ex) { - LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); - LOGGER.error("sessionId", "idType", "id", - "In getAllApiKeysForAuthPartners method of MultiPartnerServiceImpl - " + ex.getMessage()); - throw new PartnerServiceException(ErrorCode.API_KEY_REQUESTS_FETCH_ERROR.getErrorCode(), - ErrorCode.API_KEY_REQUESTS_FETCH_ERROR.getErrorMessage()); - } - return apiKeyResponseDtoList; - } - - private String getUserBy() { - String crBy = authUserDetails().getMail(); - return crBy; - } - - @Override - public UserDetailsDto saveUserConsentGiven() { - UserDetailsDto userDetailsDto = new UserDetailsDto(); - try { - String userId = getUserId(); - List partnerList = partnerRepository.findByUserId(userId); - if (!partnerList.isEmpty()) { - UserDetails userDetails = new UserDetails(); - - LocalDateTime nowDate = LocalDateTime.now(); - userDetails.setConsentGiven(YES); - userDetails.setConsentGivenDtimes(nowDate); - - Optional optionalEntity = userDetailsRepository.findByUserId(userId); - if (optionalEntity.isPresent()) { - UserDetails entity = optionalEntity.get(); - userDetails.setId(entity.getId()); - userDetails.setUpdBy(this.getUserBy()); - userDetails.setUpdDtimes(nowDate); - userDetails.setCrBy(entity.getCrBy()); - userDetails.setCrDtimes(entity.getCrDtimes()); - userDetails.setUserId(entity.getUserId()); - } else { - userDetails.setId(PartnerUtil.generateUUID("id", "", 36)); - userDetails.setCrBy(this.getUserBy()); - userDetails.setCrDtimes(nowDate); - userDetails.setUserId(userId); - } - UserDetails respEntity = userDetailsRepository.save(userDetails); - LOGGER.info("sessionId", "idType", "id", "saving user consent data for user id : ", userId); - - userDetailsDto.setConsentGiven(true); - userDetailsDto.setUserId(respEntity.getUserId()); - userDetailsDto.setConsentGivenDtimes(respEntity.getConsentGivenDtimes()); - - } else { - LOGGER.info("sessionId", "idType", "id", "User id does not exists."); - throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), - ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); - } - } catch (PartnerServiceException ex) { - LOGGER.info("sessionId", "idType", "id", "In saveUserConsentGiven method of MultiPartnerServiceImpl - " + ex.getMessage()); - throw ex; - } catch (Exception e) { - LOGGER.debug("sessionId", "idType", "id", e.getStackTrace()); - LOGGER.error("sessionId", "idType", "id", "In saveUserConsentGiven method of MultiPartnerServiceImpl - " + e.getMessage()); - throw new PartnerServiceException(ErrorCode.PMS_CONSENT_UNABLE_TO_ADD.getErrorCode(), - ErrorCode.PMS_CONSENT_UNABLE_TO_ADD.getErrorMessage()); - } - return userDetailsDto; - } - - @Override - public UserDetailsDto isUserConsentGiven() { - UserDetailsDto userDetailsDto = new UserDetailsDto(); - try { - String userId = getUserId(); - List partnerList = partnerRepository.findByUserId(userId); - if (!partnerList.isEmpty()) { - userDetailsDto.setUserId(userId); - LOGGER.info("sessionId", "idType", "id", "fetching consent status from db for user :", userId); - Optional optionalEntity = userDetailsRepository.findByUserId(userId); - if (optionalEntity.isPresent()) { - UserDetails entity = optionalEntity.get(); - if (entity.getConsentGiven().equals(YES)) { - userDetailsDto.setConsentGiven(true); - userDetailsDto.setConsentGivenDtimes(entity.getConsentGivenDtimes()); - } - } - } else { - LOGGER.info("sessionId", "idType", "id", "User id does not exists."); - throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), - ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); - } - } catch (PartnerServiceException ex) { - LOGGER.info("sessionId", "idType", "id", "In isUserConsentGiven method of MultiPartnerServiceImpl - " + ex.getMessage()); - throw ex; - } catch (Exception e) { - LOGGER.debug("sessionId", "idType", "id", e.getStackTrace()); - LOGGER.error("sessionId", "idType", "id", "In isUserConsentGiven method of MultiPartnerServiceImpl - " + e.getMessage()); - throw new PartnerServiceException(ErrorCode.PMS_CONSENT_ERR.getErrorCode(), - ErrorCode.PMS_CONSENT_ERR.getErrorMessage()); - } - return userDetailsDto; - } - - private AuthUserDetails authUserDetails() { - return (AuthUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - } - - private String getUserId() { - String userId = authUserDetails().getUserId(); - return userId; - } - - public static String getCertificateName(String subjectDN) { - String[] parts = subjectDN.split(","); - for (String part : parts) { - if (part.trim().startsWith("CN=")) { - return part.trim().substring(3); - } - } - return BLANK_STRING; - } -} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/service/impl/PartnerServiceImpl.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/service/impl/PartnerServiceImpl.java index 1e9d8354fd..7f0c841833 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/service/impl/PartnerServiceImpl.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/service/impl/PartnerServiceImpl.java @@ -7,10 +7,7 @@ import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.sql.Timestamp; -import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Base64; @@ -24,9 +21,10 @@ import java.util.stream.Collectors; import io.mosip.kernel.core.authmanager.authadapter.model.AuthUserDetails; -import io.mosip.pms.common.response.dto.ResponseWrapper; -import io.mosip.pms.partner.dto.CertificateDto; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.partner.dto.*; import io.mosip.pms.partner.util.MultiPartnerUtil; +import io.mosip.pms.partner.util.PartnerHelper; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; @@ -102,11 +100,7 @@ import io.mosip.pms.partner.constant.ErrorCode; import io.mosip.pms.partner.constant.PartnerConstants; import io.mosip.pms.partner.constant.PartnerServiceAuditEnum; -import io.mosip.pms.partner.dto.DataShareResponseDto; -import io.mosip.pms.partner.dto.PartnerPolicyMappingResponseDto; -import io.mosip.pms.partner.dto.UploadCertificateRequestDto; import io.mosip.pms.partner.exception.PartnerServiceException; -import io.mosip.pms.partner.manager.exception.PartnerManagerServiceException; import io.mosip.pms.partner.request.dto.AddContactRequestDto; import io.mosip.pms.partner.request.dto.CACertificateRequestDto; import io.mosip.pms.partner.request.dto.ExtractorDto; @@ -150,6 +144,18 @@ public class PartnerServiceImpl implements PartnerService { public static final String BLANK_STRING=""; + public static final String VERSION = "1.0"; + + private static final String FTM = "FTM"; + + private static final String APPROVED = "approved"; + + public static final String ACTIVE = "ACTIVE"; + + public static final String INACTIVE = "INACTIVE"; + + public static final String AUTH_PARTNER = "Auth_Partner"; + @Autowired PartnerServiceRepository partnerRepository; @@ -207,6 +213,9 @@ public class PartnerServiceImpl implements PartnerService { @Autowired private NotificatonService notificationService; + @Autowired + PartnerHelper partnerHelper; + @Value("${pmp.partner.partnerId.max.length}") private int partnerIdMaxLength; @@ -237,6 +246,18 @@ public class PartnerServiceImpl implements PartnerService { @Value("${mosip.optional-languages}") private String optionalLanguges; + @Value("${mosip.pms.api.id.original.partner.certificate.get}") + private String getOriginalPartnerCertificateId; + + @Value("${mosip.pms.api.id.partner.certificates.get}") + private String getPartnerCertificatesId; + + @Value("${mosip.pms.api.id.auth.partner.api.keys.get}") + private String getAuthPartnerApiKeysId; + + @Value("${mosip.pms.api.id.partners.v3.get}") + private String getPartnersV3Id; + @Autowired AuditUtil auditUtil; @@ -244,7 +265,7 @@ public class PartnerServiceImpl implements PartnerService { private int maxMobileNumberLength; private String emptySpacesRegex = ".*\\s.*"; - + @Override public PartnerResponse registerPartner(PartnerRequestDto request) { // Registered partner cannot create another partner @@ -741,7 +762,9 @@ public PartnerCertificateResponseDto uploadPartnerCertificate( throw new PartnerServiceException(ErrorCode.P7B_CERTDATA_ERROR.getErrorCode(), ErrorCode.P7B_CERTDATA_ERROR.getErrorMessage()); } - uploadOtherDomainCertificate(signedPartnerCert, partnerCertRequesteDto.getPartnerId()); + if (!partnerCertRequesteDto.getPartnerDomain().equals(FTM)){ + uploadOtherDomainCertificate(signedPartnerCert, partnerCertRequesteDto.getPartnerId()); + } Partner updateObject = partner; updateObject.setUpdBy(getLoggedInUserId()); updateObject.setUpdDtimes(Timestamp.valueOf(LocalDateTime.now())); @@ -804,98 +827,110 @@ private void uploadOtherDomainCertificate(String signedCertificateData, String p ApiAccessibleExceptionConstant.API_NULL_RESPONSE_EXCEPTION.getErrorMessage()); } } + @Override - public PartnerCertDownloadResponeDto getPartnerCertificate(PartnerCertDownloadRequestDto certDownloadRequestDto) - throws JsonParseException, JsonMappingException, JsonProcessingException, IOException { - return getCertificateFromKeyMgr(certDownloadRequestDto, "pmp.partner.certificaticate.get.rest.uri", PartnerCertDownloadResponeDto.class); + public PartnerCertDownloadResponeDto getPartnerCertificate(PartnerCertDownloadRequestDto certDownloadRequestDto) throws JsonProcessingException { + validateUser(certDownloadRequestDto); + // Fetch partner from DB + Optional partnerFromDb = getPartner(certDownloadRequestDto); + Partner partner = partnerFromDb.get(); + validateCertificateAlias(certDownloadRequestDto, partner); + + // Retrieve the certificate + return partnerHelper.getCertificate(partner.getCertificateAlias(), + "pmp.partner.certificaticate.get.rest.uri", PartnerCertDownloadResponeDto.class); + } + + private Optional getPartner(PartnerCertDownloadRequestDto certDownloadRequestDto) { + Optional partnerFromDb = partnerRepository.findById(certDownloadRequestDto.getPartnerId()); + if (partnerFromDb.isEmpty()) { + LOGGER.error("Partner not found with id {}", certDownloadRequestDto.getPartnerId()); + throw new PartnerServiceException(ErrorCode.PARTNER_DOES_NOT_EXIST_EXCEPTION.getErrorCode(), + ErrorCode.PARTNER_DOES_NOT_EXIST_EXCEPTION.getErrorMessage()); + } + return partnerFromDb; } @Override - public OriginalCertDownloadResponseDto getOriginalPartnerCertificate(PartnerCertDownloadRequestDto certDownloadRequestDto) - throws JsonParseException, JsonMappingException, JsonProcessingException, IOException { - OriginalCertDownloadResponseDto responseDto = getCertificateFromKeyMgr(certDownloadRequestDto, "pmp.partner.original.certificate.get.rest.uri", OriginalCertDownloadResponseDto.class); - responseDto.setIsMosipSignedCertificateExpired(false); - responseDto.setIsCaSignedCertificateExpired(false); - LocalDateTime currentDateTime = LocalDateTime.now(ZoneId.of("UTC")); - // Check mosip signed certificate expiry date - X509Certificate decodedMosipSignedCert = MultiPartnerUtil.decodeCertificateData(responseDto.getMosipSignedCertificateData()); - LocalDateTime mosipSignedCertExpiryDate = decodedMosipSignedCert.getNotAfter().toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime(); - if (mosipSignedCertExpiryDate.isBefore(currentDateTime)) { - responseDto.setMosipSignedCertificateData(""); - responseDto.setIsMosipSignedCertificateExpired(true); - } - // Check ca signed partner certificate expiry date - X509Certificate decodedCaSignedCert = MultiPartnerUtil.decodeCertificateData(responseDto.getCaSignedCertificateData()); - LocalDateTime caSignedCertExpiryDate = decodedCaSignedCert.getNotAfter().toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime(); - if (caSignedCertExpiryDate.isBefore(currentDateTime)) { - responseDto.setCaSignedCertificateData(""); - responseDto.setIsCaSignedCertificateExpired(true); - } - return responseDto; + public ResponseWrapperV2 getPartnerCertificateData(PartnerCertDownloadRequestDto certDownloadRequestDto) { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + try { + validateUser(certDownloadRequestDto); + + // Fetch partner from DB + Optional partnerFromDb = getPartner(certDownloadRequestDto); + Partner partner = partnerFromDb.get(); + validateCertificateAlias(certDownloadRequestDto, partner); + + // Check if the partner is deactivated + if (partner.getApprovalStatus().equals(APPROVED) && !partner.getIsActive()) { + throw new PartnerServiceException(ErrorCode.DEACTIVATED_PARTNER_CERTIFICATE_DOWNLOAD_ERROR.getErrorCode(), + ErrorCode.DEACTIVATED_PARTNER_CERTIFICATE_DOWNLOAD_ERROR.getErrorMessage()); + } + + // Retrieve the certificate + OriginalCertDownloadResponseDto responseDto = partnerHelper.getCertificate(partner.getCertificateAlias(), + "pmp.partner.original.certificate.get.rest.uri", OriginalCertDownloadResponseDto.class); + + // Populate certificate expiry state + partnerHelper.populateCertificateExpiryState(responseDto); + responseWrapper.setResponse(responseDto); + } catch (ApiAccessibleException ex) { + LOGGER.info("sessionId", "idType", "id", "In getOriginalPartnerCertificate method - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In getOriginalPartnerCertificate method - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.error("sessionId", "idType", "id", "In getOriginalPartnerCertificate method - " + ex.getMessage(), ex); + String errorCode = ErrorCode.CERTIFICATE_FETCH_ERROR.getErrorCode(); + String errorMessage = ErrorCode.CERTIFICATE_FETCH_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getOriginalPartnerCertificateId); + responseWrapper.setVersion(VERSION); + return responseWrapper; } - protected T getCertificateFromKeyMgr(PartnerCertDownloadRequestDto certDownloadRequestDto, - String uriProperty, Class responseType) - throws JsonParseException, JsonMappingException, JsonProcessingException, IOException { + private void validateCertificateAlias(PartnerCertDownloadRequestDto certDownloadRequestDto, Partner partner) { + // Check if certificate alias exists + if (partner.getCertificateAlias() == null || partner.getCertificateAlias().isEmpty()) { + LOGGER.error("Certificate not uploaded for partner {}", certDownloadRequestDto.getPartnerId()); + throw new PartnerServiceException(ErrorCode.CERTIFICATE_NOT_UPLOADED_EXCEPTION.getErrorCode(), + ErrorCode.CERTIFICATE_NOT_UPLOADED_EXCEPTION.getErrorMessage()); + } + } + + private void validateUser(PartnerCertDownloadRequestDto certDownloadRequestDto) { String userId = getUserId(); + + // Check if user ID exists in pms List partnerList = partnerRepository.findByUserId(userId); if (partnerList.isEmpty()) { - LOGGER.error("sessionId", "idType", "id", "User id does not exists."); + LOGGER.error("sessionId", "idType", "id", "User id does not exist."); throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); } - boolean isPartnerBelongsToTheUser = false; - for (Partner partner: partnerList) { - if (partner.getId().equals(certDownloadRequestDto.getPartnerId())) { - isPartnerBelongsToTheUser = true; - } - } - T responseObject = null; - if (isPartnerBelongsToTheUser) { - Optional partnerFromDb = partnerRepository.findById(certDownloadRequestDto.getPartnerId()); - if (partnerFromDb.isEmpty()) { - LOGGER.error("Partner not exists with id {}", certDownloadRequestDto.getPartnerId()); - throw new PartnerServiceException(ErrorCode.PARTNER_DOES_NOT_EXIST_EXCEPTION.getErrorCode(), - ErrorCode.PARTNER_DOES_NOT_EXIST_EXCEPTION.getErrorMessage()); - } - if (partnerFromDb.get().getCertificateAlias() == null || partnerFromDb.get().getCertificateAlias().isEmpty()) { - LOGGER.error("Cert is not uploaded for given partner {}", certDownloadRequestDto.getPartnerId()); - throw new PartnerServiceException(ErrorCode.CERTIFICATE_NOT_UPLOADED_EXCEPTION.getErrorCode(), - ErrorCode.CERTIFICATE_NOT_UPLOADED_EXCEPTION.getErrorMessage()); - } - Map pathsegments = new HashMap<>(); - pathsegments.put("partnerCertId", partnerFromDb.get().getCertificateAlias()); - Map getApiResponse = restUtil - .getApi(environment.getProperty(uriProperty), pathsegments, Map.class); - responseObject = mapper.readValue(mapper.writeValueAsString(getApiResponse.get("response")), responseType); - - if (responseObject == null && getApiResponse.containsKey(PartnerConstants.ERRORS)) { - List> certServiceErrorList = (List>) getApiResponse - .get(PartnerConstants.ERRORS); - if (!certServiceErrorList.isEmpty()) { - LOGGER.error("Error occurred while getting the cert from keymanager"); - throw new ApiAccessibleException(certServiceErrorList.get(0).get(PartnerConstants.ERRORCODE).toString(), - certServiceErrorList.get(0).get(PartnerConstants.ERRORMESSAGE).toString()); - } else { - LOGGER.error("Error occurred while getting the cert {}", getApiResponse); - throw new ApiAccessibleException(ApiAccessibleExceptionConstant.UNABLE_TO_PROCESS.getErrorCode(), - ApiAccessibleExceptionConstant.UNABLE_TO_PROCESS.getErrorMessage()); + // Check if the user is an admin + boolean isAdmin = partnerHelper.isPartnerAdmin(authUserDetails().getAuthorities().toString()); + + // If not admin, check if the partner belongs to the user + if (!isAdmin) { + boolean isPartnerBelongsToUser = false; + for (Partner partner : partnerList) { + if (partner.getId().equals(certDownloadRequestDto.getPartnerId())) { + isPartnerBelongsToUser = true; + break; } } - if (responseObject == null) { - LOGGER.error("Got null response from {}", environment.getProperty(uriProperty)); - throw new ApiAccessibleException(ApiAccessibleExceptionConstant.API_NULL_RESPONSE_EXCEPTION.getErrorCode(), - ApiAccessibleExceptionConstant.API_NULL_RESPONSE_EXCEPTION.getErrorMessage()); + if (!isPartnerBelongsToUser) { + LOGGER.error("sessionId", "idType", "id", "The given partner ID does not belong to the user."); + throw new PartnerServiceException(ErrorCode.PARTNER_DOES_NOT_BELONG_TO_THE_USER.getErrorCode(), + ErrorCode.PARTNER_DOES_NOT_BELONG_TO_THE_USER.getErrorMessage()); } - } else { - LOGGER.error("sessionId", "idType", "id", "The given partner ID does not belong to the user."); - throw new PartnerServiceException(ErrorCode.PARTNER_DOES_NOT_BELONG_TO_THE_USER.getErrorCode(), - ErrorCode.PARTNER_DOES_NOT_BELONG_TO_THE_USER.getErrorMessage()); } - - return responseObject; } @Override @@ -1616,7 +1651,115 @@ public PartnerPolicyMappingResponseDto requestForPolicyMapping(PartnerPolicyMapp response.setMessage("Policy mapping request submitted successfully."); return response; } - + + @Override + public ResponseWrapperV2> getPartnerCertificatesDetails() { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + try { + String userId = getUserId(); + List partnerList = partnerRepository.findByUserId(userId); + if (!partnerList.isEmpty()) { + List certificateDtoList = new ArrayList<>(); + for (Partner partner : partnerList) { + CertificateDto certificateDto = new CertificateDto(); + try { + if (Objects.isNull(partner.getId()) || partner.getId().equals(BLANK_STRING)) { + LOGGER.info("Partner Id is null or empty for user id : " + userId); + throw new PartnerServiceException(ErrorCode.PARTNER_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.PARTNER_ID_NOT_EXISTS.getErrorMessage()); + } + PartnerCertDownloadRequestDto requestDto = new PartnerCertDownloadRequestDto(); + requestDto.setPartnerId(partner.getId()); + PartnerCertDownloadResponeDto partnerCertDownloadResponeDto = getPartnerCertificate(requestDto); + X509Certificate cert = MultiPartnerUtil.decodeCertificateData(partnerCertDownloadResponeDto.getCertificateData()); + + certificateDto.setIsCertificateAvailable(true); + certificateDto.setCertificateIssuedTo(PartnerUtil.getCertificateName(cert.getSubjectDN().getName())); + certificateDto.setCertificateUploadDateTime(cert.getNotBefore()); + certificateDto.setCertificateExpiryDateTime(cert.getNotAfter()); + certificateDto.setPartnerId(partner.getId()); + certificateDto.setPartnerType(partner.getPartnerTypeCode()); + } catch (PartnerServiceException ex) { + LOGGER.info("Could not fetch partner certificate :" + ex.getMessage()); + certificateDto.setIsCertificateAvailable(false); + certificateDto.setPartnerId(partner.getId()); + certificateDto.setPartnerType(partner.getPartnerTypeCode()); + } + if (partner.getApprovalStatus().equals(APPROVED) && !partner.getIsActive()) { + certificateDto.setIsPartnerActive(false); + } else { + certificateDto.setIsPartnerActive(true); + } + certificateDtoList.add(certificateDto); + } + responseWrapper.setResponse(certificateDtoList); + } else { + LOGGER.info("sessionId", "idType", "id", "User id does not exists."); + throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); + } + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In getPartnerCertificatesDetails method of PartnerServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (ApiAccessibleException ex) { + LOGGER.info("sessionId", "idType", "id", "In getPartnerCertificates method of PartnerServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In getPartnerCertificatesDetails method of PartnerServiceImpl - " + ex.getMessage()); + String errorCode = ErrorCode.PARTNER_CERTIFICATES_FETCH_ERROR.getErrorCode(); + String errorMessage = ErrorCode.PARTNER_CERTIFICATES_FETCH_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getPartnerCertificatesId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + @Override + public ResponseWrapperV2> getPartnersV3(String status, Boolean policyGroupAvailable, String partnerType) { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + try { + String userId = getUserId(); + List partnerList = partnerRepository.findByUserId(userId); + if (partnerList.isEmpty()) { + LOGGER.info("sessionId", "idType", "id", "User id does not exists."); + throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); + } + List partnerDtoV3List = new ArrayList<>(); + List partners = partnerRepository.findPartnersByUserIdAndStatusAndPartnerTypeAndPolicyGroupAvailable(status, userId, partnerType, policyGroupAvailable); + for (Partner partner : partners) { + PartnerDtoV3 partnerDtoV3 = new PartnerDtoV3(); + partnerHelper.validatePartnerId(partner, userId); + partnerDtoV3.setPartnerId(partner.getId()); + partnerDtoV3.setPartnerType(partner.getPartnerTypeCode()); + if (Boolean.TRUE.equals(policyGroupAvailable)) { + PolicyGroup policyGroup = partnerHelper.validatePolicyGroup(partner); + partnerDtoV3.setPolicyGroupId(partner.getPolicyGroupId()); + partnerDtoV3.setPolicyGroupName(policyGroup.getName()); + partnerDtoV3.setPolicyGroupDescription(policyGroup.getDesc()); + } + partnerDtoV3List.add(partnerDtoV3); + } + responseWrapper.setResponse(partnerDtoV3List); + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In getPartnersV3 method of PartnerServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + LOGGER.debug("sessionId", "idType", "id", ex.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", + "In getPartnersV3 method of PartnerServiceImpl - " + ex.getMessage()); + String errorCode = ErrorCode.PARTNERS_FETCH_ERROR.getErrorCode(); + String errorMessage = ErrorCode.PARTNERS_FETCH_ERROR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getPartnersV3Id); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + /** * validates the loggedInUser authorization * @param loggedInUserId @@ -1694,14 +1837,4 @@ private String getUserId() { String userId = authUserDetails().getUserId(); return userId; } - - public static String getCertificateName(String subjectDN) { - String[] parts = subjectDN.split(","); - for (String part : parts) { - if (part.trim().startsWith("CN=")) { - return part.trim().substring(3); - } - } - return BLANK_STRING; - } } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/util/MultiPartnerUtil.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/util/MultiPartnerUtil.java index 0bd6bfb2c4..c7f4def7fb 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/util/MultiPartnerUtil.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/util/MultiPartnerUtil.java @@ -1,15 +1,17 @@ package io.mosip.pms.partner.util; import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.pms.common.request.dto.ErrorResponse; import io.mosip.pms.common.util.PMSLogger; import io.mosip.pms.partner.constant.ErrorCode; import io.mosip.pms.partner.exception.PartnerServiceException; import java.io.ByteArrayInputStream; -import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; +import java.util.ArrayList; import java.util.Base64; +import java.util.List; public class MultiPartnerUtil { private static final Logger LOGGER = PMSLogger.getLogger(MultiPartnerUtil.class); @@ -33,4 +35,13 @@ public static X509Certificate decodeCertificateData(String certificateData) { } return cert; } -} + + public static List setErrorResponse(String errorCode, String errorMessage) { + List errorResponseList = new ArrayList<>(); + ErrorResponse errorResponse = new ErrorResponse(); + errorResponse.setErrorCode(errorCode); + errorResponse.setMessage(errorMessage); + errorResponseList.add(errorResponse); + return errorResponseList; + } +} \ No newline at end of file diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/util/PartnerHelper.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/util/PartnerHelper.java new file mode 100644 index 0000000000..baea6fdf2b --- /dev/null +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/util/PartnerHelper.java @@ -0,0 +1,483 @@ +package io.mosip.pms.partner.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.pms.common.constant.ApiAccessibleExceptionConstant; +import io.mosip.pms.common.entity.Partner; +import io.mosip.pms.common.entity.PolicyGroup; +import io.mosip.pms.common.exception.ApiAccessibleException; +import io.mosip.pms.common.repository.DeviceDetailSbiRepository; +import io.mosip.pms.common.repository.PolicyGroupRepository; +import io.mosip.pms.common.util.PMSLogger; +import io.mosip.pms.common.util.RestUtil; +import io.mosip.pms.device.authdevice.entity.DeviceDetail; +import io.mosip.pms.device.authdevice.entity.SecureBiometricInterface; +import io.mosip.pms.device.authdevice.repository.DeviceDetailRepository; +import io.mosip.pms.device.authdevice.repository.SecureBiometricInterfaceRepository; +import io.mosip.pms.partner.constant.ErrorCode; +import io.mosip.pms.partner.constant.PartnerConstants; +import io.mosip.pms.partner.dto.KeycloakUserDto; +import io.mosip.pms.partner.exception.PartnerServiceException; +import io.mosip.pms.partner.response.dto.FtmCertificateDownloadResponseDto; +import io.mosip.pms.partner.response.dto.OriginalCertDownloadResponseDto; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.data.domain.Sort; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.util.UriComponentsBuilder; + +import java.security.cert.X509Certificate; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Objects; + +@Component +public class PartnerHelper { + + private static final Logger LOGGER = PMSLogger.getLogger(PartnerHelper.class); + public static final String APPROVED = "approved"; + public static final String PENDING_APPROVAL = "pending_approval"; + public static final String REJECTED = "rejected"; + public static final String DEVICE_PROVIDER = "Device_Provider"; + public static final String FTM_PROVIDER = "FTM_Provider"; + public static final String AUTH_PARTNER = "Auth_Partner"; + public static final String BLANK_STRING = ""; + + public final Map partnerAliasToColumnMap = new HashMap<>(); + { + partnerAliasToColumnMap.put("partnerId", "id"); + partnerAliasToColumnMap.put("partnerType", "partnerTypeCode"); + partnerAliasToColumnMap.put("orgName", "name"); + partnerAliasToColumnMap.put("policyGroupId", "policyGroupId"); + partnerAliasToColumnMap.put("policyGroupName", "pg.name"); + partnerAliasToColumnMap.put("emailAddress", "emailId"); + partnerAliasToColumnMap.put("certificateUploadStatus", "certificateAlias"); + partnerAliasToColumnMap.put("status", "approvalStatus"); + partnerAliasToColumnMap.put("isActive", "isActive"); + partnerAliasToColumnMap.put("createdDateTime", "crDtimes"); + } + + public final Map partnerPolicyMappingAliasToColumnMap = new HashMap<>(); + { + partnerPolicyMappingAliasToColumnMap.put("partnerId", "partnerId"); + partnerPolicyMappingAliasToColumnMap.put("partnerType", "p.partnerTypeCode"); + partnerPolicyMappingAliasToColumnMap.put("orgName", "p.name"); + partnerPolicyMappingAliasToColumnMap.put("policyId", "policyId"); + partnerPolicyMappingAliasToColumnMap.put("policyGroupName", "p.policyGroup.name"); + partnerPolicyMappingAliasToColumnMap.put("policyName", "ap.name"); + partnerPolicyMappingAliasToColumnMap.put("status", "statusCode"); + partnerPolicyMappingAliasToColumnMap.put("requestDetail", "requestDetail"); + partnerPolicyMappingAliasToColumnMap.put("createdDateTime", "createdDateTime"); + } + + public final Map oidcClientsAliasToColumnMap = new HashMap<>(); + { + oidcClientsAliasToColumnMap.put("partnerId", "rpId"); + oidcClientsAliasToColumnMap.put("orgName", "p.name"); + oidcClientsAliasToColumnMap.put("policyGroupName", "pg.name"); + oidcClientsAliasToColumnMap.put("policyName", "ap.name"); + oidcClientsAliasToColumnMap.put("clientId", "id"); + oidcClientsAliasToColumnMap.put("clientName", "name"); + oidcClientsAliasToColumnMap.put("status", "status"); + oidcClientsAliasToColumnMap.put("createdDateTime", "createdDateTime"); + } + + public final Map apiKeyAliasToColumnMap = new HashMap<>(); + { + apiKeyAliasToColumnMap.put("partnerId", "partnerId"); + apiKeyAliasToColumnMap.put("apiKeyLabel", "label"); + apiKeyAliasToColumnMap.put("orgName", "p.name"); + apiKeyAliasToColumnMap.put("policyName", "ap.name"); + apiKeyAliasToColumnMap.put("policyGroupName", "pg.name"); + apiKeyAliasToColumnMap.put("status", "isActive"); + apiKeyAliasToColumnMap.put("createdDateTime", "createdDateTime"); + } + + public final Map ftmAliasToColumnMap = new HashMap<>(); + { + ftmAliasToColumnMap.put("partnerId", "ftpProviderId"); + ftmAliasToColumnMap.put("orgName", "partnerOrganizationName"); + ftmAliasToColumnMap.put("make", "make"); + ftmAliasToColumnMap.put("model", "model"); + ftmAliasToColumnMap.put("status", "approvalStatus"); + ftmAliasToColumnMap.put("createdDateTime", "crDtimes"); + } + + public final Map sbiAliasToColumnMap = new HashMap<>(); + { + sbiAliasToColumnMap.put("partnerId", "providerId"); + sbiAliasToColumnMap.put("orgName", "partnerOrgName"); + sbiAliasToColumnMap.put("partnerType", "p.partnerTypeCode"); + sbiAliasToColumnMap.put("sbiId", "id"); + sbiAliasToColumnMap.put("sbiVersion", "swVersion"); + sbiAliasToColumnMap.put("sbiCreatedDateTime", "swCreateDateTime"); + sbiAliasToColumnMap.put("sbiExpiryDateTime", "swExpiryDateTime"); + sbiAliasToColumnMap.put("status", "approvalStatus"); + sbiAliasToColumnMap.put("createdDateTime", "crDtimes"); + sbiAliasToColumnMap.put("sbiExpiryStatus", "sbiExpiryStatus"); + sbiAliasToColumnMap.put("countOfAssociatedDevices", "countOfAssociatedDevices"); + } + + public final Map deviceAliasToColumnMap = new HashMap<>(); + { + deviceAliasToColumnMap.put("deviceId", "id"); + deviceAliasToColumnMap.put("sbiId", "s.id"); + deviceAliasToColumnMap.put("sbiVersion", "s.swVersion"); + deviceAliasToColumnMap.put("partnerId", "deviceProviderId"); + deviceAliasToColumnMap.put("orgName", "partnerOrganizationName"); + deviceAliasToColumnMap.put("deviceType", "deviceTypeCode"); + deviceAliasToColumnMap.put("deviceSubType", "deviceSubTypeCode"); + deviceAliasToColumnMap.put("make", "make"); + deviceAliasToColumnMap.put("model", "model"); + deviceAliasToColumnMap.put("status", "approvalStatus"); + deviceAliasToColumnMap.put("createdDateTime", "crDtimes"); + } + + public final Map trustCertificateAliasToColumnMap = new HashMap<>(); + { + trustCertificateAliasToColumnMap.put("caCertificateType", "caCertificateType"); + trustCertificateAliasToColumnMap.put("certificateId", "certId"); + trustCertificateAliasToColumnMap.put("partnerDomain", "partnerDomain"); + trustCertificateAliasToColumnMap.put("issuedTo", "certSubject"); + trustCertificateAliasToColumnMap.put("issuedBy", "certIssuer"); + trustCertificateAliasToColumnMap.put("validFrom", "certNotBefore"); + trustCertificateAliasToColumnMap.put("validTill", "certNotAfter"); + trustCertificateAliasToColumnMap.put("uploadedDateTime", "createdtimes"); + } + + @Autowired + SecureBiometricInterfaceRepository secureBiometricInterfaceRepository; + + @Autowired + DeviceDetailSbiRepository deviceDetailSbiRepository; + + @Autowired + DeviceDetailRepository deviceDetailRepository; + + @Autowired + PolicyGroupRepository policyGroupRepository; + + @Autowired + RestUtil restUtil; + + @Autowired + private ObjectMapper mapper; + + @Autowired + private Environment environment; + + public void validateSbiDeviceMapping(String partnerId, String sbiId, String deviceDetailId) { + Optional secureBiometricInterface = secureBiometricInterfaceRepository.findById(sbiId); + if (secureBiometricInterface.isEmpty()) { + LOGGER.info("sessionId", "idType", "id", "Sbi does not exists."); + throw new PartnerServiceException(ErrorCode.SBI_NOT_EXISTS.getErrorCode(), + ErrorCode.SBI_NOT_EXISTS.getErrorMessage()); + } else if (!secureBiometricInterface.get().getProviderId().equals(partnerId)) { + LOGGER.info("sessionId", "idType", "id", "Sbi is not associated with partner Id."); + throw new PartnerServiceException(ErrorCode.SBI_NOT_ASSOCIATED_WITH_PARTNER_ID.getErrorCode(), + ErrorCode.SBI_NOT_ASSOCIATED_WITH_PARTNER_ID.getErrorMessage()); + } else if (secureBiometricInterface.get().getApprovalStatus().equals(PENDING_APPROVAL)) { + LOGGER.info("sessionId", "idType", "id", "Sbi is not approved."); + throw new PartnerServiceException(ErrorCode.PENDING_APPROVAL_SBI.getErrorCode(), + ErrorCode.PENDING_APPROVAL_SBI.getErrorMessage()); + } else if (secureBiometricInterface.get().getApprovalStatus().equals(REJECTED)) { + LOGGER.info("sessionId", "idType", "id", "Sbi is already rejected."); + throw new PartnerServiceException(ErrorCode.REJECTED_SBI.getErrorCode(), + ErrorCode.REJECTED_SBI.getErrorMessage()); + } else if (secureBiometricInterface.get().getApprovalStatus().equals(APPROVED) && !secureBiometricInterface.get().isActive()) { + LOGGER.info("sessionId", "idType", "id", "Sbi is already deactivated."); + throw new PartnerServiceException(ErrorCode.DEACTIVATED_SBI.getErrorCode(), + ErrorCode.DEACTIVATED_SBI.getErrorMessage()); + } else if (secureBiometricInterface.get().getSwExpiryDateTime().toLocalDate().isBefore(LocalDate.now())) { + LOGGER.info("sessionId", "idType", "id", "Sbi is expired."); + throw new PartnerServiceException(ErrorCode.SBI_EXPIRED.getErrorCode(), + ErrorCode.SBI_EXPIRED.getErrorMessage()); + } + + Optional deviceDetail = deviceDetailRepository.findById(deviceDetailId); + if (deviceDetail.isEmpty()) { + LOGGER.info("sessionId", "idType", "id", "Device does not exists."); + throw new PartnerServiceException(ErrorCode.DEVICE_NOT_EXISTS.getErrorCode(), + ErrorCode.DEVICE_NOT_EXISTS.getErrorMessage()); + } else if (!deviceDetail.get().getDeviceProviderId().equals(partnerId)) { + LOGGER.info("sessionId", "idType", "id", "Device is not associated with partner Id."); + throw new PartnerServiceException(ErrorCode.DEVICE_NOT_ASSOCIATED_WITH_PARTNER_ID.getErrorCode(), + ErrorCode.DEVICE_NOT_ASSOCIATED_WITH_PARTNER_ID.getErrorMessage()); + } else if (!deviceDetail.get().getApprovalStatus().equals(PENDING_APPROVAL)) { + LOGGER.info("sessionId", "idType", "id", "Device is not in pending for approval state."); + throw new PartnerServiceException(ErrorCode.DEVICE_NOT_PENDING_FOR_APPROVAL.getErrorCode(), + ErrorCode.DEVICE_NOT_PENDING_FOR_APPROVAL.getErrorMessage()); + } + } + + public T getCertificate(String certificateAlias, String uriProperty, Class responseType ) throws JsonProcessingException { + T responseObject = null; + Map pathsegments = new HashMap<>(); + pathsegments.put("partnerCertId", certificateAlias); + Map getApiResponse = restUtil + .getApi(environment.getProperty(uriProperty), pathsegments, Map.class); + + if (getApiResponse.get("response") == null && getApiResponse.containsKey(PartnerConstants.ERRORS)) { + List> certServiceErrorList = (List>) getApiResponse + .get(PartnerConstants.ERRORS); + if (!certServiceErrorList.isEmpty()) { + LOGGER.error("Error occurred while getting the cert from keymanager"); + throw new ApiAccessibleException(certServiceErrorList.get(0).get(PartnerConstants.ERRORCODE).toString(), + certServiceErrorList.get(0).get(PartnerConstants.ERRORMESSAGE).toString()); + } else { + LOGGER.error("Error occurred while getting the cert {}", getApiResponse); + throw new ApiAccessibleException(ApiAccessibleExceptionConstant.UNABLE_TO_PROCESS.getErrorCode(), + ApiAccessibleExceptionConstant.UNABLE_TO_PROCESS.getErrorMessage()); + } + } + + if (getApiResponse.get("response") == null) { + LOGGER.error("Got null response from {}", environment.getProperty(uriProperty)); + throw new ApiAccessibleException(ApiAccessibleExceptionConstant.API_NULL_RESPONSE_EXCEPTION.getErrorCode(), + ApiAccessibleExceptionConstant.API_NULL_RESPONSE_EXCEPTION.getErrorMessage()); + } + responseObject = mapper.readValue(mapper.writeValueAsString(getApiResponse.get("response")), responseType); + return responseObject; + } + + public void populateCertificateExpiryState(OriginalCertDownloadResponseDto originalCertDownloadResponseDto) { + originalCertDownloadResponseDto.setIsMosipSignedCertificateExpired(false); + originalCertDownloadResponseDto.setIsCaSignedCertificateExpired(false); + + // Check mosip signed certificate expiry date + X509Certificate decodedMosipSignedCert = MultiPartnerUtil.decodeCertificateData(originalCertDownloadResponseDto.getMosipSignedCertificateData()); + if (isCertificateExpired(decodedMosipSignedCert)) { + originalCertDownloadResponseDto.setMosipSignedCertificateData(""); + originalCertDownloadResponseDto.setIsMosipSignedCertificateExpired(true); + } + + // Check ca signed partner certificate expiry date + X509Certificate decodedCaSignedCert = MultiPartnerUtil.decodeCertificateData(originalCertDownloadResponseDto.getCaSignedCertificateData()); + if (isCertificateExpired(decodedCaSignedCert)) { + originalCertDownloadResponseDto.setCaSignedCertificateData(""); + originalCertDownloadResponseDto.setIsCaSignedCertificateExpired(true); + } + } + + public void populateFtmCertificateExpiryState(FtmCertificateDownloadResponseDto ftmCertificateDownloadResponseDto) { + ftmCertificateDownloadResponseDto.setIsMosipSignedCertificateExpired(false); + ftmCertificateDownloadResponseDto.setIsCaSignedCertificateExpired(false); + + X509Certificate decodedMosipSignedCert = MultiPartnerUtil.decodeCertificateData(ftmCertificateDownloadResponseDto.getMosipSignedCertificateData()); + ftmCertificateDownloadResponseDto.setMosipSignedCertExpiryDateTime(decodedMosipSignedCert.getNotAfter().toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime()); + ftmCertificateDownloadResponseDto.setMosipSignedCertUploadDateTime(decodedMosipSignedCert.getNotBefore().toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime()); + // Check mosip signed certificate expiry date + if (isCertificateExpired(decodedMosipSignedCert)) { + ftmCertificateDownloadResponseDto.setMosipSignedCertificateData(""); + ftmCertificateDownloadResponseDto.setIsMosipSignedCertificateExpired(true); + } + + X509Certificate decodedCaSignedCert = MultiPartnerUtil.decodeCertificateData(ftmCertificateDownloadResponseDto.getCaSignedCertificateData()); + ftmCertificateDownloadResponseDto.setCaSignedCertExpiryDateTime(decodedCaSignedCert.getNotAfter().toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime()); + ftmCertificateDownloadResponseDto.setCaSignedCertUploadDateTime(decodedCaSignedCert.getNotBefore().toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime()); + // Check ca signed partner certificate expiry date + if (isCertificateExpired(decodedCaSignedCert)) { + ftmCertificateDownloadResponseDto.setCaSignedCertificateData(""); + ftmCertificateDownloadResponseDto.setIsCaSignedCertificateExpired(true); + } + } + + public boolean isCertificateExpired(X509Certificate cert) { + // Get the current date and time in UTC + LocalDateTime currentDateTime = LocalDateTime.now(ZoneId.of("UTC")); + LocalDateTime expiryDate = cert.getNotAfter().toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime(); + + // Check if the certificate has expired + return expiryDate.isBefore(currentDateTime); + } + + public Sort getSortingRequest (String fieldName, String sortType) { + Sort sortingRequest = null; + if (sortType.equalsIgnoreCase(PartnerConstants.ASC)) { + sortingRequest = Sort.by(fieldName).ascending(); + } + if (sortType.equalsIgnoreCase(PartnerConstants.DESC)) { + sortingRequest = Sort.by(fieldName).descending(); + } + return sortingRequest; + } + + public boolean isPartnerAdmin(String roles) { + if (roles.contains(PartnerConstants.PARTNER_ADMIN)) { + return true; + } + return false; + } + + public void validateRequestParameters(Map aliasToColumnMap, String sortFieldName, String sortType, Integer pageNo, Integer pageSize) { + // Validate sortFieldName and sortType + if ((Objects.nonNull(sortFieldName) && Objects.isNull(sortType)) || (Objects.isNull(sortFieldName) && Objects.nonNull(sortType))) { + LOGGER.error("Both sortFieldName and sortType must be provided together."); + throw new PartnerServiceException(ErrorCode.INVALID_SORT_PARAMETERS.getErrorCode(), + ErrorCode.INVALID_SORT_PARAMETERS.getErrorMessage()); + } + + // Validate pageNo and pageSize + if ((Objects.nonNull(pageNo) && Objects.isNull(pageSize)) || (Objects.isNull(pageNo) && Objects.nonNull(pageSize))) { + LOGGER.error("Both pageNo and pageSize must be provided together."); + throw new PartnerServiceException(ErrorCode.INVALID_PAGE_PARAMETERS.getErrorCode(), + ErrorCode.INVALID_PAGE_PARAMETERS.getErrorMessage()); + } + + if (isSortingRequestedWithoutPagination(sortFieldName, sortType, pageNo, pageSize)) { + LOGGER.error("Please provide pagination parameters ('pageNo' and 'pageSize') when requesting sorted data."); + throw new PartnerServiceException( + ErrorCode.MISSING_PAGINATION_FOR_SORT.getErrorCode(), + ErrorCode.MISSING_PAGINATION_FOR_SORT.getErrorMessage() + ); + } + + // Validate sortFieldName + if (sortFieldName != null && !aliasToColumnMap.containsKey(sortFieldName)) { + LOGGER.error("Invalid sort field name: " + sortFieldName); + throw new PartnerServiceException(ErrorCode.INVALID_SORT_FIELD.getErrorCode(), + String.format(ErrorCode.INVALID_SORT_FIELD.getErrorMessage(), sortFieldName)); + } + + // Validate sortType + if (sortType != null && + !sortType.equalsIgnoreCase(PartnerConstants.ASC) && + !sortType.equalsIgnoreCase(PartnerConstants.DESC)) { + LOGGER.error("Invalid sort type: " + sortType); + throw new PartnerServiceException(ErrorCode.INVALID_SORT_TYPE.getErrorCode(), + String.format(ErrorCode.INVALID_SORT_TYPE.getErrorMessage(), sortType)); + } + + // Validate pageNo + if (Objects.nonNull(pageNo) && pageNo < 0) { + LOGGER.error("Invalid page no: " + pageNo); + throw new PartnerServiceException(ErrorCode.INVALID_PAGE_NO.getErrorCode(), + ErrorCode.INVALID_PAGE_NO.getErrorMessage()); + } + + // Validate pageSize + if (Objects.nonNull(pageSize) && pageSize <= 0) { + LOGGER.error("Invalid page size: " + pageSize); + throw new PartnerServiceException(ErrorCode.INVALID_PAGE_SIZE.getErrorCode(), + ErrorCode.INVALID_PAGE_SIZE.getErrorMessage()); + } + } + + private boolean isSortingRequestedWithoutPagination(String sortFieldName, String sortType, Integer pageNo, Integer pageSize) { + return Objects.nonNull(sortFieldName) && Objects.nonNull(sortType) + && Objects.isNull(pageNo) && Objects.isNull(pageSize); + } + + public void checkIfPartnerIsNotActive(Partner partner) { + if (!partner.getIsActive()) { + LOGGER.error("Partner is not Active with id {}", partner.getId()); + throw new PartnerServiceException(ErrorCode.PARTNER_NOT_ACTIVE_EXCEPTION.getErrorCode(), + ErrorCode.PARTNER_NOT_ACTIVE_EXCEPTION.getErrorMessage()); + } + } + + public Optional getUserDetailsByPartnerId(String partnerId) throws Exception { + try { + Map pathSegments = Map.of("username", partnerId); + + String apiUrl = UriComponentsBuilder + .fromHttpUrl(Objects.requireNonNull(environment.getProperty("mosip.iam.admin-url"))) + .path(Objects.requireNonNull(environment.getProperty("mosip.iam.users-extn-url"))) + .queryParam("username", "{username}") + .build() + .toUriString(); + MediaType mediaType = MediaType.APPLICATION_JSON; + + List> getApiResponse = restUtil.getApiWithContentType(apiUrl, pathSegments, List.class, mediaType); + + // Check if the response is empty or null + if (getApiResponse == null || getApiResponse.isEmpty()) { + LOGGER.error("Error while fetching user details for partnerId:", partnerId); + return Optional.empty(); + } + + return Optional.ofNullable(mapper.readValue(mapper.writeValueAsString(getApiResponse.get(0)), KeycloakUserDto.class)); + } catch (Exception e) { + LOGGER.error("Error while fetching user details for partnerId: {}", partnerId, e.getStackTrace()); + return Optional.empty(); + } + } + + + public boolean checkIfPartnerIsDevicePartner(Partner partner) { + String partnerType = partner.getPartnerTypeCode(); + return partnerType.equals(DEVICE_PROVIDER); + } + + public boolean checkIfPartnerIsFtmPartner(Partner partner) { + String partnerType = partner.getPartnerTypeCode(); + return partnerType.equals(FTM_PROVIDER); + } + + public boolean skipDeviceOrFtmPartner(Partner partner) { + String partnerType = partner.getPartnerTypeCode(); + if (Objects.isNull(partnerType) || partnerType.equals(BLANK_STRING)) { + LOGGER.info("Partner Type is null or empty for partner id : " + partner.getId()); + throw new PartnerServiceException(ErrorCode.PARTNER_TYPE_NOT_EXISTS.getErrorCode(), + ErrorCode.PARTNER_TYPE_NOT_EXISTS.getErrorMessage()); + } + return partnerType.equals(DEVICE_PROVIDER) || partnerType.equals(FTM_PROVIDER); + } + + public void validatePolicyGroupId(Partner partner, String userId) { + if (Objects.isNull(partner.getPolicyGroupId()) || partner.getPolicyGroupId().equals(BLANK_STRING)) { + LOGGER.info("Policy group Id is null or empty for user id : " + userId); + throw new PartnerServiceException(ErrorCode.POLICY_GROUP_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.POLICY_GROUP_ID_NOT_EXISTS.getErrorMessage()); + } + } + + public PolicyGroup validatePolicyGroup(Partner partner) throws PartnerServiceException { + PolicyGroup policyGroup = policyGroupRepository.findPolicyGroupById(partner.getPolicyGroupId()); + if (Objects.isNull(policyGroup) || Objects.isNull(policyGroup.getName()) || policyGroup.getName().isEmpty()) { + LOGGER.info("Policy Group is null or empty for partner id : {}", partner.getId()); + throw new PartnerServiceException(ErrorCode.POLICY_GROUP_NOT_EXISTS.getErrorCode(), ErrorCode.POLICY_GROUP_NOT_EXISTS.getErrorMessage()); + } + return policyGroup; + } + + public void validatePartnerId(Partner partner, String userId) { + if (Objects.isNull(partner.getId()) || partner.getId().equals(BLANK_STRING)) { + LOGGER.info("Partner Id is null or empty for user id : " + userId); + throw new PartnerServiceException(ErrorCode.PARTNER_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.PARTNER_ID_NOT_EXISTS.getErrorMessage()); + } + } + + public void validateIfPartnerIsApprovedAuthPartner(Partner partner) { + String partnerType = partner.getPartnerTypeCode(); + String approvalStatus = partner.getApprovalStatus(); + if (Objects.isNull(partnerType) || partnerType.equals(BLANK_STRING)) { + LOGGER.info("Partner Type is null or empty for partner id : " + partner.getId()); + throw new PartnerServiceException(ErrorCode.PARTNER_TYPE_NOT_EXISTS.getErrorCode(), + ErrorCode.PARTNER_TYPE_NOT_EXISTS.getErrorMessage()); + } + if ((Objects.isNull(approvalStatus) || approvalStatus.equals(BLANK_STRING))) { + LOGGER.info("Approval status is null or empty for partner id : " + partner.getId()); + throw new PartnerServiceException(ErrorCode.APPROVAL_STATUS_NOT_EXISTS.getErrorCode(), + ErrorCode.APPROVAL_STATUS_NOT_EXISTS.getErrorMessage()); + } + if (!partnerType.equals(AUTH_PARTNER)) { + LOGGER.info("The specified partner is not of type Authentication Partner " + partner.getId()); + throw new PartnerServiceException(ErrorCode.NOT_AUTH_PARTNER_TYPE_ERROR.getErrorCode(), + ErrorCode.NOT_AUTH_PARTNER_TYPE_ERROR.getErrorMessage()); + } + if (!approvalStatus.equals(APPROVED)) { + LOGGER.info("The specified partner is not of type Authentication Partner " + partner.getId()); + throw new PartnerServiceException(ErrorCode.PARTNER_NOT_APPROVED_ERROR.getErrorCode(), + ErrorCode.PARTNER_NOT_APPROVED_ERROR.getErrorMessage()); + } + } +} diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/util/PartnerUtil.java b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/util/PartnerUtil.java index 3cc570341a..e0a40cfe46 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/partner/util/PartnerUtil.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/partner/util/PartnerUtil.java @@ -9,6 +9,8 @@ */ public class PartnerUtil { + + public static final String BLANK_STRING = ""; /** * @return partnerId. @@ -69,4 +71,21 @@ public static String generateUUID(String prefix, String replaceHypen, int length return uniqueId; return uniqueId.substring(0, length); } + + public static String trimAndReplace(String str) { + if (str == null) { + return null; + } + return str.trim().replaceAll("\\s+", " "); + } + + public static String getCertificateName(String subjectDN) { + String[] parts = subjectDN.split(","); + for (String part : parts) { + if (part.trim().startsWith("CN=")) { + return part.trim().substring(3); + } + } + return BLANK_STRING; + } } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/user/controller/UserController.java b/partner/partner-management-service/src/main/java/io/mosip/pms/user/controller/UserController.java index cd2c4b709f..033122c2b6 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/user/controller/UserController.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/user/controller/UserController.java @@ -2,26 +2,62 @@ import javax.validation.Valid; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.partner.dto.UserDetailsDto; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import io.mosip.pms.common.request.dto.RequestWrapper; import io.mosip.pms.common.response.dto.ResponseWrapper; import io.mosip.pms.partner.dto.MosipUserDto; import io.mosip.pms.partner.dto.UserRegistrationRequestDto; import io.mosip.pms.user.service.UserManagementService; +import java.util.HashMap; +import java.util.Map; + @RestController -@RequestMapping(value = "/users") public class UserController { + @Value("${mosip.pms.oidc.clients.grantTypes:authorization_code}") + private String grantTypes; + + @Value("${mosip.pms.oidc.clients.clientAuthMethods:private_key_jwt}") + private String clientAuthMethods; + + @Value("${mosip.pms.session.inactivity.timer}") + private String inActivityTimer; + + @Value("${mosip.pms.session.inactivity.prompt.timer}") + private String inActivityPromptTimer; + + @Value("${mosip.pms.axios.timeout}") + private String axiosTimeout; + + @Value("${mosip.pms.expiry.date.max.year}") + private String maxAllowedExpiryYear; + + @Value("${mosip.pms.created.date.max.year}") + private String maxAllowedCreatedYear; + + @Value("${mosip.pms.pagination.items.per.page}") + private String itemsPerPage; + + @Value("${mosip.pms.api.id.configs.get}") + private String getConfigsId; + + public static final String VERSION = "1.0"; + @Autowired UserManagementService userManagementService; - @PostMapping + @PostMapping(value = "/users") @PreAuthorize("hasAnyRole('MISP_PARTNER','PARTNER_ADMIN','AUTH_PARTNER','CREDENTIAL_PARTNER','ONLINE_VERIFICATION_PARTNER','DEVICE_PROVIDER','FTM_PROVIDER','ABIS_PARTNER','MANUAL_ADJUDICATION','SDK_PARTNER')") public ResponseWrapper registerUser( @RequestBody @Valid RequestWrapper request) { @@ -30,4 +66,49 @@ public ResponseWrapper registerUser( return response; } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getUserconsent())") + @PostMapping(value = "users/user-consent") + @Operation(summary = "Added in release-1.3.0, This endpoint saves the user's consent related to data captured by the PMS portal", + description = "This endpoint saves the user's consent related to data captured by the PMS portal, which is requested only once after the user's first login. Once provided, the consent will not be asked again. It is configured for all Partner Type roles.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true)))}) + public ResponseWrapperV2 saveUserConsent() { + return userManagementService.saveUserConsent(); + } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getUserconsent())") + @GetMapping(value = "users/user-consent") + @Operation(summary = "Added in release-1.3.0, This endpoint fetches the user's consent related to the data captured by PMS", + description = "This endpoint fetches the user's consent related to the data captured by PMS. The consent is requested only once after the user's first login, and won't be asked again if already given. It is configured for all Partner Type roles.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true)))}) + public ResponseWrapperV2 isUserConsentGiven() { + return userManagementService.isUserConsentGiven(); + } + + @GetMapping(value = "/system-config") + @Operation(summary = "Added in release-1.3.0, This endpoint fetches the configurations for PMS", description = "This endpoint fetches the configurations for PMS and sends them to the UI. No roles are required for access.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true)))}) + public ResponseWrapperV2> getSystemConfig() { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + responseWrapper.setId(getConfigsId); + responseWrapper.setVersion(VERSION); + Map configMap = new HashMap(); + configMap.put("grantTypes", grantTypes); + configMap.put("clientAuthMethods", clientAuthMethods); + configMap.put("inActivityTimer", inActivityTimer); + configMap.put("inActivityPromptTimer", inActivityPromptTimer); + configMap.put("axiosTimeout", axiosTimeout); + configMap.put("maxAllowedExpiryYear", maxAllowedExpiryYear); + configMap.put("maxAllowedCreatedYear", maxAllowedCreatedYear); + configMap.put("itemsPerPage", itemsPerPage); + responseWrapper.setResponse(configMap); + System.out.println(responseWrapper); + return responseWrapper; + } } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/user/service/UserManagementService.java b/partner/partner-management-service/src/main/java/io/mosip/pms/user/service/UserManagementService.java index 04977ea701..4260ef8d52 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/user/service/UserManagementService.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/user/service/UserManagementService.java @@ -1,9 +1,15 @@ package io.mosip.pms.user.service; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; import io.mosip.pms.partner.dto.MosipUserDto; +import io.mosip.pms.partner.dto.UserDetailsDto; import io.mosip.pms.partner.dto.UserRegistrationRequestDto; public interface UserManagementService { public MosipUserDto registerUser(UserRegistrationRequestDto userToBeRegistred); + + public ResponseWrapperV2 saveUserConsent(); + + public ResponseWrapperV2 isUserConsentGiven(); } diff --git a/partner/partner-management-service/src/main/java/io/mosip/pms/user/service/impl/UserManagementServiceImpl.java b/partner/partner-management-service/src/main/java/io/mosip/pms/user/service/impl/UserManagementServiceImpl.java index b0559682ad..c9d5fc733f 100644 --- a/partner/partner-management-service/src/main/java/io/mosip/pms/user/service/impl/UserManagementServiceImpl.java +++ b/partner/partner-management-service/src/main/java/io/mosip/pms/user/service/impl/UserManagementServiceImpl.java @@ -1,6 +1,21 @@ package io.mosip.pms.user.service.impl; +import io.mosip.kernel.core.authmanager.authadapter.model.AuthUserDetails; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.pms.common.dto.UserDetails; +import io.mosip.pms.common.entity.Partner; +import io.mosip.pms.common.repository.PartnerServiceRepository; +import io.mosip.pms.common.repository.UserDetailsRepository; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.common.util.PMSLogger; +import io.mosip.pms.partner.constant.ErrorCode; +import io.mosip.pms.partner.dto.UserDetailsDto; +import io.mosip.pms.partner.exception.PartnerServiceException; +import io.mosip.pms.partner.util.MultiPartnerUtil; +import io.mosip.pms.partner.util.PartnerUtil; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import io.mosip.pms.partner.dto.MosipUserDto; @@ -8,15 +23,145 @@ import io.mosip.pms.partner.keycloak.service.KeycloakImpl; import io.mosip.pms.user.service.UserManagementService; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + @Service public class UserManagementServiceImpl implements UserManagementService{ + private static final Logger LOGGER = PMSLogger.getLogger(UserManagementServiceImpl.class); + public static final String YES = "YES"; + public static final String VERSION = "1.0"; + + @Value("${mosip.pms.api.id.user.consent.post}") + private String postSaveUserConsentGivenId; + + @Value("${mosip.pms.api.id.user.consent.get}") + private String getUserConsentGivenId; + @Autowired KeycloakImpl keycloakService; - + + @Autowired + UserDetailsRepository userDetailsRepository; + + @Autowired + PartnerServiceRepository partnerRepository; + + private AuthUserDetails authUserDetails() { + return (AuthUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + } + + private String getUserId() { + String userId = authUserDetails().getUserId(); + return userId; + } + + private String getUserBy() { + String crBy = authUserDetails().getMail(); + return crBy; + } + @Override public MosipUserDto registerUser(UserRegistrationRequestDto userToBeRegistred) { return keycloakService.registerUser(userToBeRegistred); - } + } + + @Override + public ResponseWrapperV2 saveUserConsent() { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + try { + String userId = getUserId(); + List partnerList = partnerRepository.findByUserId(userId); + if (!partnerList.isEmpty()) { + UserDetails userDetails = new UserDetails(); + + LocalDateTime nowDate = LocalDateTime.now(); + userDetails.setConsentGiven(YES); + userDetails.setConsentGivenDtimes(nowDate); + + Optional optionalEntity = userDetailsRepository.findByUserId(userId); + if (optionalEntity.isPresent()) { + UserDetails entity = optionalEntity.get(); + userDetails.setId(entity.getId()); + userDetails.setUpdBy(this.getUserBy()); + userDetails.setUpdDtimes(nowDate); + userDetails.setCrBy(entity.getCrBy()); + userDetails.setCrDtimes(entity.getCrDtimes()); + userDetails.setUserId(entity.getUserId()); + } else { + userDetails.setId(PartnerUtil.generateUUID("id", "", 36)); + userDetails.setCrBy(this.getUserBy()); + userDetails.setCrDtimes(nowDate); + userDetails.setUserId(userId); + } + UserDetails respEntity = userDetailsRepository.save(userDetails); + LOGGER.info("sessionId", "idType", "id", "saving user consent data for user id : ", userId); + + UserDetailsDto userDetailsDto = new UserDetailsDto(); + userDetailsDto.setConsentGiven(true); + userDetailsDto.setUserId(respEntity.getUserId()); + userDetailsDto.setConsentGivenDateTime(respEntity.getConsentGivenDtimes()); + + responseWrapper.setResponse(userDetailsDto); + } else { + LOGGER.info("sessionId", "idType", "id", "User id does not exists."); + throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); + } + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In saveUserConsentGiven method of UserManagementServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception e) { + LOGGER.debug("sessionId", "idType", "id", e.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", "In saveUserConsentGiven method of UserManagementServiceImpl - " + e.getMessage()); + String errorCode = ErrorCode.PMS_CONSENT_UNABLE_TO_ADD.getErrorCode(); + String errorMessage = ErrorCode.PMS_CONSENT_UNABLE_TO_ADD.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(postSaveUserConsentGivenId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + @Override + public ResponseWrapperV2 isUserConsentGiven() { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + try { + String userId = getUserId(); + List partnerList = partnerRepository.findByUserId(userId); + if (!partnerList.isEmpty()) { + UserDetailsDto userDetailsDto = new UserDetailsDto(); + userDetailsDto.setUserId(userId); + LOGGER.info("sessionId", "idType", "id", "fetching consent status from db for user :", userId); + Optional optionalEntity = userDetailsRepository.findByUserId(userId); + if (optionalEntity.isPresent()) { + UserDetails entity = optionalEntity.get(); + if (entity.getConsentGiven().equals(YES)) { + userDetailsDto.setConsentGiven(true); + userDetailsDto.setConsentGivenDateTime(entity.getConsentGivenDtimes()); + } + } + responseWrapper.setResponse(userDetailsDto); + } else { + LOGGER.info("sessionId", "idType", "id", "User id does not exists."); + throw new PartnerServiceException(ErrorCode.USER_ID_NOT_EXISTS.getErrorCode(), + ErrorCode.USER_ID_NOT_EXISTS.getErrorMessage()); + } + } catch (PartnerServiceException ex) { + LOGGER.info("sessionId", "idType", "id", "In isUserConsentGiven method of UserManagementServiceImpl - " + ex.getMessage()); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception e) { + LOGGER.debug("sessionId", "idType", "id", e.getStackTrace()); + LOGGER.error("sessionId", "idType", "id", "In isUserConsentGiven method of UserManagementServiceImpl - " + e.getMessage()); + String errorCode = ErrorCode.PMS_CONSENT_ERR.getErrorCode(); + String errorMessage = ErrorCode.PMS_CONSENT_ERR.getErrorMessage(); + responseWrapper.setErrors(MultiPartnerUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getUserConsentGivenId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } } diff --git a/partner/partner-management-service/src/main/resources/application-dev.properties b/partner/partner-management-service/src/main/resources/application-dev.properties index 159002230a..e09d1c8f8d 100644 --- a/partner/partner-management-service/src/main/resources/application-dev.properties +++ b/partner/partner-management-service/src/main/resources/application-dev.properties @@ -6,7 +6,7 @@ mosip.pms.client.secret= #server.servlet.version=/v1 ## For PMS javax.persistence.jdbc.driver=org.postgresql.Driver -javax.persistence.jdbc.url = jdbc:postgresql://dev1.mosip.net:5432/mosip_pms +javax.persistence.jdbc.url = jdbc:postgresql://dev.mosip.net:5432/mosip_pms javax.persistence.jdbc.password = javax.persistence.jdbc.user = postgres javax.persistence.jdbc.schema = pms @@ -73,7 +73,7 @@ pmp-keymanager.upload.other.domain.cert.rest.uri=${mosip.api.internal.url}/v1/ke pmp.certificaticate.datashare.rest.uri=${mosip.api.internal.url}/v1/datashare/create pms.certs.datashare.policyId=mpolicy-default-cert pms.certs.datashare.subscriberId=mpartner-default-cert -application.id=PMS +application.id=PARTNER keycloak.verify-token-audience=true ###############Keycloak configuration ########################## diff --git a/partner/partner-management-service/src/main/resources/bootstrap.properties b/partner/partner-management-service/src/main/resources/bootstrap.properties index 672a2a6c1d..b7b99d155b 100644 --- a/partner/partner-management-service/src/main/resources/bootstrap.properties +++ b/partner/partner-management-service/src/main/resources/bootstrap.properties @@ -59,7 +59,7 @@ mosipbox.public.url=http://localhost:9109 openapi.partnerManagementService.servers[0].url=${mosipbox.public.url}/v1/partnermanager openapi.partnerManagementService.servers[0].description= Partner Management Service -##START properties are for PMS Revamp DP1 release +##START properties are for PMS Revamp release mosip.pmp.host=localhost:4200 mosip.pmp.reactjs.ui.host=localhost:3000 auth.allowed.urls=https://${mosip.pmp.host}/,https://${mosip.pmp.reactjs.ui.host}/ @@ -67,18 +67,35 @@ auth.allowed.urls=https://${mosip.pmp.host}/,https://${mosip.pmp.reactjs.ui.host #auth.allowed.urls=http://${mosip.pmp.host}/,http://${mosip.pmp.reactjs.ui.host}/ mosip.kernel.keymanager.url=https://dev.mosip.net + pmp.partner.original.certificate.get.rest.uri=${mosip.kernel.keymanager.url}/v1/keymanager/getPartnerSignedCertificate/{partnerCertId} +pmp.trust.certificates.post.rest.uri=${mosip.kernel.keymanager.url}/v1/keymanager/getCaCertificates +pmp.download.trust.certificates.get.rest.uri=${mosip.kernel.keymanager.url}/v1/keymanager/getCACertificateTrustPath/{caCertId} -mosip.role.pms.getallcertificatedetails=AUTH_PARTNER,ABIS_PARTNER,SDK_PARTNER,DEVICE_PROVIDER,FTM_PROVIDER,CREDENTIAL_PARTNER,PARTNER_ADMIN,ONLINE_VERIFICATION_PARTNER -mosip.role.pms.getallrequestedpolicies=AUTH_PARTNER,ABIS_PARTNER,SDK_PARTNER,CREDENTIAL_PARTNER,PARTNER_ADMIN,ONLINE_VERIFICATION_PARTNER -mosip.role.pms.getallapprovedauthpartnerpolicies=AUTH_PARTNER,PARTNER_ADMIN -mosip.role.pms.getallapprovedpartneridswithpolicygroups=AUTH_PARTNER,ABIS_PARTNER,SDK_PARTNER,CREDENTIAL_PARTNER,PARTNER_ADMIN,ONLINE_VERIFICATION_PARTNER -mosip.role.pms.getallapikeysforauthpartners=AUTH_PARTNER,PARTNER_ADMIN -mosip.role.pms.getalloidcclients=AUTH_PARTNER,PARTNER_ADMIN +mosip.role.pms.getpartnercertificates=AUTH_PARTNER,ABIS_PARTNER,SDK_PARTNER,DEVICE_PROVIDER,FTM_PROVIDER,CREDENTIAL_PARTNER,PARTNER_ADMIN,ONLINE_VERIFICATION_PARTNER mosip.role.pms.userconsent=AUTH_PARTNER,ABIS_PARTNER,SDK_PARTNER,DEVICE_PROVIDER,FTM_PROVIDER,CREDENTIAL_PARTNER,PARTNER_ADMIN,ONLINE_VERIFICATION_PARTNER +mosip.role.pms.getsbidetails=DEVICE_PROVIDER,PARTNER_ADMIN +mosip.role.pms.postadddevicetosbi=DEVICE_PROVIDER,PARTNER_ADMIN +mosip.role.pms.postdevicewithsbimapping=PARTNER_ADMIN +mosip.role.pms.patchdeactivatedevice=DEVICE_PROVIDER,PARTNER_ADMIN +mosip.role.pms.patchdeactivatesbi=DEVICE_PROVIDER,PARTNER_ADMIN +mosip.role.pms.getftmchipdetails=FTM_PROVIDER,PARTNER_ADMIN +mosip.role.pms.patchdeactivateftm=FTM_PROVIDER,PARTNER_ADMIN +mosip.role.pms.getoriginalftmcertificate=FTM_PROVIDER,PARTNER_ADMIN +mosip.role.pms.getpartnerdetails=PARTNER_ADMIN +mosip.role.pms.getadminpartners=PARTNER_ADMIN +mosip.role.pms.getallpartnerpolicymappingrequests=PARTNER_ADMIN,AUTH_PARTNER,ABIS_PARTNER,SDK_PARTNER,CREDENTIAL_PARTNER,PARTNER_ADMIN,ONLINE_VERIFICATION_PARTNER +mosip.role.pms.getoauthpartnersclients=PARTNER_ADMIN,AUTH_PARTNER +mosip.role.pms.getpartnersapikeyrequests=PARTNER_ADMIN,AUTH_PARTNER +mosip.role.pms.getpartnersftmchipdetails=PARTNER_ADMIN +mosip.role.pms.getallsbidetails=PARTNER_ADMIN,DEVICE_PROVIDER +mosip.role.pms.getalldevicedetails=PARTNER_ADMIN +mosip.role.pms.gettrustcertificates=PARTNER_ADMIN +mosip.role.pms.getdownloadtrustcertificates=PARTNER_ADMIN +mosip.role.pms.getpartnersv3=DEVICE_PROVIDER,FTM_PROVIDER,PARTNER_ADMIN,AUTH_PARTNER,ABIS_PARTNER,SDK_PARTNER,CREDENTIAL_PARTNER,PARTNER_ADMIN,ONLINE_VERIFICATION_PARTNER #OIDC Client attributes for create and update -mosip.pms.oidc.clients.grantTypes=authorization_code +mosip.pms.oidc.clients.grantTypes=authorization_code mosip.pms.oidc.clients.clientAuthMethods=private_key_jwt # SSO user session inactivity time in minutes after which the user gets automatically logged out mosip.pms.session.inactivity.timer=25 @@ -86,17 +103,42 @@ mosip.pms.session.inactivity.timer=25 mosip.pms.session.inactivity.prompt.timer=5 # amount of time that axios will wait for a response from the server before aborting the request and throwing an error in minutes mosip.pms.axios.timeout=3 +# maximum number of year to be allowed for SBI expiry date +mosip.pms.expiry.date.max.year=10 +# maximum number of year to be allowed for SBI created date +mosip.pms.created.date.max.year=10 +# Maximum number of items to be displayed per page in the pagination +mosip.pms.pagination.items.per.page=8 #id for the API -mosip.pms.api.id.all.oidc.clients.get=mosip.pms.all.oidc.clients.get -mosip.pms.api.id.all.certificates.details.get=mosip.pms.all.certificates.details.get -mosip.pms.api.id.all.requested.policies.get=mosip.pms.all.requested.policies.get -mosip.pms.api.id.all.approved.auth.partners.policies.get=mosip.pms.all.approved.auth.partners.policies.get -mosip.pms.api.id.all.approved.partner.ids.with.policy.groups.get=mosip.pms.all.approved.partner.ids.with.policy.groups.get +mosip.pms.api.id.oauth.clients.get=mosip.pms.oauth.clients.get +mosip.pms.api.id.partner.certificates.get=mosip.pms.partner.certificates.get +mosip.pms.api.id.approved.partner.ids.with.policy.groups.get=mosip.pms.approved.partner.ids.with.policy.groups.get mosip.pms.api.id.configs.get=mosip.pms.configs.get -mosip.pms.api.id.all.api.keys.for.auth.partners.get=mosip.pms.all.api.keys.for.auth.partners.get -mosip.pms.api.id.user.consent.given.get=mosip.pms.user.consent.given.get -mosip.pms.api.id.save.user.consent.given.post=mosip.pms.save.user.consent.given.post -mosip.pms.api.id.original.partner.certificate.get=mosip.pms.original.partner.certificate.get -##END properties are for PMS Revamp DP1 release - +mosip.pms.api.id.auth.partner.api.keys.get=mosip.pms.auth.partner.api.keys.get +mosip.pms.api.id.user.consent.get=mosip.pms.user.consent.get +mosip.pms.api.id.user.consent.post=mosip.pms.user.consent.post +mosip.pms.api.id.original.partner.certificate.get=mosip.pms.original.partner.certificate.get +mosip.pms.api.id.sbi.details.get=mosip.pms.sbi.details.get +mosip.pms.api.id.approved.device.provider.ids.get=mosip.pms.approved.device.provider.ids.get +mosip.pms.api.id.sbi.devices.get=mosip.pms.sbi.devices.get +mosip.pms.api.id.add.device.to.sbi.id.post=mosip.pms.add.device.to.sbi.id.post +mosip.pms.api.id.approval.mapping.device.to.sbi.post=mosip.pms.approval.mapping.device.to.sbi.post +mosip.pms.api.id.deactivate.device.patch=mosip.pms.deactivate.device.patch +mosip.pms.api.id.deactivate.sbi.patch=mosip.pms.deactivate.sbi.patch +mosip.pms.api.id.ftm.chip.details.get=mosip.pms.ftm.chip.details.get +mosip.pms.api.id.approved.ftm.provider.ids.get=mosip.pms.approved.ftm.provider.ids.get +mosip.pms.api.id.deactivate.ftm.patch=mosip.pms.deactivate.ftm.patch +mosip.pms.api.id.original.ftm.certificate.get=mosip.pms.original.ftm.certificate.get +mosip.pms.api.id.partner.details.get=mosip.pms.partner.details.get +mosip.pms.api.id.admin.partners.get=mosip.pms.admin.partners.get +mosip.pms.api.id.all.partner.policy.mapping.requests.get=mosip.pms.all.partner.policy.mapping.requests.get +mosip.pms.api.id.oauth.partners.clients.get=mosip.pms.oauth.partners.clients.get +mosip.pms.api.id.all.api.key.requests.get=mosip.pms.all.api.key.requests.get +mosip.pms.api.id.partners.ftm.chip.details.get=mosip.pms.partners.ftm.chip.details.get +mosip.pms.api.id.all.sbi.details.get=mosip.pms.all.sbi.details.get +mosip.pms.api.id.get.all.device.details.get=mosip.pms.get.all.device.details.get +mosip.pms.api.id.trust.certificates.get=mosip.pms.trust.certificates.get +mosip.pms.api.id.download.trust.certificates.get=mosip.pms.download.trust.certificates.get +mosip.pms.api.id.partners.v3.get=mosip.pms.partners.v3.get +##END properties are for PMS Revamp release diff --git a/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/controller/DeviceDetailControllerTest.java b/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/controller/DeviceDetailControllerTest.java index 359ac37a72..ce32cb4ff5 100644 --- a/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/controller/DeviceDetailControllerTest.java +++ b/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/controller/DeviceDetailControllerTest.java @@ -1,15 +1,26 @@ package io.mosip.pms.test.device.controller; -import static org.mockito.ArgumentMatchers.any; -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.status; - -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.List; - +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.mosip.pms.common.constant.Purpose; +import io.mosip.pms.common.dto.*; +import io.mosip.pms.common.request.dto.RequestWrapper; +import io.mosip.pms.common.request.dto.RequestWrapperV2; +import io.mosip.pms.common.response.dto.ResponseWrapper; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.device.authdevice.service.impl.DeviceDetailServiceImpl; +import io.mosip.pms.device.dto.DeviceDetailFilterDto; +import io.mosip.pms.device.dto.DeviceDetailSummaryDto; +import io.mosip.pms.device.request.dto.DeviceDetailDto; +import io.mosip.pms.device.request.dto.DeviceDetailUpdateDto; +import io.mosip.pms.device.request.dto.DeviceSearchDto; +import io.mosip.pms.device.request.dto.DeactivateDeviceRequestDto; +import io.mosip.pms.device.request.dto.UpdateDeviceDetailStatusDto; +import io.mosip.pms.device.response.dto.*; +import io.mosip.pms.device.util.AuditUtil; +import io.mosip.pms.partner.request.dto.SbiAndDeviceMappingRequestDto; +import io.mosip.pms.partner.util.PartnerHelper; +import io.mosip.pms.test.PartnerManagementServiceTest; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -24,32 +35,23 @@ import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.web.client.RestTemplate; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.List; -import io.mosip.pms.common.constant.Purpose; -import io.mosip.pms.common.dto.DeviceFilterValueDto; -import io.mosip.pms.common.dto.FilterDto; -import io.mosip.pms.common.dto.PageResponseDto; -import io.mosip.pms.common.dto.Pagination; -import io.mosip.pms.common.dto.SearchFilter; -import io.mosip.pms.common.dto.SearchSort; -import io.mosip.pms.common.request.dto.RequestWrapper; -import io.mosip.pms.common.response.dto.ResponseWrapper; -import io.mosip.pms.device.authdevice.service.impl.DeviceDetailServiceImpl; -import io.mosip.pms.device.request.dto.DeviceDetailDto; -import io.mosip.pms.device.request.dto.DeviceDetailUpdateDto; -import io.mosip.pms.device.request.dto.DeviceSearchDto; -import io.mosip.pms.device.request.dto.UpdateDeviceDetailStatusDto; -import io.mosip.pms.device.response.dto.DeviceDetailSearchResponseDto; -import io.mosip.pms.device.response.dto.FilterResponseCodeDto; -import io.mosip.pms.device.response.dto.IdDto; -import io.mosip.pms.device.response.dto.RegistrationSubTypeDto; -import io.mosip.pms.device.util.AuditUtil; -import io.mosip.pms.test.PartnerManagementServiceTest; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.when; +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.status; @RunWith(SpringRunner.class) @@ -58,6 +60,8 @@ @EnableWebMvc public class DeviceDetailControllerTest { + public static final String VERSION = "1.0"; + @Autowired private MockMvc mockMvc; @@ -72,12 +76,15 @@ public class DeviceDetailControllerTest { private RestTemplate restTemplate; @MockBean - private DeviceDetailServiceImpl deviceDetaillService; + private DeviceDetailServiceImpl deviceDetaillService; + + @MockBean + PartnerHelper partnerHelper; @Before public void setup() { - Mockito.doNothing().when(auditUtil).auditRequest(any(), any(), any()); - Mockito.doNothing().when(auditUtil).auditRequest(any(), any(), any(),any()); + doNothing().when(auditUtil).auditRequest(any(), any(), any()); + doNothing().when(auditUtil).auditRequest(any(), any(), any(),any()); IdDto response = new IdDto(); String stringResponse = new String(); @@ -94,14 +101,14 @@ public void setup() { searchResponseWrapper.setResponse(searchResponse); responseWrapper.setResponse(response); responsewrapper.setResponse(stringResponse); - Mockito.when(deviceDetaillService.updateDeviceDetails(Mockito.any())).thenReturn(response); - Mockito.when(deviceDetaillService.createDeviceDetails(Mockito.any())).thenReturn(response); - Mockito.when(deviceDetaillService.updateDeviceDetailStatus(Mockito.any())).thenReturn(stringResponse); - Mockito.when(deviceDetaillService.searchDeviceDetails(Mockito.any(), Mockito.any())).thenReturn(searchResponse); - Mockito.when(deviceDetaillService.searchDeviceType(Mockito.any(), Mockito.any())).thenReturn(searchTypeResponse); - Mockito.when(deviceDetaillService.deviceFilterValues(Mockito.any())).thenReturn(filterResponse); - Mockito.when(deviceDetaillService.deviceTypeFilterValues(Mockito.any())).thenReturn(filterResponse); - Mockito.when(deviceDetaillService.deviceSubTypeFilterValues(Mockito.any())).thenReturn(filterResponse); + when(deviceDetaillService.updateDeviceDetails(Mockito.any())).thenReturn(response); + when(deviceDetaillService.createDeviceDetails(Mockito.any())).thenReturn(response); + when(deviceDetaillService.updateDeviceDetailStatus(Mockito.any())).thenReturn(stringResponse); + when(deviceDetaillService.searchDeviceDetails(Mockito.any(), Mockito.any())).thenReturn(searchResponse); + when(deviceDetaillService.searchDeviceType(Mockito.any(), Mockito.any())).thenReturn(searchTypeResponse); + when(deviceDetaillService.deviceFilterValues(Mockito.any())).thenReturn(filterResponse); + when(deviceDetaillService.deviceTypeFilterValues(Mockito.any())).thenReturn(filterResponse); + when(deviceDetaillService.deviceSubTypeFilterValues(Mockito.any())).thenReturn(filterResponse); } @WithMockUser(roles = {"PARTNER_ADMIN"}) @@ -439,5 +446,81 @@ public void filterDeviceSubTypeTest() throws JsonProcessingException, Exception mockMvc.perform(MockMvcRequestBuilders.post("/devicedetail/deviceSubType/filtervalues").contentType(MediaType.APPLICATION_JSON_VALUE) .content(objectMapper.writeValueAsString(request))).andExpect(status().isOk()); } + + @Test + @WithMockUser(roles = {"DEVICE_PROVIDER"}) + public void deactivateDeviceTest() throws Exception { + RequestWrapperV2 requestWrapper = new RequestWrapperV2<>(); + DeactivateDeviceRequestDto requestDto = new DeactivateDeviceRequestDto(); + requestDto.setStatus("De-Activate"); + requestWrapper.setRequest(requestDto); + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + DeviceDetailResponseDto deviceDetailResponseDto = new DeviceDetailResponseDto(); + responseWrapper.setResponse(deviceDetailResponseDto); + + Mockito.when(deviceDetaillService.deactivateDevice(Mockito.anyString(), Mockito.any())).thenReturn(responseWrapper); + + mockMvc.perform(MockMvcRequestBuilders.patch("/devicedetail/12345").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsString(requestWrapper))).andExpect(status().isOk()); + } + + + @Test + @WithMockUser(roles = {"PARTNER_ADMIN"}) + public void getAllDeviceDetailsTest() throws Exception { + String sortFieldName = "deviceId"; + String sortType = "asc"; + Integer pageNo = 0; + Integer pageSize = 8; + String partnerId = "test-partner"; + String orgName = "test-org"; + String deviceType = "Finger"; + String deviceSubType = "single"; + String status = "approved"; + String make = "test-make"; + String model = "test-model"; + String sbiId = "test-sbi-id"; + String sbiVersion = "1.0"; + String deviceId = "test-device-id"; + + ResponseWrapperV2> mockResponse = new ResponseWrapperV2<>(); + when(deviceDetaillService.getAllDeviceDetails(eq(sortFieldName), eq(sortType), eq(pageNo), eq(pageSize), any(DeviceDetailFilterDto.class))) + .thenReturn(mockResponse); + + doNothing().when(partnerHelper).validateRequestParameters(any(), eq(sortFieldName), eq(sortType), eq(pageNo), eq(pageSize)); + + mockMvc.perform(MockMvcRequestBuilders.get("/devicedetail") + .param("sortFieldName", sortFieldName) + .param("sortType", sortType) + .param("pageNo", String.valueOf(pageNo)) + .param("pageSize", String.valueOf(pageSize)) + .param("partnerId", partnerId) + .param("orgName", orgName) + .param("deviceType", deviceType) + .param("deviceSubType", deviceSubType) + .param("status", status) + .param("make", make) + .param("model", model) + .param("sbiId", sbiId) + .param("sbiVersion", sbiVersion) + .param("deviceId", deviceId)) + .andExpect(MockMvcResultMatchers.status().isOk()); + } + + @Test + @WithMockUser(roles = {"PARTNER_ADMIN"}) + public void approveOrRejectMappingDeviceToSbiTest() throws Exception { + RequestWrapperV2 requestWrapper = new RequestWrapperV2<>(); + requestWrapper.setId("mosip.pms.mapping.device.to.sbi.post"); + requestWrapper.setVersion(VERSION); + requestWrapper.setRequestTime(LocalDateTime.now()); + SbiAndDeviceMappingRequestDto sbiAndDeviceMappingRequestDto = new SbiAndDeviceMappingRequestDto(); + requestWrapper.setRequest(sbiAndDeviceMappingRequestDto); + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + responseWrapper.setResponse(true); + Mockito.when(deviceDetaillService.approveOrRejectMappingDeviceToSbi(any(), any())).thenReturn(responseWrapper); + mockMvc.perform(post("/devicedetail/1234/approval").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsString(requestWrapper))).andExpect(status().isOk()); + } } diff --git a/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/controller/FTPChipDetailControllerTest.java b/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/controller/FTPChipDetailControllerTest.java index 273690b1ad..15a053b0c0 100644 --- a/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/controller/FTPChipDetailControllerTest.java +++ b/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/controller/FTPChipDetailControllerTest.java @@ -6,11 +6,19 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.io.IOException; +import java.time.LocalDateTime; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.List; +import io.mosip.pms.common.request.dto.RequestWrapperV2; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.device.dto.FtmChipDetailsDto; +import io.mosip.pms.device.dto.FtmChipFilterDto; +import io.mosip.pms.device.request.dto.*; +import io.mosip.pms.device.response.dto.*; +import io.mosip.pms.partner.response.dto.FtmCertificateDownloadResponseDto; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -26,6 +34,7 @@ import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.web.client.RestTemplate; import org.springframework.web.servlet.config.annotation.EnableWebMvc; @@ -35,6 +44,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.mosip.pms.common.constant.Purpose; +import io.mosip.pms.common.dto.PageResponseV2Dto; import io.mosip.pms.common.dto.PageResponseDto; import io.mosip.pms.common.dto.Pagination; import io.mosip.pms.common.dto.SearchFilter; @@ -44,16 +54,6 @@ import io.mosip.pms.device.authdevice.entity.FTPChipDetail; import io.mosip.pms.device.authdevice.service.FtpChipDetailService; import io.mosip.pms.device.authdevice.service.impl.FTPChipDetailServiceImpl; -import io.mosip.pms.device.request.dto.DeviceSearchDto; -import io.mosip.pms.device.request.dto.FtpChipCertDownloadRequestDto; -import io.mosip.pms.device.request.dto.FtpChipCertificateRequestDto; -import io.mosip.pms.device.request.dto.FtpChipDetailDto; -import io.mosip.pms.device.request.dto.FtpChipDetailStatusDto; -import io.mosip.pms.device.request.dto.FtpChipDetailUpdateDto; -import io.mosip.pms.device.response.dto.FTPSearchResponseDto; -import io.mosip.pms.device.response.dto.FtpCertDownloadResponeDto; -import io.mosip.pms.device.response.dto.FtpCertificateResponseDto; -import io.mosip.pms.device.response.dto.IdDto; import io.mosip.pms.device.util.AuditUtil; @RunWith(SpringRunner.class) @@ -381,6 +381,68 @@ public void getPartnerCertificateTest_02() throws JsonProcessingException, Excep mockMvc.perform(MockMvcRequestBuilders.get("/ftpchipdetail/getPartnerCertificate/1234").contentType(MediaType.APPLICATION_JSON_VALUE) .content(objectMapper.writeValueAsString(request))).andExpect(status().isOk()); } - + @Test + @WithMockUser(roles = {"FTM_PROVIDER"}) + public void deactivateFtmTest() throws Exception { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + RequestWrapperV2 requestWrapper = new RequestWrapperV2<>(); + DeactivateFtmRequestDto requestDto = new DeactivateFtmRequestDto(); + requestDto.setStatus("De-Activate"); + requestWrapper.setRequest(requestDto); + FtmDetailResponseDto ftmDetailResponseDto = new FtmDetailResponseDto(); + responseWrapper.setResponse(ftmDetailResponseDto); + Mockito.when(ftpChipDetaillService.deactivateFtm(Mockito.any(), Mockito.any())).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.patch("/ftpchipdetail/1232").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsString(requestWrapper))).andExpect(status().isOk()); + } + + @Test + @WithMockUser(roles = {"FTM_PROVIDER"}) + public void getFtmCertificateDataTest() throws Exception { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + FtmCertificateDownloadResponseDto ftmCertificateDownloadResponseDto = new FtmCertificateDownloadResponseDto(); + responseWrapper.setResponse(ftmCertificateDownloadResponseDto); + Mockito.when(ftpChipDetaillService.getFtmCertificateData(Mockito.any())).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/ftpchipdetail/1234/certificate-data")).andExpect(MockMvcResultMatchers.status().isOk()); + } + + @Test + @WithMockUser(roles = {"PARTNER_ADMIN"}) + public void getPartnersFtmDetailsTest() throws Exception { + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + FtmChipFilterDto filterDto = new FtmChipFilterDto(); + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + + Mockito.when(ftpChipDetailServiceImpl.getPartnersFtmChipDetails(sortFieldName, sortType, pageNo, pageSize, filterDto)) + .thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/ftpchipdetail/v2") + .param("sortFieldName", sortFieldName) + .param("sortType", sortType) + .param("pageNo", String.valueOf(pageNo)) + .param("pageSize", String.valueOf(pageSize)) + .param("partnerId", "123") + .param("orgName", "ABC") + .param("ftmId", "ftm123") + .param("make", "test") + .param("model", "test") + .param("status", "approved")) + .andExpect(MockMvcResultMatchers.status().isOk()); + } + + @Test + @WithMockUser(roles = {"FTM_PROVIDER"}) + public void ftmChipDetailTest() throws Exception { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + List ftmChipDetailsDtoList = new ArrayList<>(); + FtmChipDetailsDto ftmChipDetailsDto = new FtmChipDetailsDto(); + ftmChipDetailsDtoList.add(ftmChipDetailsDto); + responseWrapper.setResponse(ftmChipDetailsDtoList); + Mockito.when(ftpChipDetaillService.ftmChipDetail()).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/ftpchipdetail")). + andExpect(MockMvcResultMatchers.status().isOk()); + } } diff --git a/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/controller/SecureBiometricInterfaceControllerTest.java b/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/controller/SecureBiometricInterfaceControllerTest.java index dff4e5d16d..5b5535a5d1 100644 --- a/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/controller/SecureBiometricInterfaceControllerTest.java +++ b/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/controller/SecureBiometricInterfaceControllerTest.java @@ -1,6 +1,7 @@ package io.mosip.pms.test.device.controller; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; 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.status; @@ -11,6 +12,13 @@ import java.util.ArrayList; import java.util.List; +import io.mosip.pms.common.request.dto.RequestWrapperV2; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.device.dto.SbiFilterDto; +import io.mosip.pms.device.response.dto.SbiSummaryDto; +import io.mosip.pms.partner.dto.DeviceDto; +import io.mosip.pms.device.response.dto.SbiDetailsResponseDto; +import io.mosip.pms.device.dto.SbiDetailsDto; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -25,6 +33,7 @@ import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.web.client.RestTemplate; import org.springframework.web.servlet.config.annotation.EnableWebMvc; @@ -38,6 +47,7 @@ import io.mosip.pms.common.dto.Pagination; import io.mosip.pms.common.dto.SearchFilter; import io.mosip.pms.common.dto.SearchSort; +import io.mosip.pms.common.dto.PageResponseV2Dto; import io.mosip.pms.common.request.dto.RequestWrapper; import io.mosip.pms.common.response.dto.ResponseWrapper; import io.mosip.pms.device.authdevice.service.SecureBiometricInterfaceService; @@ -46,6 +56,8 @@ import io.mosip.pms.device.request.dto.SecureBiometricInterfaceCreateDto; import io.mosip.pms.device.request.dto.SecureBiometricInterfaceStatusUpdateDto; import io.mosip.pms.device.request.dto.SecureBiometricInterfaceUpdateDto; +import io.mosip.pms.device.request.dto.DeactivateSbiRequestDto; +import io.mosip.pms.device.request.dto.DeviceDetailDto; import io.mosip.pms.device.response.dto.IdDto; import io.mosip.pms.device.response.dto.SbiSearchResponseDto; import io.mosip.pms.device.util.AuditUtil; @@ -348,6 +360,36 @@ public void searchMappedDeviceDetailsSecureBiometricTest() throws JsonProcessing .content(objectMapper.writeValueAsString(createrequest))).andExpect(status().isOk()); } + @Test + @WithMockUser(roles = {"DEVICE_PROVIDER"}) + public void getAllDevicesForSbiTest() throws Exception { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + List deviceDtoList = new ArrayList<>(); + DeviceDto deviceDto = new DeviceDto(); + deviceDtoList.add(deviceDto); + responseWrapper.setResponse(deviceDtoList); + Mockito.when(secureBiometricInterfaceService.getAllDevicesForSbi(Mockito.any())).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/securebiometricinterface/123/devices").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsString(responseWrapper))).andExpect(status().isOk()); + } + + @Test + @WithMockUser(roles = {"DEVICE_PROVIDER"}) + public void deactivateSbiTest() throws Exception { + RequestWrapperV2 requestWrapper = new RequestWrapperV2<>(); + DeactivateSbiRequestDto requestDto = new DeactivateSbiRequestDto(); + requestDto.setStatus("De-Activate"); + requestWrapper.setRequest(requestDto); + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + SbiDetailsResponseDto sbiDetailsResponseDto = new SbiDetailsResponseDto(); + responseWrapper.setResponse(sbiDetailsResponseDto); + + Mockito.when(secureBiometricInterfaceService.deactivateSbi(Mockito.anyString(), Mockito.any())).thenReturn(responseWrapper); + + mockMvc.perform(MockMvcRequestBuilders.patch("/securebiometricinterface/1234").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsString(requestWrapper))).andExpect(status().isOk()); + } + private RequestWrapper createMappingRequest() { RequestWrapper request = new RequestWrapper(); DeviceDetailSBIMappingDto mappingDto = new DeviceDetailSBIMappingDto(); @@ -356,4 +398,53 @@ private RequestWrapper createMappingRequest() { request.setRequest(mappingDto); return request; } + + @Test + @WithMockUser(roles = {"PARTNER_ADMIN"}) + public void getAllSbiDetailsTest() throws Exception { + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + SbiFilterDto filterDto = new SbiFilterDto(); + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + Mockito.when(secureBiometricInterfaceService.getAllSbiDetails(sortFieldName, sortType, pageNo, pageSize, filterDto)).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/securebiometricinterface") + .param("sortFieldName", sortFieldName) + .param("sortType", sortType) + .param("pageNo", String.valueOf(pageNo)) + .param("pageSize", String.valueOf(pageSize)) + .param("partnerId", "123") + .param("orgName", "ABC") + .param("sbiId", "sbi123") + .param("sbiVersion", "test") + .param("status", "approved") + .param("sbiExpiryStatus", "expired")) + .andExpect(MockMvcResultMatchers.status().isOk()); + } + + @Test + @WithMockUser(roles = {"DEVICE_PROVIDER"}) + public void addDeviceToSbiTest() throws Exception { + RequestWrapperV2 requestWrapper = new RequestWrapperV2<>(); + requestWrapper.setId("mosip.pms.add.device.to.sbi.id.post"); + requestWrapper.setVersion("1.0"); + DeviceDetailDto requestDto = new DeviceDetailDto(); + requestDto.setId(null); + requestDto.setDeviceTypeCode("Finger"); + requestDto.setDeviceSubTypeCode("Slap"); + requestDto.setMake("make"); + requestDto.setModel("model"); + requestDto.setDeviceProviderId("mosip123"); + requestWrapper.setRequest(requestDto); + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + responseWrapper.setId("mosip.pms.add.device.to.sbi.id.post"); + requestWrapper.setVersion("1.0"); + IdDto dto = new IdDto(); + dto.setId("12345"); + responseWrapper.setResponse(dto); + Mockito.when(secureBiometricInterfaceService.addDeviceToSbi(requestDto, "sbi123")).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.post("/securebiometricinterface/sbi123/devices").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsString(requestWrapper))).andExpect(status().isOk()); + } } diff --git a/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/service/impl/DeviceDetailServiceTest.java b/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/service/impl/DeviceDetailServiceTest.java index 8d4556ed14..2f83c2a7e1 100644 --- a/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/service/impl/DeviceDetailServiceTest.java +++ b/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/service/impl/DeviceDetailServiceTest.java @@ -1,56 +1,70 @@ package io.mosip.pms.test.device.service.impl; -import static org.junit.Assert.assertTrue; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.domain.PageImpl; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.web.client.RestTemplate; - import com.fasterxml.jackson.databind.ObjectMapper; - import io.mosip.kernel.core.http.RequestWrapper; - +import io.mosip.kernel.openid.bridge.model.AuthUserDetails; import io.mosip.pms.common.constant.Purpose; -import io.mosip.pms.common.dto.DeviceFilterValueDto; -import io.mosip.pms.common.dto.FilterData; -import io.mosip.pms.common.dto.FilterDto; -import io.mosip.pms.common.dto.Pagination; -import io.mosip.pms.common.dto.SearchFilter; -import io.mosip.pms.common.dto.SearchSort; +import io.mosip.pms.common.dto.*; +import io.mosip.pms.common.entity.DeviceDetailSBI; import io.mosip.pms.common.entity.Partner; import io.mosip.pms.common.exception.RequestException; import io.mosip.pms.common.helper.FilterHelper; import io.mosip.pms.common.helper.SearchHelper; +import io.mosip.pms.common.repository.DeviceDetailSbiRepository; import io.mosip.pms.common.repository.PartnerServiceRepository; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; import io.mosip.pms.common.util.PageUtils; import io.mosip.pms.common.validator.FilterColumnValidator; import io.mosip.pms.device.authdevice.entity.DeviceDetail; +import io.mosip.pms.device.authdevice.entity.DeviceDetailEntity; import io.mosip.pms.device.authdevice.entity.RegistrationDeviceSubType; +import io.mosip.pms.device.authdevice.entity.SecureBiometricInterface; import io.mosip.pms.device.authdevice.repository.DeviceDetailRepository; +import io.mosip.pms.device.authdevice.repository.DeviceDetailSummaryRepository; import io.mosip.pms.device.authdevice.repository.RegistrationDeviceSubTypeRepository; +import io.mosip.pms.device.authdevice.repository.SecureBiometricInterfaceRepository; import io.mosip.pms.device.authdevice.service.DeviceDetailService; import io.mosip.pms.device.authdevice.service.impl.DeviceDetailServiceImpl; +import io.mosip.pms.device.constant.DeviceConstant; +import io.mosip.pms.device.dto.DeviceDetailFilterDto; +import io.mosip.pms.device.dto.DeviceDetailSummaryDto; import io.mosip.pms.device.request.dto.DeviceDetailDto; import io.mosip.pms.device.request.dto.DeviceDetailUpdateDto; import io.mosip.pms.device.request.dto.DeviceSearchDto; +import io.mosip.pms.device.request.dto.DeactivateDeviceRequestDto; import io.mosip.pms.device.request.dto.UpdateDeviceDetailStatusDto; import io.mosip.pms.device.util.AuditUtil; +import io.mosip.pms.partner.request.dto.SbiAndDeviceMappingRequestDto; +import io.mosip.pms.partner.util.PartnerHelper; import io.mosip.pms.test.PartnerManagementServiceTest; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.*; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.client.RestTemplate; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; @RunWith(SpringRunner.class) @SpringBootTest(classes = { PartnerManagementServiceTest.class }) @@ -90,6 +104,24 @@ public class DeviceDetailServiceTest { @Mock PartnerServiceRepository partnerRepository; + @Mock + SecureBiometricInterfaceRepository secureBiometricInterfaceRepository; + + @Mock + DeviceDetailSbiRepository deviceDetailSbiRepository; + + @Mock + Authentication authentication; + + @Mock + SecurityContext securityContext; + + @Mock + DeviceDetailSummaryRepository deviceDetailSummaryRepository; + + @Mock + PartnerHelper partnerHelper; + private RequestWrapper deviceRequestDto; DeviceDetail deviceDetail = new DeviceDetail(); @@ -361,4 +393,304 @@ private UpdateDeviceDetailStatusDto statusUpdateRequest(String status) { request.setId("121"); return request; } + + @Test + public void deactivateDeviceTest() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateDeviceRequestDto requestDto = new DeactivateDeviceRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Device_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + DeviceDetail deviceDetail = new DeviceDetail(); + deviceDetail.setId("23456"); + deviceDetail.setDeviceProviderId("123"); + deviceDetail.setApprovalStatus("approved"); + deviceDetail.setIsActive(true); + when(deviceDetailRepository.findById(anyString())).thenReturn(Optional.of(deviceDetail)); + when(deviceDetailRepository.save(any())).thenReturn(deviceDetail); + deviceDetaillService.deactivateDevice("23456", requestDto); + } + + @Test + public void deactivateDeviceTestException() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateDeviceRequestDto requestDto = new DeactivateDeviceRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Device_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + + deviceDetaillService.deactivateDevice(null, requestDto); + } + + @Test + public void deactivateDeviceTestException1() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateDeviceRequestDto requestDto = new DeactivateDeviceRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + deviceDetaillService.deactivateDevice("23456", requestDto); + } + + @Test + public void deactivateDeviceTestException2() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateDeviceRequestDto requestDto = new DeactivateDeviceRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Device_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + + + DeviceDetail deviceDetail = new DeviceDetail(); + when(deviceDetailRepository.findById(anyString())).thenReturn(Optional.of(deviceDetail)); + deviceDetaillService.deactivateDevice("23456", requestDto); + } + + @Test + public void deactivateDeviceTestException3() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateDeviceRequestDto requestDto = new DeactivateDeviceRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Device_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + + + SecureBiometricInterface sbi = new SecureBiometricInterface(); + when(secureBiometricInterfaceRepository.findById(anyString())).thenReturn(Optional.of(sbi)); + deviceDetaillService.deactivateDevice("23456", requestDto); + } + + @Test + public void getAllDeviceDetailsStatusAscSorting() { + String sortFieldName = "status"; + String sortType = "ASC"; + Integer pageNo = 0; + Integer pageSize = 10; + DeviceDetailFilterDto filterDto = new DeviceDetailFilterDto(); + + Pageable pageable = PageRequest.of(pageNo, pageSize); + DeviceDetailEntity entity = new DeviceDetailEntity(); + entity.setDeviceId("123"); + entity.setStatus("approved"); + Page page = new PageImpl<>(List.of(entity), pageable, 1); + + when(deviceDetailSummaryRepository.getSummaryOfAllDeviceDetailsByStatusAsc(any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), eq(pageable))) + .thenReturn(page); + + ResponseWrapperV2> response = deviceDetaillService.getAllDeviceDetails(sortFieldName, sortType, pageNo, pageSize, filterDto); + + // Assert + assertNotNull(response); + } + + @Test + public void testGetAllDeviceDetails_withStatusDescSorting() { + String sortFieldName = "status"; + String sortType = "DESC"; + Integer pageNo = 0; + Integer pageSize = 10; + DeviceDetailFilterDto filterDto = new DeviceDetailFilterDto(); + + Pageable pageable = PageRequest.of(pageNo, pageSize); + DeviceDetailEntity entity = new DeviceDetailEntity(); + entity.setDeviceId("123"); + entity.setStatus("approved"); + Page page = new PageImpl<>(List.of(entity), pageable, 1); + + when(deviceDetailSummaryRepository.getSummaryOfAllDeviceDetailsByStatusDesc(any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), eq(pageable))) + .thenReturn(page); + + ResponseWrapperV2> response = deviceDetaillService.getAllDeviceDetails(sortFieldName, sortType, pageNo, pageSize, filterDto); + + // Assert + assertNotNull(response); + } + + @Test + public void testGetAllDeviceDetails_withOtherFieldSorting() { + String sortFieldName = "deviceId"; + String sortType = "ASC"; + Integer pageNo = 0; + Integer pageSize = 10; + DeviceDetailFilterDto filterDto = new DeviceDetailFilterDto(); + + Pageable pageable = PageRequest.of(pageNo, pageSize); + DeviceDetailEntity entity = new DeviceDetailEntity(); + entity.setDeviceId("123"); + entity.setStatus("approved"); + Page page = new PageImpl<>(List.of(entity), pageable, 1); + + when(deviceDetailSummaryRepository.getSummaryOfAllDeviceDetails(any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), eq(pageable))) + .thenReturn(page); + + Sort sort = mock(Sort.class); + when(partnerHelper.getSortingRequest(any(), eq(sortType))).thenReturn(sort); + + ResponseWrapperV2> response = deviceDetaillService.getAllDeviceDetails(sortFieldName, sortType, pageNo, pageSize, filterDto); + + // Assert + assertNotNull(response); + } + + @Test + public void approveOrRejectMappingDeviceToSbiTest() throws Exception { + SbiAndDeviceMappingRequestDto requestDto = new SbiAndDeviceMappingRequestDto(); + requestDto.setPartnerId("123"); + requestDto.setSbiId("112"); + requestDto.setStatus(DeviceConstant.APPROVED); + + DeviceDetailSBI deviceDetailSBI = new DeviceDetailSBI(); + when(deviceDetailSbiRepository.findByDeviceProviderIdAndSbiIdAndDeviceDetailId(anyString(), anyString(), anyString())).thenReturn(deviceDetailSBI); + + DeviceDetail deviceDetail = new DeviceDetail(); + deviceDetail.setDeviceProviderId("123"); + deviceDetail.setApprovalStatus("pending_approval"); + when(deviceDetailRepository.findByIdAndIsDeletedFalseOrIsDeletedIsNull(anyString())).thenReturn(deviceDetail); + + SecureBiometricInterface secureBiometricInterface = new SecureBiometricInterface(); + secureBiometricInterface.setSwCreateDateTime(LocalDateTime.now()); + secureBiometricInterface.setSwExpiryDateTime(LocalDateTime.now()); + secureBiometricInterface.setApprovalStatus("approved"); + secureBiometricInterface.setActive(true); + secureBiometricInterface.setCrDtimes(LocalDateTime.now()); + secureBiometricInterface.setSwVersion("1.0"); + secureBiometricInterface.setProviderId("123"); + when(secureBiometricInterfaceRepository.findById(anyString())).thenReturn(Optional.of(secureBiometricInterface)); + + when(deviceDetailRepository.findById(anyString())).thenReturn(Optional.of(deviceDetail)); + deviceDetailSBI.setProviderId("123"); + when(deviceDetailSbiRepository.save(any())).thenReturn(deviceDetailSBI); + + deviceDetaillService.approveOrRejectMappingDeviceToSbi("1234", requestDto); + } + + @Test + public void approveOrRejectMappingDeviceToSbiTest2() throws Exception { + SbiAndDeviceMappingRequestDto requestDto = new SbiAndDeviceMappingRequestDto(); + requestDto.setPartnerId("123"); + requestDto.setSbiId("112"); + requestDto.setStatus(DeviceConstant.APPROVED); + + DeviceDetailSBI deviceDetailSBI = new DeviceDetailSBI(); + when(deviceDetailSbiRepository.findByDeviceProviderIdAndSbiIdAndDeviceDetailId(anyString(), anyString(), anyString())).thenReturn(deviceDetailSBI); + + DeviceDetail deviceDetail = new DeviceDetail(); + deviceDetail.setDeviceProviderId("123"); + deviceDetail.setApprovalStatus("pending_approval"); + when(deviceDetailRepository.findByIdAndIsDeletedFalseOrIsDeletedIsNull(anyString())).thenReturn(deviceDetail); + + SecureBiometricInterface secureBiometricInterface = new SecureBiometricInterface(); + secureBiometricInterface.setSwCreateDateTime(LocalDateTime.now()); + secureBiometricInterface.setSwExpiryDateTime(LocalDateTime.now()); + secureBiometricInterface.setApprovalStatus("approved"); + secureBiometricInterface.setActive(true); + secureBiometricInterface.setCrDtimes(LocalDateTime.now()); + secureBiometricInterface.setSwVersion("1.0"); + secureBiometricInterface.setProviderId("123"); + when(secureBiometricInterfaceRepository.findById(anyString())).thenReturn(Optional.of(secureBiometricInterface)); + + when(deviceDetailRepository.findById(anyString())).thenReturn(Optional.of(deviceDetail)); + deviceDetailSBI.setProviderId("123"); + when(deviceDetailSbiRepository.save(any())).thenReturn(deviceDetailSBI); + + deviceDetaillService.approveOrRejectMappingDeviceToSbi("1234", requestDto); + } + + @Test + public void approveOrRejectMappingDeviceToSbiException() { + + SbiAndDeviceMappingRequestDto requestDto = new SbiAndDeviceMappingRequestDto(); + requestDto.setPartnerId("123"); + requestDto.setSbiId("112"); + requestDto.setStatus(DeviceConstant.APPROVED); + + deviceDetaillService.approveOrRejectMappingDeviceToSbi("1234", requestDto); + + SecureBiometricInterface secureBiometricInterface = new SecureBiometricInterface(); + secureBiometricInterface.setSwCreateDateTime(LocalDateTime.now()); + secureBiometricInterface.setSwExpiryDateTime(LocalDateTime.now()); + secureBiometricInterface.setApprovalStatus("approved"); + secureBiometricInterface.setActive(true); + secureBiometricInterface.setCrDtimes(LocalDateTime.now()); + secureBiometricInterface.setSwVersion("1.0"); + secureBiometricInterface.setProviderId("123"); + + deviceDetaillService.approveOrRejectMappingDeviceToSbi("1234", requestDto); + when(secureBiometricInterfaceRepository.findById(anyString())).thenReturn(Optional.of(secureBiometricInterface)); + DeviceDetail deviceDetail = new DeviceDetail(); + deviceDetail.setDeviceProviderId("123"); + + deviceDetaillService.approveOrRejectMappingDeviceToSbi("1234", requestDto); + when(deviceDetailRepository.findById(anyString())).thenReturn(Optional.of(deviceDetail)); + + when(deviceDetailSbiRepository.findByDeviceProviderIdAndSbiIdAndDeviceDetailId(anyString(), anyString(), anyString())).thenReturn(null); + deviceDetaillService.approveOrRejectMappingDeviceToSbi("1234", requestDto); + + DeviceDetailSBI deviceDetailSBI = new DeviceDetailSBI(); + deviceDetailSBI.setProviderId("123"); + when(deviceDetailSbiRepository.findByDeviceProviderIdAndSbiIdAndDeviceDetailId(anyString(), anyString(), anyString())).thenReturn(deviceDetailSBI); + + deviceDetaillService.approveOrRejectMappingDeviceToSbi("1234", requestDto); + } + + private io.mosip.kernel.openid.bridge.model.MosipUserDto getMosipUserDto() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = new io.mosip.kernel.openid.bridge.model.MosipUserDto(); + mosipUserDto.setUserId("123"); + mosipUserDto.setMail("abc@gmail.com"); + return mosipUserDto; + } } diff --git a/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/service/impl/FTPChipDetailServiceTest.java b/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/service/impl/FTPChipDetailServiceTest.java index f8728c6b8e..1145363fa9 100644 --- a/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/service/impl/FTPChipDetailServiceTest.java +++ b/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/service/impl/FTPChipDetailServiceTest.java @@ -7,20 +7,36 @@ import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.Method; import java.security.cert.Certificate; import java.security.cert.CertificateFactory; import java.sql.Timestamp; import java.time.LocalDateTime; import java.util.*; +import io.mosip.kernel.openid.bridge.model.AuthUserDetails; import io.mosip.pms.common.constant.EventType; import io.mosip.pms.common.dto.Type; +import io.mosip.pms.common.exception.ApiAccessibleException; import io.mosip.pms.common.helper.WebSubPublisher; import io.mosip.pms.common.request.dto.ErrorResponse; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.device.authdevice.entity.DeviceDetail; +import io.mosip.pms.device.authdevice.entity.FtmDetailSummaryEntity; +import io.mosip.pms.device.authdevice.entity.SecureBiometricInterface; +import io.mosip.pms.device.authdevice.repository.FtmDetailsSummaryRepository; +import io.mosip.pms.device.dto.FtmChipFilterDto; +import io.mosip.pms.device.response.dto.FtmDetailResponseDto; +import io.mosip.pms.device.response.dto.FtmDetailSummaryDto; import io.mosip.pms.device.response.dto.FtpCertDownloadResponeDto; +import io.mosip.pms.device.response.dto.FtpCertificateResponseDto; import io.mosip.pms.partner.dto.DataShareDto; import io.mosip.pms.partner.dto.DataShareResponseDto; import io.mosip.pms.partner.exception.PartnerServiceException; +import io.mosip.pms.partner.response.dto.FtmCertificateDownloadResponseDto; +import io.mosip.pms.partner.response.dto.OriginalCertDownloadResponseDto; +import io.mosip.pms.partner.util.PartnerHelper; +import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -33,8 +49,14 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.env.Environment; +import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.http.MediaType; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.web.client.RestTemplate; @@ -43,6 +65,7 @@ import io.mosip.kernel.core.http.RequestWrapper; import io.mosip.pms.common.constant.Purpose; +import io.mosip.pms.common.dto.PageResponseV2Dto; import io.mosip.pms.common.dto.Pagination; import io.mosip.pms.common.dto.SearchFilter; import io.mosip.pms.common.dto.SearchSort; @@ -57,6 +80,7 @@ import io.mosip.pms.device.authdevice.service.impl.FTPChipDetailServiceImpl; import io.mosip.pms.device.constant.FoundationalTrustProviderErrorMessages; import io.mosip.pms.device.request.dto.DeviceSearchDto; +import io.mosip.pms.device.request.dto.DeactivateFtmRequestDto; import io.mosip.pms.device.request.dto.FtpChipCertDownloadRequestDto; import io.mosip.pms.device.request.dto.FtpChipCertificateRequestDto; import io.mosip.pms.device.request.dto.FtpChipDetailDto; @@ -74,6 +98,9 @@ public class FTPChipDetailServiceTest { @Mock SearchHelper searchHelper; + + @Mock + PartnerHelper partnerHelper; @Mock PartnerServiceRepository partnerServiceRepository; @@ -83,10 +110,17 @@ public class FTPChipDetailServiceTest { @Mock FTPChipDetailRepository ftpChipDetailRepository; + + @Mock + PartnerServiceRepository partnerRepository; + + @Mock + FtmDetailsSummaryRepository ftmDetailsSummaryRepository; + @Mock private Environment environment; - @Autowired + @Mock private ObjectMapper objectMapper; @Autowired @@ -104,6 +138,12 @@ public class FTPChipDetailServiceTest { @Mock private AuditUtil audit; + + @Mock + Authentication authentication; + + @Mock + SecurityContext securityContext; private RequestWrapper deviceRequestDto; Partner partner=new Partner(); @@ -142,8 +182,8 @@ public void setup() { deviceSearchDto.setPagination(pagination); deviceSearchDto.setSort(searchDtos1); - - + + } @Test @@ -669,30 +709,14 @@ public void testUploadCertificate3() throws IOException { verify(partnerServiceRepository).findByIdAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue((String) any()); } - @Test (expected = RequestException.class) + @Test (expected = PartnerServiceException.class) public void testUploadCertificate4() throws IOException { doNothing().when(auditUtil) .auditRequest((String) any(), (String) any(), (String) any(), (String) any(), (String) any(), (String) any()); - when(environment.getProperty((String) any())).thenReturn("Property"); - FTPChipDetail ftpChipDetail = mock(FTPChipDetail.class); - when(ftpChipDetail.getFtpChipDetailId()).thenReturn("ChipId"); - when(ftpChipDetail.getFtpProviderId()).thenReturn("ProviderId"); - doNothing().when(ftpChipDetail).setActive(anyBoolean()); - doNothing().when(ftpChipDetail).setApprovalStatus((String) any()); - doNothing().when(ftpChipDetail).setCertificateAlias((String) any()); - doNothing().when(ftpChipDetail).setCrBy((String) any()); - doNothing().when(ftpChipDetail).setCrDtimes((LocalDateTime) any()); - doNothing().when(ftpChipDetail).setDelDtimes((LocalDateTime) any()); - doNothing().when(ftpChipDetail).setDeleted(anyBoolean()); - doNothing().when(ftpChipDetail).setFtpChipDetailId((String) any()); - doNothing().when(ftpChipDetail).setFtpProviderId((String) any()); - doNothing().when(ftpChipDetail).setMake((String) any()); - doNothing().when(ftpChipDetail).setModel((String) any()); - doNothing().when(ftpChipDetail).setPartnerOrganizationName((String) any()); - doNothing().when(ftpChipDetail).setUpdBy((String) any()); - doNothing().when(ftpChipDetail).setUpdDtimes((LocalDateTime) any()); + when(environment.getProperty(any())).thenReturn("Property"); + FTPChipDetail ftpChipDetail = new FTPChipDetail(); ftpChipDetail.setActive(true); - ftpChipDetail.setApprovalStatus("Approval Status"); + ftpChipDetail.setApprovalStatus("approved"); ftpChipDetail.setCertificateAlias("Certificate Alias"); ftpChipDetail.setCrBy("Cr By"); ftpChipDetail.setCrDtimes(LocalDateTime.of(1, 1, 1, 1, 1)); @@ -705,8 +729,7 @@ public void testUploadCertificate4() throws IOException { ftpChipDetail.setPartnerOrganizationName("Partner Organization Name"); ftpChipDetail.setUpdBy("Upd By"); ftpChipDetail.setUpdDtimes(LocalDateTime.of(1, 1, 1, 1, 1)); - Optional ofResult = Optional.of(ftpChipDetail); - when(ftpChipDetailRepository.findById((String) any())).thenReturn(ofResult); + when(ftpChipDetailRepository.findById((String) any())).thenReturn(Optional.of(ftpChipDetail)); Partner partner = new Partner(); partner.setAdditionalInfo("Additional Info"); @@ -733,12 +756,23 @@ public void testUploadCertificate4() throws IOException { partner.setUserId("UserId"); when(partnerServiceRepository.findByIdAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue((String) any())) .thenReturn(partner); - when(restUtil.postApi((String) any(), (List) any(), (String) any(), (String) any(), (MediaType) any(), - (Object) any(), (Class) any())) - .thenThrow(new RequestException("An error occurred", "An error occurred")); + Map mockedResponse = new HashMap<>(); + mockedResponse.put("status", "success"); + mockedResponse.put("response", "Certificate uploaded successfully"); + when(restUtil.postApi( any(), any(),any(), any(), any(), + any(), any())) + .thenReturn(mockedResponse); + String mockedJsonString = "{\"certificateId\":\"12345\"}"; + + FtpCertificateResponseDto mockedResponseObject = new FtpCertificateResponseDto(); + mockedResponseObject.setCertificateId("12345"); + + when(objectMapper.writeValueAsString(any())).thenReturn(mockedJsonString); + when(objectMapper.readValue(anyString(), eq(FtpCertificateResponseDto.class))) + .thenReturn(mockedResponseObject); ftpChipDetailService.uploadCertificate(new FtpChipCertificateRequestDto("ProviderId", "ChipId", true, "Certificate Data", "Organization Name", "Partner Domain")); - verify(environment).getProperty((String) any()); + verify(environment).getProperty(any()); verify(ftpChipDetailRepository).findById((String) any()); verify(ftpChipDetail).getFtpChipDetailId(); verify(ftpChipDetail).getFtpProviderId(); @@ -761,6 +795,256 @@ public void testUploadCertificate4() throws IOException { (Object) any(), (Class) any()); } + @Test (expected = RequestException.class) + public void testUploadCertificate_InvalidFtmChipStatus() throws IOException { + doNothing().when(auditUtil) + .auditRequest((String) any(), (String) any(), (String) any(), (String) any(), (String) any(), (String) any()); + when(environment.getProperty(any())).thenReturn("Property"); + FTPChipDetail ftpChipDetail = new FTPChipDetail(); + ftpChipDetail.setActive(true); + ftpChipDetail.setApprovalStatus("approved inactive"); + ftpChipDetail.setCertificateAlias("Certificate Alias"); + ftpChipDetail.setCrBy("Cr By"); + ftpChipDetail.setCrDtimes(LocalDateTime.of(1, 1, 1, 1, 1)); + ftpChipDetail.setDelDtimes(LocalDateTime.of(1, 1, 1, 1, 1)); + ftpChipDetail.setDeleted(false); + ftpChipDetail.setFtpChipDetailId("ChipId"); + ftpChipDetail.setFtpProviderId("ProviderId"); + ftpChipDetail.setMake("Make"); + ftpChipDetail.setModel("Model"); + ftpChipDetail.setPartnerOrganizationName("Partner Organization Name"); + ftpChipDetail.setUpdBy("Upd By"); + ftpChipDetail.setUpdDtimes(LocalDateTime.of(1, 1, 1, 1, 1)); + when(ftpChipDetailRepository.findById((String) any())).thenReturn(Optional.of(ftpChipDetail)); + + Partner partner = new Partner(); + partner.setAdditionalInfo("Additional Info"); + partner.setAddress("abc"); + partner.setApprovalStatus("Approval Status"); + partner.setCertificateAlias("Certificate Alias"); + partner.setContactNo("9087654321"); + partner.setCrBy("Cr By"); + partner.setCrDtimes(mock(Timestamp.class)); + partner.setDelDtimes(mock(Timestamp.class)); + partner.setEmailId("emailId"); + partner.setId("Id"); + partner.setIsActive(true); + partner.setIsDeleted(false); + partner.setLangCode("eng"); + partner.setLogoUrl("https://pms.net/partner"); + partner.setName("Name"); + partner.setPartnerPolicies(new ArrayList<>()); + partner.setPartnerPolicyRequests(new ArrayList<>()); + partner.setPartnerTypeCode("Partner Type Code"); + partner.setPolicyGroupId("PolicyGroupId"); + partner.setUpdBy("Upd By"); + partner.setUpdDtimes(mock(Timestamp.class)); + partner.setUserId("UserId"); + when(partnerServiceRepository.findByIdAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue((String) any())) + .thenReturn(partner); + Map mockedResponse = new HashMap<>(); + mockedResponse.put("status", "success"); + mockedResponse.put("response", "Certificate uploaded successfully"); + when(restUtil.postApi( any(), any(),any(), any(), any(), + any(), any())) + .thenReturn(mockedResponse); + String mockedJsonString = "{\"certificateId\":\"12345\"}"; + + FtpCertificateResponseDto mockedResponseObject = new FtpCertificateResponseDto(); + mockedResponseObject.setCertificateId("12345"); + + when(objectMapper.writeValueAsString(any())).thenReturn(mockedJsonString); + when(objectMapper.readValue(anyString(), eq(FtpCertificateResponseDto.class))) + .thenReturn(mockedResponseObject); + ftpChipDetailService.uploadCertificate(new FtpChipCertificateRequestDto("ProviderId", "ChipId", true, "Certificate Data", + "Organization Name", "Partner Domain")); + } + + @Test (expected = RequestException.class) + public void testUploadCertificate_FtmChipDeactivated() throws IOException { + doNothing().when(auditUtil) + .auditRequest((String) any(), (String) any(), (String) any(), (String) any(), (String) any(), (String) any()); + when(environment.getProperty(any())).thenReturn("Property"); + FTPChipDetail ftpChipDetail = new FTPChipDetail(); + ftpChipDetail.setActive(false); + ftpChipDetail.setApprovalStatus("approved"); + ftpChipDetail.setCertificateAlias("Certificate Alias"); + ftpChipDetail.setCrBy("Cr By"); + ftpChipDetail.setCrDtimes(LocalDateTime.of(1, 1, 1, 1, 1)); + ftpChipDetail.setDelDtimes(LocalDateTime.of(1, 1, 1, 1, 1)); + ftpChipDetail.setDeleted(false); + ftpChipDetail.setFtpChipDetailId("ChipId"); + ftpChipDetail.setFtpProviderId("ProviderId"); + ftpChipDetail.setMake("Make"); + ftpChipDetail.setModel("Model"); + ftpChipDetail.setPartnerOrganizationName("Partner Organization Name"); + ftpChipDetail.setUpdBy("Upd By"); + ftpChipDetail.setUpdDtimes(LocalDateTime.of(1, 1, 1, 1, 1)); + when(ftpChipDetailRepository.findById((String) any())).thenReturn(Optional.of(ftpChipDetail)); + + Partner partner = new Partner(); + partner.setAdditionalInfo("Additional Info"); + partner.setAddress("abc"); + partner.setApprovalStatus("Approval Status"); + partner.setCertificateAlias("Certificate Alias"); + partner.setContactNo("9087654321"); + partner.setCrBy("Cr By"); + partner.setCrDtimes(mock(Timestamp.class)); + partner.setDelDtimes(mock(Timestamp.class)); + partner.setEmailId("emailId"); + partner.setId("Id"); + partner.setIsActive(true); + partner.setIsDeleted(false); + partner.setLangCode("eng"); + partner.setLogoUrl("https://pms.net/partner"); + partner.setName("Name"); + partner.setPartnerPolicies(new ArrayList<>()); + partner.setPartnerPolicyRequests(new ArrayList<>()); + partner.setPartnerTypeCode("Partner Type Code"); + partner.setPolicyGroupId("PolicyGroupId"); + partner.setUpdBy("Upd By"); + partner.setUpdDtimes(mock(Timestamp.class)); + partner.setUserId("UserId"); + when(partnerServiceRepository.findByIdAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue((String) any())) + .thenReturn(partner); + Map mockedResponse = new HashMap<>(); + mockedResponse.put("status", "success"); + mockedResponse.put("response", "Certificate uploaded successfully"); + when(restUtil.postApi( any(), any(),any(), any(), any(), + any(), any())) + .thenReturn(mockedResponse); + String mockedJsonString = "{\"certificateId\":\"12345\"}"; + + FtpCertificateResponseDto mockedResponseObject = new FtpCertificateResponseDto(); + mockedResponseObject.setCertificateId("12345"); + + when(objectMapper.writeValueAsString(any())).thenReturn(mockedJsonString); + when(objectMapper.readValue(anyString(), eq(FtpCertificateResponseDto.class))) + .thenReturn(mockedResponseObject); + ftpChipDetailService.uploadCertificate(new FtpChipCertificateRequestDto("ProviderId", "ChipId", true, "Certificate Data", + "Organization Name", "Partner Domain")); + } + + @Test (expected = ApiAccessibleException.class) + public void testUploadCertificate_ApiNullResponse() throws IOException { + doNothing().when(auditUtil) + .auditRequest((String) any(), (String) any(), (String) any(), (String) any(), (String) any(), (String) any()); + when(environment.getProperty(any())).thenReturn("Property"); + FTPChipDetail ftpChipDetail = new FTPChipDetail(); + ftpChipDetail.setActive(true); + ftpChipDetail.setApprovalStatus("approved"); + ftpChipDetail.setCertificateAlias("Certificate Alias"); + ftpChipDetail.setCrBy("Cr By"); + ftpChipDetail.setCrDtimes(LocalDateTime.of(1, 1, 1, 1, 1)); + ftpChipDetail.setDelDtimes(LocalDateTime.of(1, 1, 1, 1, 1)); + ftpChipDetail.setDeleted(false); + ftpChipDetail.setFtpChipDetailId("ChipId"); + ftpChipDetail.setFtpProviderId("ProviderId"); + ftpChipDetail.setMake("Make"); + ftpChipDetail.setModel("Model"); + ftpChipDetail.setPartnerOrganizationName("Partner Organization Name"); + ftpChipDetail.setUpdBy("Upd By"); + ftpChipDetail.setUpdDtimes(LocalDateTime.of(1, 1, 1, 1, 1)); + when(ftpChipDetailRepository.findById((String) any())).thenReturn(Optional.of(ftpChipDetail)); + + Partner partner = new Partner(); + partner.setAdditionalInfo("Additional Info"); + partner.setAddress("abc"); + partner.setApprovalStatus("Approval Status"); + partner.setCertificateAlias("Certificate Alias"); + partner.setContactNo("9087654321"); + partner.setCrBy("Cr By"); + partner.setCrDtimes(mock(Timestamp.class)); + partner.setDelDtimes(mock(Timestamp.class)); + partner.setEmailId("emailId"); + partner.setId("Id"); + partner.setIsActive(true); + partner.setIsDeleted(false); + partner.setLangCode("eng"); + partner.setLogoUrl("https://pms.net/partner"); + partner.setName("Name"); + partner.setPartnerPolicies(new ArrayList<>()); + partner.setPartnerPolicyRequests(new ArrayList<>()); + partner.setPartnerTypeCode("Partner Type Code"); + partner.setPolicyGroupId("PolicyGroupId"); + partner.setUpdBy("Upd By"); + partner.setUpdDtimes(mock(Timestamp.class)); + partner.setUserId("UserId"); + when(partnerServiceRepository.findByIdAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue((String) any())) + .thenReturn(partner); + when(restUtil.postApi( any(), any(),any(), any(), any(), + any(), any())) + .thenReturn(null); + + ftpChipDetailService.uploadCertificate(new FtpChipCertificateRequestDto("ProviderId", "ChipId", true, "Certificate Data", + "Organization Name", "Partner Domain")); + } + + @Test (expected = ApiAccessibleException.class) + public void testUploadCertificate_ApiErrorResponse() throws IOException { + doNothing().when(auditUtil) + .auditRequest((String) any(), (String) any(), (String) any(), (String) any(), (String) any(), (String) any()); + when(environment.getProperty(any())).thenReturn("Property"); + FTPChipDetail ftpChipDetail = new FTPChipDetail(); + ftpChipDetail.setActive(true); + ftpChipDetail.setApprovalStatus("approved"); + ftpChipDetail.setCertificateAlias("Certificate Alias"); + ftpChipDetail.setCrBy("Cr By"); + ftpChipDetail.setCrDtimes(LocalDateTime.of(1, 1, 1, 1, 1)); + ftpChipDetail.setDelDtimes(LocalDateTime.of(1, 1, 1, 1, 1)); + ftpChipDetail.setDeleted(false); + ftpChipDetail.setFtpChipDetailId("ChipId"); + ftpChipDetail.setFtpProviderId("ProviderId"); + ftpChipDetail.setMake("Make"); + ftpChipDetail.setModel("Model"); + ftpChipDetail.setPartnerOrganizationName("Partner Organization Name"); + ftpChipDetail.setUpdBy("Upd By"); + ftpChipDetail.setUpdDtimes(LocalDateTime.of(1, 1, 1, 1, 1)); + when(ftpChipDetailRepository.findById((String) any())).thenReturn(Optional.of(ftpChipDetail)); + + Partner partner = new Partner(); + partner.setAdditionalInfo("Additional Info"); + partner.setAddress("abc"); + partner.setApprovalStatus("Approval Status"); + partner.setCertificateAlias("Certificate Alias"); + partner.setContactNo("9087654321"); + partner.setCrBy("Cr By"); + partner.setCrDtimes(mock(Timestamp.class)); + partner.setDelDtimes(mock(Timestamp.class)); + partner.setEmailId("emailId"); + partner.setId("Id"); + partner.setIsActive(true); + partner.setIsDeleted(false); + partner.setLangCode("eng"); + partner.setLogoUrl("https://pms.net/partner"); + partner.setName("Name"); + partner.setPartnerPolicies(new ArrayList<>()); + partner.setPartnerPolicyRequests(new ArrayList<>()); + partner.setPartnerTypeCode("Partner Type Code"); + partner.setPolicyGroupId("PolicyGroupId"); + partner.setUpdBy("Upd By"); + partner.setUpdDtimes(mock(Timestamp.class)); + partner.setUserId("UserId"); + when(partnerServiceRepository.findByIdAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue((String) any())) + .thenReturn(partner); + + Map uploadApiResponse = new HashMap<>(); + List> certServiceErrorList = new ArrayList<>(); + + Map error = new HashMap<>(); + error.put("errorCode", "MOCK_ERROR_CODE"); + error.put("message", "Mock error message"); + certServiceErrorList.add(error); + + uploadApiResponse.put("errors", certServiceErrorList); + when(restUtil.postApi( any(), any(),any(), any(), any(), + any(), any())) + .thenReturn(uploadApiResponse); + + ftpChipDetailService.uploadCertificate(new FtpChipCertificateRequestDto("ProviderId", "ChipId", true, "Certificate Data", + "Organization Name", "Partner Domain")); + } + @Test (expected = RequestException.class) public void testGetCertificate() throws IOException { doNothing().when(auditUtil) @@ -994,4 +1278,476 @@ public void testNotify2() { ReflectionTestUtils.invokeMethod(fTPChipDetailServiceImpl,"notify","Cert Data", "Partner Domain"); verify(webSubPublisher).notify((EventType) any(), (Map) any(), (Type) any()); } + + private io.mosip.kernel.openid.bridge.model.MosipUserDto getMosipUserDto() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = new io.mosip.kernel.openid.bridge.model.MosipUserDto(); + mosipUserDto.setUserId("123"); + mosipUserDto.setMail("abc@gmail.com"); + return mosipUserDto; + } + + @Test + public void deactivateFtmTest() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("FTM_Provider") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateFtmRequestDto requestDto = new DeactivateFtmRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("FTM_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + FTPChipDetail ftpChipDetail = new FTPChipDetail(); + ftpChipDetail.setFtpChipDetailId("23456"); + ftpChipDetail.setFtpProviderId("123"); + ftpChipDetail.setApprovalStatus("approved"); + ftpChipDetail.setActive(true); + when(ftpChipDetailRepository.findById(anyString())).thenReturn(Optional.of(ftpChipDetail)); + when(ftpChipDetailRepository.save(any())).thenReturn(ftpChipDetail); + ResponseWrapperV2 response = ftpChipDetailService.deactivateFtm("23456", requestDto); + Assert.assertNotNull(response); + Assert.assertNotNull(response.getResponse()); + } + + @Test + public void deactivateFtm_FtmNotApprovedTest() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("FTM_Provider") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateFtmRequestDto requestDto = new DeactivateFtmRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("FTM_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + FTPChipDetail ftpChipDetail = new FTPChipDetail(); + ftpChipDetail.setFtpChipDetailId("23456"); + ftpChipDetail.setFtpProviderId("123"); + ftpChipDetail.setApprovalStatus("rejected"); + ftpChipDetail.setActive(true); + when(ftpChipDetailRepository.findById(anyString())).thenReturn(Optional.of(ftpChipDetail)); + when(ftpChipDetailRepository.save(any())).thenReturn(ftpChipDetail); + ResponseWrapperV2 response = ftpChipDetailService.deactivateFtm("23456", requestDto); + Assert.assertNotNull(response); + Assert.assertNotNull(response.getErrors()); + } + + @Test + public void deactivateFtm_FtmDeactivatedTest() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("FTM_Provider") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateFtmRequestDto requestDto = new DeactivateFtmRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("FTM_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + FTPChipDetail ftpChipDetail = new FTPChipDetail(); + ftpChipDetail.setFtpChipDetailId("23456"); + ftpChipDetail.setFtpProviderId("123"); + ftpChipDetail.setApprovalStatus("approved"); + ftpChipDetail.setActive(false); + when(ftpChipDetailRepository.findById(anyString())).thenReturn(Optional.of(ftpChipDetail)); + when(ftpChipDetailRepository.save(any())).thenReturn(ftpChipDetail); + ResponseWrapperV2 response = ftpChipDetailService.deactivateFtm("23456", requestDto); + Assert.assertNotNull(response); + Assert.assertNotNull(response.getErrors()); + } + + @Test + public void deactivateFtm_InvalidStatusTest() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("FTM_Provider") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateFtmRequestDto requestDto = new DeactivateFtmRequestDto(); + requestDto.setStatus(""); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("FTM_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + FTPChipDetail ftpChipDetail = new FTPChipDetail(); + ftpChipDetail.setFtpChipDetailId("23456"); + ftpChipDetail.setFtpProviderId("123"); + ftpChipDetail.setApprovalStatus("approved"); + ftpChipDetail.setActive(true); + when(ftpChipDetailRepository.findById(anyString())).thenReturn(Optional.of(ftpChipDetail)); + when(ftpChipDetailRepository.save(any())).thenReturn(ftpChipDetail); + ResponseWrapperV2 response = ftpChipDetailService.deactivateFtm("23456", requestDto); + Assert.assertNotNull(response); + Assert.assertNotNull(response.getErrors()); + } + + @Test + public void deactivateFtmTestException() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateFtmRequestDto requestDto = new DeactivateFtmRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("FTM_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + + ftpChipDetailService.deactivateFtm(null, requestDto); + } + + @Test + public void deactivateFtmTestException1() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateFtmRequestDto requestDto = new DeactivateFtmRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + ftpChipDetailService.deactivateFtm("23456", requestDto); + } + + @Test + public void deactivateFtmTestException2() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateFtmRequestDto requestDto = new DeactivateFtmRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("FTM_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + + + FTPChipDetail ftpChipDetail = new FTPChipDetail(); + when(ftpChipDetailRepository.findById(anyString())).thenReturn(Optional.of(ftpChipDetail)); + ftpChipDetailService.deactivateFtm("23456", requestDto); + } + + @Test + public void getFtmCertificateData_Test() throws Exception{ + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("FTM_Provider") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("FTM_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + FTPChipDetail ftpChipDetail = new FTPChipDetail(); + ftpChipDetail.setFtpChipDetailId("23456"); + ftpChipDetail.setFtpProviderId("123"); + ftpChipDetail.setApprovalStatus("approved"); + ftpChipDetail.setActive(true); + ftpChipDetail.setCertificateAlias("xxxyyxxx"); + Mockito.when(ftpChipDetailRepository.findById(Mockito.anyString())).thenReturn(Optional.of(ftpChipDetail)); + when(partnerHelper.getCertificate(any(),any(),any())).thenReturn(new FtmCertificateDownloadResponseDto()); + OriginalCertDownloadResponseDto originalCertDownloadResponseDto = new OriginalCertDownloadResponseDto(); + originalCertDownloadResponseDto.setIsCaSignedCertificateExpired(false); + originalCertDownloadResponseDto.setIsMosipSignedCertificateExpired(false); + originalCertDownloadResponseDto.setCaSignedCertificateData("-----BEGIN CERTIFICATE-----\\nMIIF6TCCA9GgAwIBAgIBBDANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJJTjEL\\nMAkGA1UECAwCTUgxCzAJBgNVBAcMAlBOMQ4wDAYDVQQKDAVTVUJDQTEOMAwGA1UE\\nCwwFU1VCQ0ExDjAMBgNVBAMMBVNVQkNBMB4XDTI0MDUwOTA3MjYyNVoXDTI3MDIw\\nMzA3MjYyNVowUTELMAkGA1UEBhMCSU4xCzAJBgNVBAgMAk1IMQswCQYDVQQHDAJQ\\nTjEMMAoGA1UECgwDQUJDMQwwCgYDVQQLDANBQkMxDDAKBgNVBAMMA0FCQzCCAiIw\\nDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANRBkHiOTjCZRE4ZWTlkT6k79hBw\\n/8gBbyWrpSlzCCimtwlhEgX5e8AYfKHVAWoWk3YSXpaSOcS0iwlZh2AzRiVCv6U9\\ngJ/0EVK7BuU97beIyN68gs8E5xus5GmMq5VgmmF3eA60NXduCYe2xKBoRmNVpWrc\\nqlESiyPc+dWJ9v+nm8sSL4U4LAMJ4hBPcOLllFq3IEECPrixZH494672wvRJNH/Z\\nZpuoUKOHyN7azxtn+GGz7l2mxkPs8GMGRN7MwjJ+3z4Gft7M+35yl5q5pUpnveKb\\nvJEm3TkNY8R7lP1ttNv1QAshc5lk1+h1HAQ9AnFMZ8o1PEFCxLAYde+8XRjQiU0V\\nJscl59cnjui+g9aI46E8BrfskqICvHpuWwqdh0bgljIidD9yrDgbpMwPO4mRwXZt\\nsJyYtRzjefb4tz6EMNOL3dQUJhFEpDZorigG3h6/S6R7kkYsmkPkp1K6LmdPC/fA\\nOJLO2NOqEErF2uznC91PpUwsPiJVm9G2vSucw7Nbg0T9Gs9Kyp6gDjVZF3VPLVF4\\n4ufNzUy3ytJwR23mfKAdkFrkJnHGGUKpxiCokEB1fTVz8JTzjuB33YC8V8rTqAch\\nWsHBa2j6NAmxX1g5EqMXKOc3nu/9dk2q9HnDXJ57tA0xYIRnHRnuGAVEcZoXO2o5\\nZxzOp76yTJQykX6NAgMBAAGjgcUwgcIwCQYDVR0TBAIwADARBglghkgBhvhCAQEE\\nBAMCBaAwMwYJYIZIAYb4QgENBCYWJE9wZW5TU0wgR2VuZXJhdGVkIENsaWVudCBD\\nZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUxAYPEcGciAk/5FBXGmZ+z0u9uGIwHwYDVR0j\\nBBgwFoAUUvEvmGjR/9h5/+S8PkEHChVY8/gwDgYDVR0PAQH/BAQDAgXgMB0GA1Ud\\nJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDANBgkqhkiG9w0BAQsFAAOCAgEATadk\\nTQgQLO20uZOChKltcTWnI2VZMu6F4TCb/nQ/JKpZ+vD40qzrB5nHN3yy+nb1rUTE\\ngdW20jEups55xHT/vYIIUIuzydOLGAcfoRTjavNBgCxEyE8iiqhC2QdRylPm24AP\\nmVoGthTZpoJoV2K5nbVc5IqHbWRI3v5mEcvczQunWW0/HMpOJLZl2D3Ohptb7q5L\\nceaVuCUaWxGhqFEcWA7NpzZYTE36EBSvjlK277XrjFZltup7K0Z8l9qGw5A/HqEZ\\nUGq15Ak2mgDPW1pvJds9hWcnOpiObfbgtYIGKSKLz1DbQXuwoVneieTyU16ZKwNi\\ni/VpIn7CFL4ew0OXepVy7kbG8OUrHhpycsriQ8iq2RfmcZJv3iS4IsuUnrx05wXL\\nTidX7r8NPMY8BIzeUL54M97AG845KofGtZImKvbC8xxRnAgkW0ZX9+6NLc4ZsTQg\\nfFjnRzNkWZpgfMvtANYruZufUmfvH7vpwKofBGy/Mk91e4CXiGj/CAlBf1U8VKEc\\nbo7u4b2gWagmuAistlRdeLNvU7hKqNFjpf22wX5s96P+PawyS34PDeULKyo4a1ZK\\nhS6rI9mRNb+GmlAlWtOBdsBk8Trqhtj6qdO+QreDYXoN3UY5jikjM8JDuPArupXC\\nd+oxv9Lwk4FT0+WtHZAjMtnDf0l19aNdtImywaI=\\n-----END CERTIFICATE-----\\n"); + originalCertDownloadResponseDto.setMosipSignedCertificateData("-----BEGIN CERTIFICATE-----\\nMIIEizCCA3OgAwIBAgIIBkWQXN5LYV0wDQYJKoZIhvcNAQELBQAwdjELMAkGA1UE\\nBhMCSU4xCzAJBgNVBAgMAktBMRIwEAYDVQQHDAlCQU5HQUxPUkUxDTALBgNVBAoM\\nBElJVEIxGjAYBgNVBAsMEU1PU0lQLVRFQ0gtQ0VOVEVSMRswGQYDVQQDDBJ3d3cu\\nbW9zaXAuaW8gKFBNUykwHhcNMjQwOTE4MDgwNjU3WhcNMjUwOTE4MDgwNjU3WjBR\\nMQswCQYDVQQGEwJJTjELMAkGA1UECAwCTUgxCzAJBgNVBAcMAlBOMQwwCgYDVQQK\\nDANBQkMxDDAKBgNVBAsMA0FCQzEMMAoGA1UEAwwDQUJDMIICIjANBgkqhkiG9w0B\\nAQEFAAOCAg8AMIICCgKCAgEA1EGQeI5OMJlEThlZOWRPqTv2EHD/yAFvJaulKXMI\\nKKa3CWESBfl7wBh8odUBahaTdhJelpI5xLSLCVmHYDNGJUK/pT2An/QRUrsG5T3t\\nt4jI3ryCzwTnG6zkaYyrlWCaYXd4DrQ1d24Jh7bEoGhGY1WlatyqURKLI9z51Yn2\\n/6ebyxIvhTgsAwniEE9w4uWUWrcgQQI+uLFkfj3jrvbC9Ek0f9lmm6hQo4fI3trP\\nG2f4YbPuXabGQ+zwYwZE3szCMn7fPgZ+3sz7fnKXmrmlSme94pu8kSbdOQ1jxHuU\\n/W202/VACyFzmWTX6HUcBD0CcUxnyjU8QULEsBh177xdGNCJTRUmxyXn1yeO6L6D\\n1ojjoTwGt+ySogK8em5bCp2HRuCWMiJ0P3KsOBukzA87iZHBdm2wnJi1HON59vi3\\nPoQw04vd1BQmEUSkNmiuKAbeHr9LpHuSRiyaQ+SnUrouZ08L98A4ks7Y06oQSsXa\\n7OcL3U+lTCw+IlWb0ba9K5zDs1uDRP0az0rKnqAONVkXdU8tUXji583NTLfK0nBH\\nbeZ8oB2QWuQmccYZQqnGIKiQQHV9NXPwlPOO4HfdgLxXytOoByFawcFraPo0CbFf\\nWDkSoxco5zee7/12Tar0ecNcnnu0DTFghGcdGe4YBURxmhc7ajlnHM6nvrJMlDKR\\nfo0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUxAYPEcGciAk/\\n5FBXGmZ+z0u9uGIwDgYDVR0PAQH/BAQDAgKEMA0GCSqGSIb3DQEBCwUAA4IBAQAG\\n4TWJEafFhuAnXQXQQcF3bb3KvabpzDXCyaad7qNnojf2/e48SdLnURcHeiYFDr9a\\nrUdrrU6nBLE6NpTYD8WI+GHZ43SPeim0ACwz08+ZIXyvZt95DV1MCMKehd7YQKEQ\\n/AuvgRP/Z9FP2miZx+TH9GEU0KSAYLX8cMDNZhq3pzBihgHlzNeELDZnJ01kBWWJ\\nxVm1u9jwFDwOa11DGZ3zgEmNbh+3HhKf4zFurTFa88NaHsbvHXSadJMDBpuB42xR\\nAG6a2oUb0nNBg0QmxwAbo85JScNdWg6ncykQnROzGqpSICmIlL/E1Gl/Ti1hwrpP\\nu9J0ndrvDLo566k8h0Xr\\n-----END CERTIFICATE-----\\n"); + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + responseWrapper.setResponse(originalCertDownloadResponseDto); + ResponseWrapperV2 response = ftpChipDetailService.getFtmCertificateData("23456"); + Assert.assertNotNull(response); + Assert.assertNotNull(response.getResponse()); + } + + @Test + public void getFtmCertificateData_FtmDeactivatedTest() throws Exception{ + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("FTM_Provider") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("FTM_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + FTPChipDetail ftpChipDetail = new FTPChipDetail(); + ftpChipDetail.setFtpChipDetailId("23456"); + ftpChipDetail.setFtpProviderId("123"); + ftpChipDetail.setApprovalStatus("approved"); + ftpChipDetail.setActive(false); + ftpChipDetail.setCertificateAlias("xxxyyxxx"); + Mockito.when(ftpChipDetailRepository.findById(Mockito.anyString())).thenReturn(Optional.of(ftpChipDetail)); + OriginalCertDownloadResponseDto originalCertDownloadResponseDto = new OriginalCertDownloadResponseDto(); + originalCertDownloadResponseDto.setIsCaSignedCertificateExpired(false); + originalCertDownloadResponseDto.setIsMosipSignedCertificateExpired(false); + originalCertDownloadResponseDto.setCaSignedCertificateData("-----BEGIN CERTIFICATE-----\\nMIIF6TCCA9GgAwIBAgIBBDANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJJTjEL\\nMAkGA1UECAwCTUgxCzAJBgNVBAcMAlBOMQ4wDAYDVQQKDAVTVUJDQTEOMAwGA1UE\\nCwwFU1VCQ0ExDjAMBgNVBAMMBVNVQkNBMB4XDTI0MDUwOTA3MjYyNVoXDTI3MDIw\\nMzA3MjYyNVowUTELMAkGA1UEBhMCSU4xCzAJBgNVBAgMAk1IMQswCQYDVQQHDAJQ\\nTjEMMAoGA1UECgwDQUJDMQwwCgYDVQQLDANBQkMxDDAKBgNVBAMMA0FCQzCCAiIw\\nDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANRBkHiOTjCZRE4ZWTlkT6k79hBw\\n/8gBbyWrpSlzCCimtwlhEgX5e8AYfKHVAWoWk3YSXpaSOcS0iwlZh2AzRiVCv6U9\\ngJ/0EVK7BuU97beIyN68gs8E5xus5GmMq5VgmmF3eA60NXduCYe2xKBoRmNVpWrc\\nqlESiyPc+dWJ9v+nm8sSL4U4LAMJ4hBPcOLllFq3IEECPrixZH494672wvRJNH/Z\\nZpuoUKOHyN7azxtn+GGz7l2mxkPs8GMGRN7MwjJ+3z4Gft7M+35yl5q5pUpnveKb\\nvJEm3TkNY8R7lP1ttNv1QAshc5lk1+h1HAQ9AnFMZ8o1PEFCxLAYde+8XRjQiU0V\\nJscl59cnjui+g9aI46E8BrfskqICvHpuWwqdh0bgljIidD9yrDgbpMwPO4mRwXZt\\nsJyYtRzjefb4tz6EMNOL3dQUJhFEpDZorigG3h6/S6R7kkYsmkPkp1K6LmdPC/fA\\nOJLO2NOqEErF2uznC91PpUwsPiJVm9G2vSucw7Nbg0T9Gs9Kyp6gDjVZF3VPLVF4\\n4ufNzUy3ytJwR23mfKAdkFrkJnHGGUKpxiCokEB1fTVz8JTzjuB33YC8V8rTqAch\\nWsHBa2j6NAmxX1g5EqMXKOc3nu/9dk2q9HnDXJ57tA0xYIRnHRnuGAVEcZoXO2o5\\nZxzOp76yTJQykX6NAgMBAAGjgcUwgcIwCQYDVR0TBAIwADARBglghkgBhvhCAQEE\\nBAMCBaAwMwYJYIZIAYb4QgENBCYWJE9wZW5TU0wgR2VuZXJhdGVkIENsaWVudCBD\\nZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUxAYPEcGciAk/5FBXGmZ+z0u9uGIwHwYDVR0j\\nBBgwFoAUUvEvmGjR/9h5/+S8PkEHChVY8/gwDgYDVR0PAQH/BAQDAgXgMB0GA1Ud\\nJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDANBgkqhkiG9w0BAQsFAAOCAgEATadk\\nTQgQLO20uZOChKltcTWnI2VZMu6F4TCb/nQ/JKpZ+vD40qzrB5nHN3yy+nb1rUTE\\ngdW20jEups55xHT/vYIIUIuzydOLGAcfoRTjavNBgCxEyE8iiqhC2QdRylPm24AP\\nmVoGthTZpoJoV2K5nbVc5IqHbWRI3v5mEcvczQunWW0/HMpOJLZl2D3Ohptb7q5L\\nceaVuCUaWxGhqFEcWA7NpzZYTE36EBSvjlK277XrjFZltup7K0Z8l9qGw5A/HqEZ\\nUGq15Ak2mgDPW1pvJds9hWcnOpiObfbgtYIGKSKLz1DbQXuwoVneieTyU16ZKwNi\\ni/VpIn7CFL4ew0OXepVy7kbG8OUrHhpycsriQ8iq2RfmcZJv3iS4IsuUnrx05wXL\\nTidX7r8NPMY8BIzeUL54M97AG845KofGtZImKvbC8xxRnAgkW0ZX9+6NLc4ZsTQg\\nfFjnRzNkWZpgfMvtANYruZufUmfvH7vpwKofBGy/Mk91e4CXiGj/CAlBf1U8VKEc\\nbo7u4b2gWagmuAistlRdeLNvU7hKqNFjpf22wX5s96P+PawyS34PDeULKyo4a1ZK\\nhS6rI9mRNb+GmlAlWtOBdsBk8Trqhtj6qdO+QreDYXoN3UY5jikjM8JDuPArupXC\\nd+oxv9Lwk4FT0+WtHZAjMtnDf0l19aNdtImywaI=\\n-----END CERTIFICATE-----\\n"); + originalCertDownloadResponseDto.setMosipSignedCertificateData("-----BEGIN CERTIFICATE-----\\nMIIEizCCA3OgAwIBAgIIBkWQXN5LYV0wDQYJKoZIhvcNAQELBQAwdjELMAkGA1UE\\nBhMCSU4xCzAJBgNVBAgMAktBMRIwEAYDVQQHDAlCQU5HQUxPUkUxDTALBgNVBAoM\\nBElJVEIxGjAYBgNVBAsMEU1PU0lQLVRFQ0gtQ0VOVEVSMRswGQYDVQQDDBJ3d3cu\\nbW9zaXAuaW8gKFBNUykwHhcNMjQwOTE4MDgwNjU3WhcNMjUwOTE4MDgwNjU3WjBR\\nMQswCQYDVQQGEwJJTjELMAkGA1UECAwCTUgxCzAJBgNVBAcMAlBOMQwwCgYDVQQK\\nDANBQkMxDDAKBgNVBAsMA0FCQzEMMAoGA1UEAwwDQUJDMIICIjANBgkqhkiG9w0B\\nAQEFAAOCAg8AMIICCgKCAgEA1EGQeI5OMJlEThlZOWRPqTv2EHD/yAFvJaulKXMI\\nKKa3CWESBfl7wBh8odUBahaTdhJelpI5xLSLCVmHYDNGJUK/pT2An/QRUrsG5T3t\\nt4jI3ryCzwTnG6zkaYyrlWCaYXd4DrQ1d24Jh7bEoGhGY1WlatyqURKLI9z51Yn2\\n/6ebyxIvhTgsAwniEE9w4uWUWrcgQQI+uLFkfj3jrvbC9Ek0f9lmm6hQo4fI3trP\\nG2f4YbPuXabGQ+zwYwZE3szCMn7fPgZ+3sz7fnKXmrmlSme94pu8kSbdOQ1jxHuU\\n/W202/VACyFzmWTX6HUcBD0CcUxnyjU8QULEsBh177xdGNCJTRUmxyXn1yeO6L6D\\n1ojjoTwGt+ySogK8em5bCp2HRuCWMiJ0P3KsOBukzA87iZHBdm2wnJi1HON59vi3\\nPoQw04vd1BQmEUSkNmiuKAbeHr9LpHuSRiyaQ+SnUrouZ08L98A4ks7Y06oQSsXa\\n7OcL3U+lTCw+IlWb0ba9K5zDs1uDRP0az0rKnqAONVkXdU8tUXji583NTLfK0nBH\\nbeZ8oB2QWuQmccYZQqnGIKiQQHV9NXPwlPOO4HfdgLxXytOoByFawcFraPo0CbFf\\nWDkSoxco5zee7/12Tar0ecNcnnu0DTFghGcdGe4YBURxmhc7ajlnHM6nvrJMlDKR\\nfo0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUxAYPEcGciAk/\\n5FBXGmZ+z0u9uGIwDgYDVR0PAQH/BAQDAgKEMA0GCSqGSIb3DQEBCwUAA4IBAQAG\\n4TWJEafFhuAnXQXQQcF3bb3KvabpzDXCyaad7qNnojf2/e48SdLnURcHeiYFDr9a\\nrUdrrU6nBLE6NpTYD8WI+GHZ43SPeim0ACwz08+ZIXyvZt95DV1MCMKehd7YQKEQ\\n/AuvgRP/Z9FP2miZx+TH9GEU0KSAYLX8cMDNZhq3pzBihgHlzNeELDZnJ01kBWWJ\\nxVm1u9jwFDwOa11DGZ3zgEmNbh+3HhKf4zFurTFa88NaHsbvHXSadJMDBpuB42xR\\nAG6a2oUb0nNBg0QmxwAbo85JScNdWg6ncykQnROzGqpSICmIlL/E1Gl/Ti1hwrpP\\nu9J0ndrvDLo566k8h0Xr\\n-----END CERTIFICATE-----\\n"); + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + responseWrapper.setResponse(originalCertDownloadResponseDto); + ResponseWrapperV2 response = ftpChipDetailService.getFtmCertificateData("23456"); + Assert.assertNotNull(response); + Assert.assertNotNull(response.getErrors()); + } + + @Test + public void getFtmCertificateData_InvalidFtmStatusTest() throws Exception{ + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("FTM_Provider") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("FTM_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + FTPChipDetail ftpChipDetail = new FTPChipDetail(); + ftpChipDetail.setFtpChipDetailId("23456"); + ftpChipDetail.setFtpProviderId("123"); + ftpChipDetail.setApprovalStatus("xxxxx"); + ftpChipDetail.setActive(false); + ftpChipDetail.setCertificateAlias("xxxyyxxx"); + Mockito.when(ftpChipDetailRepository.findById(Mockito.anyString())).thenReturn(Optional.of(ftpChipDetail)); + OriginalCertDownloadResponseDto originalCertDownloadResponseDto = new OriginalCertDownloadResponseDto(); + originalCertDownloadResponseDto.setIsCaSignedCertificateExpired(false); + originalCertDownloadResponseDto.setIsMosipSignedCertificateExpired(false); + originalCertDownloadResponseDto.setCaSignedCertificateData("-----BEGIN CERTIFICATE-----\\nMIIF6TCCA9GgAwIBAgIBBDANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJJTjEL\\nMAkGA1UECAwCTUgxCzAJBgNVBAcMAlBOMQ4wDAYDVQQKDAVTVUJDQTEOMAwGA1UE\\nCwwFU1VCQ0ExDjAMBgNVBAMMBVNVQkNBMB4XDTI0MDUwOTA3MjYyNVoXDTI3MDIw\\nMzA3MjYyNVowUTELMAkGA1UEBhMCSU4xCzAJBgNVBAgMAk1IMQswCQYDVQQHDAJQ\\nTjEMMAoGA1UECgwDQUJDMQwwCgYDVQQLDANBQkMxDDAKBgNVBAMMA0FCQzCCAiIw\\nDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANRBkHiOTjCZRE4ZWTlkT6k79hBw\\n/8gBbyWrpSlzCCimtwlhEgX5e8AYfKHVAWoWk3YSXpaSOcS0iwlZh2AzRiVCv6U9\\ngJ/0EVK7BuU97beIyN68gs8E5xus5GmMq5VgmmF3eA60NXduCYe2xKBoRmNVpWrc\\nqlESiyPc+dWJ9v+nm8sSL4U4LAMJ4hBPcOLllFq3IEECPrixZH494672wvRJNH/Z\\nZpuoUKOHyN7azxtn+GGz7l2mxkPs8GMGRN7MwjJ+3z4Gft7M+35yl5q5pUpnveKb\\nvJEm3TkNY8R7lP1ttNv1QAshc5lk1+h1HAQ9AnFMZ8o1PEFCxLAYde+8XRjQiU0V\\nJscl59cnjui+g9aI46E8BrfskqICvHpuWwqdh0bgljIidD9yrDgbpMwPO4mRwXZt\\nsJyYtRzjefb4tz6EMNOL3dQUJhFEpDZorigG3h6/S6R7kkYsmkPkp1K6LmdPC/fA\\nOJLO2NOqEErF2uznC91PpUwsPiJVm9G2vSucw7Nbg0T9Gs9Kyp6gDjVZF3VPLVF4\\n4ufNzUy3ytJwR23mfKAdkFrkJnHGGUKpxiCokEB1fTVz8JTzjuB33YC8V8rTqAch\\nWsHBa2j6NAmxX1g5EqMXKOc3nu/9dk2q9HnDXJ57tA0xYIRnHRnuGAVEcZoXO2o5\\nZxzOp76yTJQykX6NAgMBAAGjgcUwgcIwCQYDVR0TBAIwADARBglghkgBhvhCAQEE\\nBAMCBaAwMwYJYIZIAYb4QgENBCYWJE9wZW5TU0wgR2VuZXJhdGVkIENsaWVudCBD\\nZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUxAYPEcGciAk/5FBXGmZ+z0u9uGIwHwYDVR0j\\nBBgwFoAUUvEvmGjR/9h5/+S8PkEHChVY8/gwDgYDVR0PAQH/BAQDAgXgMB0GA1Ud\\nJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDANBgkqhkiG9w0BAQsFAAOCAgEATadk\\nTQgQLO20uZOChKltcTWnI2VZMu6F4TCb/nQ/JKpZ+vD40qzrB5nHN3yy+nb1rUTE\\ngdW20jEups55xHT/vYIIUIuzydOLGAcfoRTjavNBgCxEyE8iiqhC2QdRylPm24AP\\nmVoGthTZpoJoV2K5nbVc5IqHbWRI3v5mEcvczQunWW0/HMpOJLZl2D3Ohptb7q5L\\nceaVuCUaWxGhqFEcWA7NpzZYTE36EBSvjlK277XrjFZltup7K0Z8l9qGw5A/HqEZ\\nUGq15Ak2mgDPW1pvJds9hWcnOpiObfbgtYIGKSKLz1DbQXuwoVneieTyU16ZKwNi\\ni/VpIn7CFL4ew0OXepVy7kbG8OUrHhpycsriQ8iq2RfmcZJv3iS4IsuUnrx05wXL\\nTidX7r8NPMY8BIzeUL54M97AG845KofGtZImKvbC8xxRnAgkW0ZX9+6NLc4ZsTQg\\nfFjnRzNkWZpgfMvtANYruZufUmfvH7vpwKofBGy/Mk91e4CXiGj/CAlBf1U8VKEc\\nbo7u4b2gWagmuAistlRdeLNvU7hKqNFjpf22wX5s96P+PawyS34PDeULKyo4a1ZK\\nhS6rI9mRNb+GmlAlWtOBdsBk8Trqhtj6qdO+QreDYXoN3UY5jikjM8JDuPArupXC\\nd+oxv9Lwk4FT0+WtHZAjMtnDf0l19aNdtImywaI=\\n-----END CERTIFICATE-----\\n"); + originalCertDownloadResponseDto.setMosipSignedCertificateData("-----BEGIN CERTIFICATE-----\\nMIIEizCCA3OgAwIBAgIIBkWQXN5LYV0wDQYJKoZIhvcNAQELBQAwdjELMAkGA1UE\\nBhMCSU4xCzAJBgNVBAgMAktBMRIwEAYDVQQHDAlCQU5HQUxPUkUxDTALBgNVBAoM\\nBElJVEIxGjAYBgNVBAsMEU1PU0lQLVRFQ0gtQ0VOVEVSMRswGQYDVQQDDBJ3d3cu\\nbW9zaXAuaW8gKFBNUykwHhcNMjQwOTE4MDgwNjU3WhcNMjUwOTE4MDgwNjU3WjBR\\nMQswCQYDVQQGEwJJTjELMAkGA1UECAwCTUgxCzAJBgNVBAcMAlBOMQwwCgYDVQQK\\nDANBQkMxDDAKBgNVBAsMA0FCQzEMMAoGA1UEAwwDQUJDMIICIjANBgkqhkiG9w0B\\nAQEFAAOCAg8AMIICCgKCAgEA1EGQeI5OMJlEThlZOWRPqTv2EHD/yAFvJaulKXMI\\nKKa3CWESBfl7wBh8odUBahaTdhJelpI5xLSLCVmHYDNGJUK/pT2An/QRUrsG5T3t\\nt4jI3ryCzwTnG6zkaYyrlWCaYXd4DrQ1d24Jh7bEoGhGY1WlatyqURKLI9z51Yn2\\n/6ebyxIvhTgsAwniEE9w4uWUWrcgQQI+uLFkfj3jrvbC9Ek0f9lmm6hQo4fI3trP\\nG2f4YbPuXabGQ+zwYwZE3szCMn7fPgZ+3sz7fnKXmrmlSme94pu8kSbdOQ1jxHuU\\n/W202/VACyFzmWTX6HUcBD0CcUxnyjU8QULEsBh177xdGNCJTRUmxyXn1yeO6L6D\\n1ojjoTwGt+ySogK8em5bCp2HRuCWMiJ0P3KsOBukzA87iZHBdm2wnJi1HON59vi3\\nPoQw04vd1BQmEUSkNmiuKAbeHr9LpHuSRiyaQ+SnUrouZ08L98A4ks7Y06oQSsXa\\n7OcL3U+lTCw+IlWb0ba9K5zDs1uDRP0az0rKnqAONVkXdU8tUXji583NTLfK0nBH\\nbeZ8oB2QWuQmccYZQqnGIKiQQHV9NXPwlPOO4HfdgLxXytOoByFawcFraPo0CbFf\\nWDkSoxco5zee7/12Tar0ecNcnnu0DTFghGcdGe4YBURxmhc7ajlnHM6nvrJMlDKR\\nfo0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUxAYPEcGciAk/\\n5FBXGmZ+z0u9uGIwDgYDVR0PAQH/BAQDAgKEMA0GCSqGSIb3DQEBCwUAA4IBAQAG\\n4TWJEafFhuAnXQXQQcF3bb3KvabpzDXCyaad7qNnojf2/e48SdLnURcHeiYFDr9a\\nrUdrrU6nBLE6NpTYD8WI+GHZ43SPeim0ACwz08+ZIXyvZt95DV1MCMKehd7YQKEQ\\n/AuvgRP/Z9FP2miZx+TH9GEU0KSAYLX8cMDNZhq3pzBihgHlzNeELDZnJ01kBWWJ\\nxVm1u9jwFDwOa11DGZ3zgEmNbh+3HhKf4zFurTFa88NaHsbvHXSadJMDBpuB42xR\\nAG6a2oUb0nNBg0QmxwAbo85JScNdWg6ncykQnROzGqpSICmIlL/E1Gl/Ti1hwrpP\\nu9J0ndrvDLo566k8h0Xr\\n-----END CERTIFICATE-----\\n"); + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + responseWrapper.setResponse(originalCertDownloadResponseDto); + ResponseWrapperV2 response = ftpChipDetailService.getFtmCertificateData("23456"); + Assert.assertNotNull(response); + Assert.assertNotNull(response.getErrors()); + } + + @Test + public void getFtmCertificateData_userIdNotExistsTest() throws Exception{ + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + when(partnerRepository.findByUserId(anyString())).thenReturn(new ArrayList<>()); + FTPChipDetail ftpChipDetail = new FTPChipDetail(); + ftpChipDetail.setFtpChipDetailId("23456"); + ftpChipDetail.setFtpProviderId("123"); + ftpChipDetail.setApprovalStatus("rejected"); + ftpChipDetail.setActive(false); + ftpChipDetail.setCertificateAlias("xxxyyxxx"); + Mockito.when(ftpChipDetailRepository.findById(Mockito.anyString())).thenReturn(Optional.of(ftpChipDetail)); + + ResponseWrapperV2 response = ftpChipDetailService.getFtmCertificateData("23456"); + Assert.assertNotNull(response); + Assert.assertNotNull(response.getErrors()); + } + + @Test + public void getFtmCertificateData_Test2() throws Exception{ + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("FTM_Provider"); + partner.setName("abc"); + partner.setIsActive(false); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + FTPChipDetail ftpChipDetail = new FTPChipDetail(); + ftpChipDetail.setFtpChipDetailId("23456"); + ftpChipDetail.setFtpProviderId("123"); + ftpChipDetail.setApprovalStatus("approved"); + ftpChipDetail.setActive(true); + ftpChipDetail.setCertificateAlias("xxxyyxxx"); + Mockito.when(ftpChipDetailRepository.findById(Mockito.anyString())).thenReturn(Optional.of(ftpChipDetail)); + + ftpChipDetailService.getFtmCertificateData("23456"); + } + + @Test + public void getPartnersFtmChipDetailsTest() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + FtmChipFilterDto filterDto = new FtmChipFilterDto(); + filterDto.setPartnerId("abc"); + filterDto.setMake("make"); + filterDto.setOrgName("ABC"); + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + Page page = null; + when(ftmDetailsSummaryRepository.getSummaryOfPartnersFtmDetails(anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), any())).thenReturn(page); + fTPChipDetailServiceImpl.getPartnersFtmChipDetails(sortFieldName, sortType, pageNo, pageSize, filterDto); + } + + @Test + public void getPartnersFtmChipDetailsTestException() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + Page page = null; + when(ftmDetailsSummaryRepository.getSummaryOfPartnersFtmDetails(anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), any())).thenReturn(page); + fTPChipDetailServiceImpl.getPartnersFtmChipDetails(sortFieldName, sortType, pageNo, pageSize, null); + } + + @Test + public void ftmChipDetailTest() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("FTM_Provider"); + partner.setApprovalStatus("approved"); + partner.setIsActive(true); + partner.setCertificateAlias("abs"); + partnerList.add(partner); + when(partnerRepository.findByUserId(any())).thenReturn(partnerList); + when(partnerRepository.findById(any())).thenReturn(Optional.of(partner)); + + List ftpChipDetailList = new ArrayList<>(); + FTPChipDetail ftpChipDetail = new FTPChipDetail(); + ftpChipDetail.setFtpChipDetailId("xxx"); + ftpChipDetail.setFtpProviderId("123"); + ftpChipDetail.setMake("make"); + ftpChipDetail.setModel("model"); + ftpChipDetail.setApprovalStatus("approved"); + ftpChipDetail.setActive(true); + ftpChipDetail.setCrDtimes(LocalDateTime.now()); + ftpChipDetail.setCertificateAlias(""); + ftpChipDetailList.add(ftpChipDetail); + when(ftpChipDetailRepository.findByProviderId(anyString())).thenReturn(ftpChipDetailList); + fTPChipDetailServiceImpl.ftmChipDetail(); + } + + @Test + public void ftmChipDetailExceptionTest() throws Exception { + fTPChipDetailServiceImpl.ftmChipDetail(); + } } diff --git a/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/service/impl/SBIServiceTest.java b/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/service/impl/SBIServiceTest.java index 3ded87e845..0c05aa5f5c 100644 --- a/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/service/impl/SBIServiceTest.java +++ b/partner/partner-management-service/src/test/java/io/mosip/pms/test/device/service/impl/SBIServiceTest.java @@ -1,11 +1,33 @@ package io.mosip.pms.test.device.service.impl; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; +import java.util.Collections; +import java.util.Collection; +import java.util.Map; +import java.util.HashMap; + +import io.mosip.kernel.openid.bridge.model.AuthUserDetails; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.device.authdevice.entity.SbiSummaryEntity; +import io.mosip.pms.device.authdevice.repository.SbiSummaryRepository; +import io.mosip.pms.device.dto.SbiFilterDto; +import io.mosip.pms.device.response.dto.SbiDetailsResponseDto; +import io.mosip.pms.device.response.dto.SbiSummaryDto; +import io.mosip.pms.partner.dto.DeviceDto; +import io.mosip.pms.partner.util.PartnerHelper; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -15,8 +37,18 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.data.domain.Pageable; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; import org.springframework.web.client.RestTemplate; import com.fasterxml.jackson.databind.ObjectMapper; @@ -30,6 +62,7 @@ import io.mosip.pms.common.dto.Pagination; import io.mosip.pms.common.dto.SearchFilter; import io.mosip.pms.common.dto.SearchSort; +import io.mosip.pms.common.dto.PageResponseV2Dto; import io.mosip.pms.common.entity.DeviceDetailSBI; import io.mosip.pms.common.entity.DeviceDetailSBIPK; import io.mosip.pms.common.entity.Partner; @@ -41,17 +74,20 @@ import io.mosip.pms.common.util.PageUtils; import io.mosip.pms.common.validator.FilterColumnValidator; import io.mosip.pms.device.authdevice.entity.DeviceDetail; +import io.mosip.pms.device.authdevice.entity.RegistrationDeviceSubType; import io.mosip.pms.device.authdevice.entity.SecureBiometricInterface; import io.mosip.pms.device.authdevice.entity.SecureBiometricInterfaceHistory; import io.mosip.pms.device.authdevice.repository.DeviceDetailRepository; import io.mosip.pms.device.authdevice.repository.SecureBiometricInterfaceHistoryRepository; import io.mosip.pms.device.authdevice.repository.SecureBiometricInterfaceRepository; -import io.mosip.pms.device.authdevice.service.SecureBiometricInterfaceService; +import io.mosip.pms.device.authdevice.repository.RegistrationDeviceSubTypeRepository; import io.mosip.pms.device.authdevice.service.impl.SecureBiometricInterfaceServiceImpl; import io.mosip.pms.device.constant.DeviceDetailExceptionsConstant; import io.mosip.pms.device.constant.SecureBiometricInterfaceConstant; import io.mosip.pms.device.request.dto.DeviceDetailSBIMappingDto; import io.mosip.pms.device.request.dto.DeviceSearchDto; +import io.mosip.pms.device.request.dto.DeactivateSbiRequestDto; +import io.mosip.pms.device.request.dto.DeviceDetailDto; import io.mosip.pms.device.request.dto.SecureBiometricInterfaceCreateDto; import io.mosip.pms.device.request.dto.SecureBiometricInterfaceStatusUpdateDto; import io.mosip.pms.device.request.dto.SecureBiometricInterfaceUpdateDto; @@ -63,44 +99,59 @@ public class SBIServiceTest { @Autowired private ObjectMapper objectMapper; - + @Mock PageUtils pageUtils; - + @Mock SearchHelper searchHelper; - + @Mock FilterColumnValidator filterColumnValidator; - + @Mock FilterHelper filterHelper; - + @InjectMocks - SecureBiometricInterfaceService secureBiometricInterfaceService=new SecureBiometricInterfaceServiceImpl(); - + SecureBiometricInterfaceServiceImpl secureBiometricInterfaceService; + @Autowired @Qualifier("selfTokenRestTemplate") private RestTemplate restTemplate; - + @Mock DeviceDetailRepository deviceDetailRepository; - + @Mock AuditUtil auditUtil; - + @Mock SecureBiometricInterfaceRepository sbiRepository; - + @Mock SecureBiometricInterfaceHistoryRepository sbiHistoryRepository; - + @Mock PartnerServiceRepository partnerRepository; - + @Mock DeviceDetailSbiRepository deviceDetailSbiRepository; - + + @Mock + RegistrationDeviceSubTypeRepository registrationDeviceSubTypeRepository; + + @Mock + SbiSummaryRepository sbiSummaryRepository; + + @Mock + Authentication authentication; + + @Mock + SecurityContext securityContext; + + @Mock + PartnerHelper partnerHelper; + private RequestWrapper deviceRequestDto; DeviceDetail deviceDetail=new DeviceDetail(); SecureBiometricInterfaceCreateDto sbicreatedto = new SecureBiometricInterfaceCreateDto(); @@ -121,7 +172,7 @@ public void setup() { secureBiometricInterfaceHistory.setSwBinaryHAsh("swb".getBytes()); secureBiometricInterfaceHistory.setEffectDateTime(LocalDateTime.now()); secureBiometricInterfaceHistory.setSwCreateDateTime(LocalDateTime.now()); - secureBiometricInterfaceHistory.setSwExpiryDateTime(LocalDateTime.now()); + secureBiometricInterfaceHistory.setSwExpiryDateTime(LocalDateTime.now().plusYears(1)); secureBiometricInterfaceHistory.setActive(true); secureBiometricInterfaceHistory.setCrBy("110005"); secureBiometricInterfaceHistory.setCrDtimes(LocalDateTime.now()); @@ -132,7 +183,7 @@ public void setup() { secureBiometricInterface.setApprovalStatus("pending"); secureBiometricInterface.setSwBinaryHash("swb".getBytes()); secureBiometricInterface.setSwCreateDateTime(LocalDateTime.now()); - secureBiometricInterface.setSwExpiryDateTime(LocalDateTime.now()); + secureBiometricInterface.setSwExpiryDateTime(LocalDateTime.now().plusYears(1)); secureBiometricInterface.setActive(true); secureBiometricInterface.setCrBy("110005"); secureBiometricInterface.setCrDtimes(LocalDateTime.now()); @@ -143,7 +194,7 @@ public void setup() { sbidto.setSwBinaryHash("swb"); sbidto.setSwCreateDateTime(LocalDateTime.now()); - sbidto.setSwExpiryDateTime(LocalDateTime.now()); + sbidto.setSwExpiryDateTime(LocalDateTime.now().plusYears(1)); sbidto.setIsActive(true); sbidto.setSwVersion("v1"); sbidto.setId("1234"); @@ -182,10 +233,10 @@ public void setup() { deviceSearchDto.setPagination(pagination); deviceSearchDto.setPurpose(Purpose.REGISTRATION.toString()); deviceSearchDto.setSort(searchDtos1); - + sbicreatedto.setSwBinaryHash("swb"); sbicreatedto.setSwCreateDateTime(LocalDateTime.now()); - sbicreatedto.setSwExpiryDateTime(LocalDateTime.now()); + sbicreatedto.setSwExpiryDateTime(LocalDateTime.now().plusYears(1)); sbicreatedto.setProviderId("1234"); sbicreatedto.setSwVersion("v1"); deviceDetail.setApprovalStatus("pending"); @@ -205,14 +256,14 @@ public void setup() { Partner validPartner = new Partner(); validPartner.setId("1234"); validPartner.setName("partner"); - Mockito.doNothing().when(auditUtil).auditRequest(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()); - Mockito.doNothing().when(auditUtil).auditRequest(Mockito.any(), Mockito.any(), Mockito.any()); + doNothing().when(auditUtil).auditRequest(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()); + doNothing().when(auditUtil).auditRequest(Mockito.any(), Mockito.any(), Mockito.any()); Mockito.doReturn(secureBiometricInterface).when(sbiRepository).findByIdAndIsDeletedFalseOrIsDeletedIsNull(Mockito.anyString()); Mockito.doReturn(secureBiometricInterface).when(sbiRepository).save(Mockito.any()); Mockito.doReturn(secureBiometricInterfaceHistory).when(sbiHistoryRepository).save(Mockito.any()); Mockito.doReturn(validPartner).when(partnerRepository).findByIdAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(Mockito.anyString()); } - + @Test public void sbiSearchTest() throws Exception{ objectMapper.writeValueAsString(deviceRequestDto); @@ -221,7 +272,7 @@ public void sbiSearchTest() throws Exception{ Mockito.doReturn(new PageImpl<>(Arrays.asList(secureBiometricInterface))).when(searchHelper).search(Mockito.any(),Mockito.any(), Mockito.any()); secureBiometricInterfaceService.searchSecureBiometricInterface(SecureBiometricInterface.class, deviceSearchDto); } - + @Test public void sbiSearchTest1() throws Exception{ objectMapper.writeValueAsString(deviceRequestDto); @@ -230,18 +281,17 @@ public void sbiSearchTest1() throws Exception{ Mockito.doReturn(new PageImpl<>(Arrays.asList(secureBiometricInterface))).when(searchHelper).search(Mockito.any(),Mockito.any(), Mockito.any()); secureBiometricInterfaceService.searchSecureBiometricInterface(SecureBiometricInterface.class, deviceSearchDto); } - + @Test public void createSBITest() throws Exception { - assertTrue(secureBiometricInterfaceService.createSecureBiometricInterface(sbicreatedto).getId().equals("1234")); Mockito.when(sbiRepository.findByProviderIdAndSwVersion(Mockito.any(),Mockito.any())).thenReturn(List.of(secureBiometricInterface)); try { secureBiometricInterfaceService.createSecureBiometricInterface(sbicreatedto); }catch (RequestException e) { - assertTrue(e.getErrors().get(0).getErrorCode().equals(SecureBiometricInterfaceConstant.SBI_RECORDS_EXISTS.getErrorCode())); + assertTrue(e.getErrors().get(0).getErrorCode().equals(SecureBiometricInterfaceConstant.EXPIRYDATE_SHOULD_NOT_BE_GREATER_THAN_TEN_YEARS.getErrorCode())); } } - + @Test public void createSBITest01() throws Exception { sbicreatedto.setSwCreateDateTime(LocalDateTime.now()); @@ -249,10 +299,10 @@ public void createSBITest01() throws Exception { try { secureBiometricInterfaceService.createSecureBiometricInterface(sbicreatedto); }catch (RequestException e) { - assertTrue(e.getErrors().get(0).getErrorCode().equals(SecureBiometricInterfaceConstant.SWCREATEDDATE_SHOULD_BE_LESSTHAN_EXPIRYDATE.getErrorCode())); + assertTrue(e.getErrors().get(0).getErrorCode().equals(SecureBiometricInterfaceConstant.EXPIRYDATE_SHOULD_BE_GREATERTHAN_TODAYSDATE.getErrorCode())); } } - + @Test public void createSBITest02() throws Exception { sbicreatedto.setSwCreateDateTime(LocalDateTime.now().minusDays(4)); @@ -263,51 +313,47 @@ public void createSBITest02() throws Exception { assertTrue(e.getErrors().get(0).getErrorCode().equals(SecureBiometricInterfaceConstant.EXPIRYDATE_SHOULD_BE_GREATERTHAN_TODAYSDATE.getErrorCode())); } } - + @Test public void createSBITest03() throws Exception { Mockito.when(partnerRepository.findByIdAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(Mockito.anyString())).thenReturn(null); try { secureBiometricInterfaceService.createSecureBiometricInterface(sbicreatedto); }catch (RequestException e) { - assertTrue(e.getErrors().get(0).getErrorCode().equals(DeviceDetailExceptionsConstant.DEVICE_PROVIDER_NOT_FOUND.getErrorCode())); + assertTrue(e.getErrors().get(0).getErrorCode().equals(SecureBiometricInterfaceConstant.EXPIRYDATE_SHOULD_NOT_BE_GREATER_THAN_TEN_YEARS.getErrorCode())); } } @Test public void updateDeviceDetailTest() throws Exception { - assertTrue(secureBiometricInterfaceService.updateSecureBiometricInterface(sbidto).getId().equals("1234")); - SecureBiometricInterface sbiFromDb = secureBiometricInterface; - sbiFromDb.setId("789"); - Mockito.when(sbiRepository.findByProviderIdAndSwVersion(Mockito.any(),Mockito.any())).thenReturn(List.of(sbiFromDb)); try { secureBiometricInterfaceService.updateSecureBiometricInterface(sbidto); }catch (RequestException e) { - assertTrue(e.getErrors().get(0).getErrorCode().equals(SecureBiometricInterfaceConstant.SBI_RECORDS_EXISTS.getErrorCode())); - } + assertTrue(e.getErrors().get(0).getErrorCode().equals(SecureBiometricInterfaceConstant.EXPIRYDATE_SHOULD_NOT_BE_GREATER_THAN_TEN_YEARS.getErrorCode())); + } } - + @Test(expected=RequestException.class) public void updateDeviceDetailNotFoundTest() throws Exception { Mockito.doReturn(null).when(sbiRepository).findByIdAndIsDeletedFalseOrIsDeletedIsNull(Mockito.anyString()); secureBiometricInterfaceService.updateSecureBiometricInterface(sbidto); } - + @Test public void updateDeviceDetailStatusTest_Approve() { secureBiometricInterfaceService.updateSecureBiometricInterfaceStatus(statusUpdateRequest("Activate")); } - + @Test public void updateDeviceDetailStatusTest_Reject() { secureBiometricInterfaceService.updateSecureBiometricInterfaceStatus(statusUpdateRequest("De-activate")); } - + @Test(expected = RequestException.class) public void updateDeviceDetailStatusTest_Status_Exception() { secureBiometricInterfaceService.updateSecureBiometricInterfaceStatus(statusUpdateRequest("De-Activate")); } - + @Test(expected = RequestException.class) public void updateDeviceDetailStatusTest_DeviceDetail_Exception() { SecureBiometricInterfaceStatusUpdateDto request = statusUpdateRequest("De-Activate"); @@ -315,14 +361,14 @@ public void updateDeviceDetailStatusTest_DeviceDetail_Exception() { Mockito.doReturn(null).when(sbiRepository).findByIdAndIsDeletedFalseOrIsDeletedIsNull(Mockito.anyString()); secureBiometricInterfaceService.updateSecureBiometricInterfaceStatus(request); } - + private SecureBiometricInterfaceStatusUpdateDto statusUpdateRequest(String status) { SecureBiometricInterfaceStatusUpdateDto request = new SecureBiometricInterfaceStatusUpdateDto(); request.setApprovalStatus(status); request.setId("121"); return request; } - + @Test public void mapDeviceDetailAndSbiTest01() { DeviceDetailSBIMappingDto request = new DeviceDetailSBIMappingDto(); @@ -331,7 +377,7 @@ public void mapDeviceDetailAndSbiTest01() { Mockito.when(deviceDetailSbiRepository.findByDeviceDetailAndSbi(request.getDeviceDetailId(),request.getSbiId())).thenReturn(new DeviceDetailSBI()); assertTrue(secureBiometricInterfaceService.mapDeviceDetailAndSbi(request).equals("Mapping already exists")); } - + @Test public void mapDeviceDetailAndSbiTest02() { DeviceDetailSBIMappingDto request = new DeviceDetailSBIMappingDto(); @@ -345,7 +391,7 @@ public void mapDeviceDetailAndSbiTest02() { assertTrue(e.getErrors().get(0).getErrorCode().equals(DeviceDetailExceptionsConstant.DEVICE_DETAIL_NOT_FOUND.getErrorCode())); } } - + @Test public void mapDeviceDetailAndSbiTest03() { DeviceDetailSBIMappingDto request = new DeviceDetailSBIMappingDto(); @@ -360,7 +406,7 @@ public void mapDeviceDetailAndSbiTest03() { assertTrue(e.getErrors().get(0).getErrorCode().equals(SecureBiometricInterfaceConstant.SBI_NOT_FOUND.getErrorCode())); } } - + @Test public void mapDeviceDetailAndSbiTest04() { DeviceDetailSBIMappingDto request = new DeviceDetailSBIMappingDto(); @@ -377,7 +423,7 @@ public void mapDeviceDetailAndSbiTest04() { assertTrue(e.getErrors().get(0).getErrorCode().equals(SecureBiometricInterfaceConstant.DD_SBI_PROVIDER_NOT_MATCHING.getErrorCode())); } } - + @Test public void mapDeviceDetailAndSbiTest06() { DeviceDetailSBIMappingDto request = new DeviceDetailSBIMappingDto(); @@ -394,7 +440,7 @@ public void mapDeviceDetailAndSbiTest06() { assertTrue(e.getErrors().get(0).getErrorCode().equals(SecureBiometricInterfaceConstant.DD_SBI_PROVIDER_NOT_MATCHING.getErrorCode())); } } - + @Test public void mapDeviceDetailAndSbiTest05() { DeviceDetailSBIMappingDto request = new DeviceDetailSBIMappingDto(); @@ -414,7 +460,7 @@ public void mapDeviceDetailAndSbiTest05() { }catch(RequestException e) { assertTrue(e.getErrors().get(0).getErrorCode().equals(DeviceDetailExceptionsConstant.DEVICE_DETAIL_REJECTED.getErrorCode())); } - + deviceDetail.setIsActive(false); deviceDetail.setApprovalStatus(CommonConstant.PENDING_APPROVAL); Mockito.when(deviceDetailRepository.findByIdAndIsDeletedFalseOrIsDeletedIsNull(request.getDeviceDetailId())).thenReturn(deviceDetail); @@ -433,12 +479,12 @@ public void mapDeviceDetailAndSbiTest05() { assertTrue(e.getErrors().get(0).getErrorCode().equals(SecureBiometricInterfaceConstant.SBI_NOT_APPROVED.getErrorCode())); } } - + @Test public void deleteDeviceDetailAndSbiMappingTest01() { DeviceDetailSBIMappingDto request = new DeviceDetailSBIMappingDto(); request.setDeviceDetailId("deviceDetailId"); - request.setSbiId("sbiid"); + request.setSbiId("sbiid"); Mockito.when(deviceDetailSbiRepository.findByDeviceDetailAndSbi(request.getDeviceDetailId(),request.getSbiId())).thenReturn(null); try { secureBiometricInterfaceService.deleteDeviceDetailAndSbiMapping(request); @@ -446,7 +492,7 @@ public void deleteDeviceDetailAndSbiMappingTest01() { assertTrue(e.getErrors().get(0).getErrorCode().equals(SecureBiometricInterfaceConstant.DD_SBI_MAPPING_NOT_EXISTS.getErrorCode())); } } - + @Test public void deleteDeviceDetailAndSbiMappingTest02() { DeviceDetailSBIMappingDto request = new DeviceDetailSBIMappingDto(); @@ -454,13 +500,13 @@ public void deleteDeviceDetailAndSbiMappingTest02() { DeviceDetailSBIPK key = new DeviceDetailSBIPK(); key.setDeviceDetailId("deviceDetailId"); key.setSbiId("sbiid"); - validRecords.setId(key); + validRecords.setId(key); request.setDeviceDetailId("deviceDetailId"); - request.setSbiId("sbiid"); + request.setSbiId("sbiid"); Mockito.when(deviceDetailSbiRepository.findByDeviceDetailAndSbi(request.getDeviceDetailId(),request.getSbiId())).thenReturn(validRecords); - assertTrue(secureBiometricInterfaceService.deleteDeviceDetailAndSbiMapping(request).equals("Success")); + assertTrue(secureBiometricInterfaceService.deleteDeviceDetailAndSbiMapping(request).equals("Success")); } - + @Test public void searchMappedDeviceDetailsTest01() { DeviceSearchDto searchDto = new DeviceSearchDto(); @@ -480,9 +526,9 @@ public void searchMappedDeviceDetailsTest01() { validRecords.setId(key); Mockito.doReturn(new PageImpl<>(Arrays.asList(validRecords))).when(searchHelper).search(Mockito.any(), Mockito.any(),Mockito.anyString()); - secureBiometricInterfaceService.searchMappedDeviceDetails(DeviceDetailSBI.class, searchDto); + secureBiometricInterfaceService.searchMappedDeviceDetails(DeviceDetailSBI.class, searchDto); } - + @Test public void searchMappedDeviceDetailsTest02() { DeviceSearchDto searchDto = new DeviceSearchDto(); @@ -512,9 +558,9 @@ public void searchMappedDeviceDetailsTest02() { sbi.setProviderId("12345"); Mockito.when(deviceDetailRepository.findAll()).thenReturn(List.of(deviceDetail)); Mockito.when(sbiRepository.findAll()).thenReturn(List.of(sbi)); - secureBiometricInterfaceService.searchMappedDeviceDetails(DeviceDetailSBI.class, searchDto); + secureBiometricInterfaceService.searchMappedDeviceDetails(DeviceDetailSBI.class, searchDto); } - + @Test public void filterValuesTest() { Mockito.doReturn(true).when(filterColumnValidator).validate(Mockito.any(), Mockito.any(), Mockito.any()); @@ -530,4 +576,829 @@ public void filterValuesTest() { Mockito.when(filterHelper.filterValuesWithCode(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(filtersData); secureBiometricInterfaceService.filterValues(filterValueDto); } + + @Test + public void addDeviceToSbiTest() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeviceDetailDto requestDto = new DeviceDetailDto(); + requestDto.setId(null); + requestDto.setDeviceTypeCode("Finger"); + requestDto.setDeviceSubTypeCode("Slap"); + requestDto.setMake("make"); + requestDto.setModel("model"); + requestDto.setDeviceProviderId("123"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Device_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + + RegistrationDeviceSubType registrationDeviceSubType = new RegistrationDeviceSubType(); + registrationDeviceSubType.setCode("Slap"); + registrationDeviceSubType.setDeviceTypeCode("Finger"); + when(registrationDeviceSubTypeRepository.findByCodeAndTypeCodeAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(anyString(), anyString())). thenReturn(registrationDeviceSubType); + when(partnerRepository.findByIdAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(anyString())).thenReturn(partner); + when(deviceDetailRepository.findUniqueDeviceDetail(anyString(), anyString(), anyString(), anyString(), anyString())).thenReturn(null); + + DeviceDetail deviceDetail = new DeviceDetail(); + deviceDetail.setId("123456"); + deviceDetail.setDeviceProviderId("123"); + deviceDetail.setDeviceTypeCode("Finger"); + deviceDetail.setDeviceSubTypeCode("Slap"); + deviceDetail.setMake("make"); + deviceDetail.setModel("model"); + deviceDetail.setApprovalStatus("pending_approval"); + deviceDetail.setIsActive(false); + when(deviceDetailRepository.save(any())).thenReturn(deviceDetail); + when(deviceDetailSbiRepository.findByDeviceProviderIdAndSbiIdAndDeviceDetailId(anyString(), anyString(), anyString())).thenReturn(null); + + SecureBiometricInterface sbi = new SecureBiometricInterface(); + sbi.setActive(true); + sbi.setApprovalStatus("approved"); + sbi.setProviderId("123"); + sbi.setSwCreateDateTime(LocalDateTime.now()); + sbi.setSwExpiryDateTime(LocalDateTime.now().plusDays(1)); + when(sbiRepository.findById(anyString())).thenReturn(Optional.of(sbi)); + when(deviceDetailRepository.findById(anyString())).thenReturn(Optional.of(deviceDetail)); + + DeviceDetailSBI deviceDetailSBI = new DeviceDetailSBI(); + DeviceDetailSBIPK deviceDetailSBIPK = new DeviceDetailSBIPK(); + deviceDetailSBIPK.setSbiId("sbi123"); + deviceDetailSBIPK.setDeviceDetailId("123456"); + deviceDetailSBI.setId(deviceDetailSBIPK); + deviceDetailSBI.setPartnerName("abc"); + deviceDetailSBI.setProviderId("123"); + deviceDetailSBI.setIsActive(false); + when(deviceDetailSbiRepository.save(any())).thenReturn(deviceDetailSBI); + secureBiometricInterfaceService.addDeviceToSbi(requestDto, "sbi123"); + } + + @Test + public void addDeviceToSbiTest1() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeviceDetailDto requestDto = new DeviceDetailDto(); + requestDto.setId(null); + requestDto.setDeviceTypeCode("Finger"); + requestDto.setDeviceSubTypeCode("Slap"); + requestDto.setMake("make"); + requestDto.setModel("model"); + requestDto.setDeviceProviderId("123"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Device_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + + RegistrationDeviceSubType registrationDeviceSubType = new RegistrationDeviceSubType(); + registrationDeviceSubType.setCode("Slap"); + registrationDeviceSubType.setDeviceTypeCode("Finger"); + when(registrationDeviceSubTypeRepository.findByCodeAndTypeCodeAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(anyString(), anyString())). thenReturn(registrationDeviceSubType); + when(partnerRepository.findByIdAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(anyString())).thenReturn(partner); + + DeviceDetail deviceDetail = new DeviceDetail(); + deviceDetail.setId("123456"); + deviceDetail.setDeviceProviderId("123"); + deviceDetail.setDeviceTypeCode("Finger"); + deviceDetail.setDeviceSubTypeCode("Slap"); + deviceDetail.setMake("make"); + deviceDetail.setModel("model"); + deviceDetail.setApprovalStatus("pending_approval"); + deviceDetail.setIsActive(false); + when(deviceDetailRepository.findUniqueDeviceDetail(anyString(), anyString(), anyString(), anyString(), anyString())).thenReturn(deviceDetail); + when(deviceDetailSbiRepository.findByDeviceProviderIdAndSbiIdAndDeviceDetailId(anyString(), anyString(), anyString())).thenReturn(null); + + SecureBiometricInterface sbi = new SecureBiometricInterface(); + sbi.setActive(true); + sbi.setApprovalStatus("approved"); + sbi.setProviderId("123"); + sbi.setSwCreateDateTime(LocalDateTime.now()); + sbi.setSwExpiryDateTime(LocalDateTime.now().plusDays(1)); + when(sbiRepository.findById(anyString())).thenReturn(Optional.of(sbi)); + when(deviceDetailRepository.findById(anyString())).thenReturn(Optional.of(deviceDetail)); + + DeviceDetailSBI deviceDetailSBI = new DeviceDetailSBI(); + DeviceDetailSBIPK deviceDetailSBIPK = new DeviceDetailSBIPK(); + deviceDetailSBIPK.setSbiId("sbi123"); + deviceDetailSBIPK.setDeviceDetailId("123456"); + deviceDetailSBI.setId(deviceDetailSBIPK); + deviceDetailSBI.setPartnerName("abc"); + deviceDetailSBI.setProviderId("123"); + deviceDetailSBI.setIsActive(false); + when(deviceDetailSbiRepository.save(any())).thenReturn(deviceDetailSBI); + secureBiometricInterfaceService.addDeviceToSbi(requestDto, "sbi123"); + } + + @Test + public void addDeviceToSbiExceptionTest() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeviceDetailDto requestDto = new DeviceDetailDto(); + requestDto.setId(null); + requestDto.setDeviceTypeCode("Finger"); + requestDto.setDeviceSubTypeCode("Slap"); + requestDto.setMake("make"); + requestDto.setModel("model"); + requestDto.setDeviceProviderId("123"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Device_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + + RegistrationDeviceSubType registrationDeviceSubType = new RegistrationDeviceSubType(); + registrationDeviceSubType.setCode("Slap"); + registrationDeviceSubType.setDeviceTypeCode("Finger"); + when(registrationDeviceSubTypeRepository.findByCodeAndTypeCodeAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(anyString(), anyString())). thenReturn(registrationDeviceSubType); + when(partnerRepository.findByIdAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(anyString())).thenReturn(partner); + when(deviceDetailRepository.findUniqueDeviceDetail(anyString(), anyString(), anyString(), anyString(), anyString())).thenReturn(null); + + DeviceDetail deviceDetail = new DeviceDetail(); + deviceDetail.setId("123456"); + deviceDetail.setDeviceProviderId("123"); + deviceDetail.setDeviceTypeCode("Finger"); + deviceDetail.setDeviceSubTypeCode("Slap"); + deviceDetail.setMake("make"); + deviceDetail.setModel("model"); + deviceDetail.setApprovalStatus("pending_approval"); + deviceDetail.setIsActive(false); + when(deviceDetailRepository.save(any())).thenReturn(deviceDetail); + + DeviceDetailSBI deviceDetailSBI = new DeviceDetailSBI(); + DeviceDetailSBIPK deviceDetailSBIPK = new DeviceDetailSBIPK(); + deviceDetailSBIPK.setSbiId("sbi123"); + deviceDetailSBIPK.setDeviceDetailId("123456"); + deviceDetailSBI.setId(deviceDetailSBIPK); + deviceDetailSBI.setPartnerName("abc"); + deviceDetailSBI.setProviderId("123"); + deviceDetailSBI.setIsActive(false); + when(deviceDetailSbiRepository.findByDeviceProviderIdAndSbiIdAndDeviceDetailId(anyString(), anyString(), anyString())).thenReturn(deviceDetailSBI); + secureBiometricInterfaceService.addDeviceToSbi(requestDto, "sbi123"); + } + + @Test + public void addDeviceToSbiExceptionTest2() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeviceDetailDto requestDto = new DeviceDetailDto(); + requestDto.setId(null); + requestDto.setDeviceTypeCode("Finger"); + requestDto.setDeviceSubTypeCode("Slap"); + requestDto.setMake("make"); + requestDto.setModel("model"); + requestDto.setDeviceProviderId("123"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Device_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + + RegistrationDeviceSubType registrationDeviceSubType = new RegistrationDeviceSubType(); + registrationDeviceSubType.setCode("Slap"); + registrationDeviceSubType.setDeviceTypeCode("Finger"); + when(registrationDeviceSubTypeRepository.findByCodeAndTypeCodeAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(anyString(), anyString())). thenReturn(registrationDeviceSubType); + when(partnerRepository.findByIdAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(anyString())).thenReturn(null); + secureBiometricInterfaceService.addDeviceToSbi(requestDto, "sbi123"); + + when(registrationDeviceSubTypeRepository.findByCodeAndTypeCodeAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(anyString(), anyString())). thenReturn(null); + secureBiometricInterfaceService.addDeviceToSbi(requestDto, "sbi123"); + } + + @Test + public void addDeviceToSbiExceptionTest3() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeviceDetailDto requestDto = new DeviceDetailDto(); + requestDto.setId(null); + requestDto.setDeviceTypeCode("Finger"); + requestDto.setDeviceSubTypeCode("Slap"); + requestDto.setMake("make"); + requestDto.setModel("model"); + requestDto.setDeviceProviderId("345"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Device_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + secureBiometricInterfaceService.addDeviceToSbi(requestDto, "sbi123"); + + partnerList = new ArrayList<>(); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + secureBiometricInterfaceService.addDeviceToSbi(requestDto, "sbi123"); + } + + @Test(expected = Exception.class) + public void addDeviceToSbiExceptionTest4() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeviceDetailDto requestDto = new DeviceDetailDto(); + requestDto.setId("123"); + requestDto.setDeviceTypeCode("Finger"); + requestDto.setDeviceSubTypeCode("Slap"); + requestDto.setMake("make"); + requestDto.setModel("model"); + requestDto.setDeviceProviderId("345"); + + Mockito.when(partnerRepository.findByUserId(Mockito.anyString())) + .thenThrow(new Exception("Simulated SQL exception") {}); + secureBiometricInterfaceService.addDeviceToSbi(requestDto, "sbi123"); + } + + @Test + public void deleteDeviceDetailTest() throws Exception { + String deviceDetailId = "12345"; + DeviceDetail deviceDetail = new DeviceDetail(); + when(deviceDetailRepository.findById(deviceDetailId)).thenReturn(Optional.of(deviceDetail)); + when(deviceDetailSbiRepository.findByDeviceDetailId(deviceDetailId)).thenReturn(Collections.emptyList()); + doNothing().when(deviceDetailRepository).deleteById(deviceDetailId); + + ReflectionTestUtils.invokeMethod(secureBiometricInterfaceService, "deleteDeviceDetail", deviceDetailId); + + verify(deviceDetailRepository).findById(deviceDetailId); + verify(deviceDetailSbiRepository).findByDeviceDetailId(deviceDetailId); + verify(deviceDetailRepository).deleteById(deviceDetailId); + } + + @Test + public void deactivateSbiTest() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("Device_Provider") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateSbiRequestDto requestDto = new DeactivateSbiRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Device_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + SecureBiometricInterface sbi = new SecureBiometricInterface(); + sbi.setId("12345"); + sbi.setActive(true); + sbi.setApprovalStatus("approved"); + sbi.setSwVersion("1.0.0"); + sbi.setProviderId("123"); + when(sbiRepository.findById(anyString())).thenReturn(Optional.of(sbi)); + List deviceDetailList = new ArrayList<>(); + DeviceDetail deviceDetail = new DeviceDetail(); + deviceDetail.setId("23456"); + deviceDetail.setDeviceProviderId("123"); + deviceDetail.setApprovalStatus("approved"); + deviceDetail.setIsActive(true); + deviceDetailList.add(deviceDetail); + when(deviceDetailRepository.findApprovedDevicesBySbiId(anyString())).thenReturn(deviceDetailList); + when(deviceDetailRepository.findPendingApprovalDevicesBySbiId(anyString())).thenReturn(deviceDetailList); + when(deviceDetailRepository.save(any())).thenReturn(deviceDetail); + when(sbiRepository.save(any())).thenReturn(sbi); + ResponseWrapperV2 response = secureBiometricInterfaceService.deactivateSbi("12345", requestDto); + + Assert.assertNotNull(response); + } + + @Test + public void deactivateSbiTest_InvalidSbiIdException() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateSbiRequestDto requestDto = new DeactivateSbiRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Device_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + ResponseWrapperV2 response = secureBiometricInterfaceService.deactivateSbi(null, requestDto); + + Assert.assertNotNull(response); + Assert.assertNotNull(response.getErrors()); + } + + @Test + public void deactivateSbiTest_InvalidStatusException() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateSbiRequestDto requestDto = new DeactivateSbiRequestDto(); + requestDto.setStatus("jkjkj"); + + ResponseWrapperV2 response = secureBiometricInterfaceService.deactivateSbi(null, requestDto); + + Assert.assertNotNull(response); + Assert.assertNotNull(response.getErrors()); + } + + @Test + public void deactivateSbiTest_Exception() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateSbiRequestDto requestDto = new DeactivateSbiRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Device_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + when(sbiRepository.findById(any())).thenReturn(Optional.of(new SecureBiometricInterface())); + ResponseWrapperV2 response = secureBiometricInterfaceService.deactivateSbi("123", requestDto); + + Assert.assertNotNull(response); + Assert.assertNotNull(response.getErrors()); + } + + @Test + public void deactivateSbiTest_UserIdNotExistsException() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateSbiRequestDto requestDto = new DeactivateSbiRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + ResponseWrapperV2 response = secureBiometricInterfaceService.deactivateSbi("23456", requestDto); + + Assert.assertNotNull(response); + Assert.assertNotNull(response.getErrors()); + } + + @Test + public void deactivateSbiTest_SbiNotApprovedException() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("Device_Provider") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateSbiRequestDto requestDto = new DeactivateSbiRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Device_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + SecureBiometricInterface sbi = new SecureBiometricInterface(); + sbi.setId("12345"); + sbi.setActive(true); + sbi.setApprovalStatus("rejected"); + sbi.setSwVersion("1.0.0"); + sbi.setProviderId("123"); + when(sbiRepository.findById(anyString())).thenReturn(Optional.of(sbi)); + ResponseWrapperV2 response = secureBiometricInterfaceService.deactivateSbi("12345", requestDto); + + Assert.assertNotNull(response); + Assert.assertNotNull(response.getErrors()); + } + + @Test + public void deactivateSbiTest_SbiAlreadyDeactivatedException() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("Device_Provider") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateSbiRequestDto requestDto = new DeactivateSbiRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Device_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + SecureBiometricInterface sbi = new SecureBiometricInterface(); + sbi.setId("12345"); + sbi.setActive(false); + sbi.setApprovalStatus("approved"); + sbi.setSwVersion("1.0.0"); + sbi.setProviderId("123"); + when(sbiRepository.findById(anyString())).thenReturn(Optional.of(sbi)); + ResponseWrapperV2 response = secureBiometricInterfaceService.deactivateSbi("12345", requestDto); + + Assert.assertNotNull(response); + Assert.assertNotNull(response.getErrors()); + } + + @Test + public void deactivateSbiTest_SbiNotExistsException() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("Device_Provider") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + DeactivateSbiRequestDto requestDto = new DeactivateSbiRequestDto(); + requestDto.setStatus("De-Activate"); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Device_Provider"); + partner.setName("abc"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + when(sbiRepository.findById(anyString())).thenReturn(Optional.empty()); + ResponseWrapperV2 response = secureBiometricInterfaceService.deactivateSbi("12345", requestDto); + + Assert.assertNotNull(response); + Assert.assertNotNull(response.getErrors()); + } + + @Test + public void getAllSbiDetailsTest() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + SbiFilterDto filterDto = new SbiFilterDto(); + filterDto.setPartnerId("mosip123"); + filterDto.setOrgName("abc"); + filterDto.setSbiVersion("1.0.0"); + List sbiSummaryEntities = new ArrayList<>(); + SbiSummaryEntity entity1 = new SbiSummaryEntity(); + entity1.setSbiId("1"); + sbiSummaryEntities.add(entity1); + + SbiSummaryEntity entity2 = new SbiSummaryEntity(); + entity2.setSbiId("2"); + sbiSummaryEntities.add(entity2); + + PageRequest pageRequest = PageRequest.of(0, 10); + + Page page = new PageImpl<>(sbiSummaryEntities, pageRequest, sbiSummaryEntities.size()); + + // Create and set the mock map + Map mockMap = new HashMap<>(); + mockMap.put("partnerId", "providerId"); + mockMap.put("orgName", "partnerOrgName"); + mockMap.put("partnerType", "p.partnerTypeCode"); + mockMap.put("sbiId", "id"); + mockMap.put("sbiVersion", "swVersion"); + mockMap.put("sbiCreatedDateTime", "swCreateDateTime"); + mockMap.put("sbiExpiryDateTime", "swExpiryDateTime"); + mockMap.put("status", "approvalStatus"); + mockMap.put("createdDateTime", "crDtimes"); + mockMap.put("sbiExpiryStatus", "sbiExpiryStatus"); + mockMap.put("countOfAssociatedDevices", "countOfAssociatedDevices"); + + Field field = PartnerHelper.class.getDeclaredField("sbiAliasToColumnMap"); + field.setAccessible(true); + field.set(partnerHelper, mockMap); + + when(partnerHelper.getSortingRequest(anyString(), anyString())).thenReturn(Sort.by(Sort.Order.asc("crDtimes"))); + when(sbiSummaryRepository.getSummaryOfSbiDetails(anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyList(), anyBoolean(), any())).thenReturn(page); + ResponseWrapperV2> response = secureBiometricInterfaceService.getAllSbiDetails(sortFieldName, sortType, pageNo, pageSize, filterDto); + + Assert.assertNotNull(response); + } + + @Test + public void getAllSbiDetailsExceptionTest() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + Page page = null; + when(sbiSummaryRepository.getSummaryOfSbiDetails(anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyList(), anyBoolean(), any())).thenReturn(page); + secureBiometricInterfaceService.getAllSbiDetails(sortFieldName, sortType, pageNo, pageSize, null); + } + + @Test + public void getAllDevicesForSbiTest() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + Partner partner = new Partner(); + partner.setId("providerId"); + partner.setPartnerTypeCode("Device_Provider"); + List partnerList = Collections.singletonList(partner); + when(partnerRepository.findByUserId(any())).thenReturn(partnerList); + + SecureBiometricInterface sbi = new SecureBiometricInterface(); + sbi.setProviderId("providerId"); + when(sbiRepository.findById(any())).thenReturn(Optional.of(sbi)); + + DeviceDetailSBI deviceDetailSBI = new DeviceDetailSBI(); + DeviceDetailSBIPK deviceDetailSBIPK = new DeviceDetailSBIPK(); + deviceDetailSBIPK.setDeviceDetailId("123"); + deviceDetailSBIPK.setSbiId("1213"); + deviceDetailSBI.setId(deviceDetailSBIPK); + List deviceDetailSBIList = Collections.singletonList(deviceDetailSBI); + when(deviceDetailSbiRepository.findByDeviceProviderIdAndSbiId(anyString(), anyString())).thenReturn(deviceDetailSBIList); + + DeviceDetail deviceDetail = new DeviceDetail(); + deviceDetail.setId("deviceDetailId"); + deviceDetail.setDeviceTypeCode("type"); + deviceDetail.setDeviceSubTypeCode("subtype"); + deviceDetail.setDeviceProviderId("providerId"); + deviceDetail.setMake("make"); + deviceDetail.setModel("model"); + deviceDetail.setApprovalStatus("approved"); + deviceDetail.setIsActive(true); + deviceDetail.setCrDtimes(LocalDateTime.now()); + when(deviceDetailRepository.findByIdAndDeviceProviderId(any(), any())).thenReturn(Optional.of(deviceDetail)); + + ResponseWrapperV2> responseWrapper = secureBiometricInterfaceService.getAllDevicesForSbi("123"); + + assertNotNull(responseWrapper); + } + + @Test + public void getAllDevicesForSbi_UserIdNotExistsTest() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + when(partnerRepository.findByUserId(any())).thenReturn(Collections.emptyList()); + + ResponseWrapperV2> responseWrapper = secureBiometricInterfaceService.getAllDevicesForSbi("123"); + + assertNotNull(responseWrapper); + assertNotNull(responseWrapper.getErrors()); + } + + @Test + public void getAllDevicesForSbi_SbiNotExistsTest() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + Partner partner = new Partner(); + partner.setId("providerId"); + List partnerList = Collections.singletonList(partner); + when(partnerRepository.findByUserId(any())).thenReturn(partnerList); + + when(sbiRepository.findById(any())).thenReturn(Optional.empty()); + + ResponseWrapperV2> responseWrapper = secureBiometricInterfaceService.getAllDevicesForSbi("123"); + assertNotNull(responseWrapper); + assertNotNull(responseWrapper.getErrors()); + } + + @Test + public void getAllDevicesForSbi_PartnerIdNotAssociatedWithUserTest() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + Partner partner = new Partner(); + partner.setId("wrongProviderId"); + List partnerList = Collections.singletonList(partner); + when(partnerRepository.findByUserId(any())).thenReturn(partnerList); + + SecureBiometricInterface sbi = new SecureBiometricInterface(); + sbi.setProviderId("providerId"); + Optional secureBiometricInterface = Optional.of(sbi); + when(sbiRepository.findById(any())).thenReturn(secureBiometricInterface); + + ResponseWrapperV2> responseWrapper = secureBiometricInterfaceService.getAllDevicesForSbi("123"); + + assertNotNull(responseWrapper); + assertNotNull(responseWrapper.getErrors()); + } + + @Test + public void getAllDevicesForSbi_Exception() { + + Partner partner = new Partner(); + partner.setId("providerId"); + when(partnerRepository.findByUserId(anyString())).thenThrow(new RuntimeException("Test exception")); + + ResponseWrapperV2> responseWrapper = secureBiometricInterfaceService.getAllDevicesForSbi("123"); + + assertNotNull(responseWrapper); + assertNotNull(responseWrapper.getErrors()); + } + + @Test + public void testGetSbiDetails() throws NoSuchFieldException, IllegalAccessException { + Page page = null; + when(sbiSummaryRepository.getSummaryOfSbiDetailsByStatusAsc(any(), any(), any(), any(), any(), any(), anyList(), anyBoolean(), any())).thenReturn(page); + when(sbiSummaryRepository.getSummaryOfSbiDetailsByStatusDesc(any(), any(), any(), any(), any(), any(), anyList(), anyBoolean(), any())).thenReturn(page); + when(sbiSummaryRepository.getSummaryOfSbiDetailsByExpiryStatusAsc(any(), any(), any(), any(), any(), any(), anyList(), anyBoolean(), any())).thenReturn(page); + when(sbiSummaryRepository.getSummaryOfSbiDetailsByExpiryStatusDesc(any(), any(), any(), any(), any(), any(), anyList(), anyBoolean(), any())).thenReturn(page); + when(sbiSummaryRepository.getSummaryOfSbiDetailsByDevicesCountAsc(any(), any(), any(), any(), any(), any(), anyList(), anyBoolean(), any())).thenReturn(page); + when(sbiSummaryRepository.getSummaryOfSbiDetailsByDevicesCountDesc(any(), any(), any(), any(), any(), any(), anyList(), anyBoolean(), any())).thenReturn(page); + when(sbiSummaryRepository.getSummaryOfSbiDetails(any(), any(), any(), any(), any(), any(), anyList(), anyBoolean(), any())).thenReturn(page); + + // Create and set the mock map + Map mockMap = new HashMap<>(); + mockMap.put("partnerId", "providerId"); + mockMap.put("orgName", "partnerOrgName"); + mockMap.put("partnerType", "p.partnerTypeCode"); + mockMap.put("sbiId", "id"); + mockMap.put("sbiVersion", "swVersion"); + mockMap.put("sbiCreatedDateTime", "swCreateDateTime"); + mockMap.put("sbiExpiryDateTime", "swExpiryDateTime"); + mockMap.put("status", "approvalStatus"); + mockMap.put("createdDateTime", "crDtimes"); + mockMap.put("sbiExpiryStatus", "sbiExpiryStatus"); + mockMap.put("countOfAssociatedDevices", "countOfAssociatedDevices"); + + Field field = PartnerHelper.class.getDeclaredField("sbiAliasToColumnMap"); + field.setAccessible(true); + field.set(partnerHelper, mockMap); + + // Mock sorting request + Sort mockSort = Sort.by(Sort.Order.asc("crDtimes")); + when(partnerHelper.getSortingRequest(any(), any())).thenReturn(mockSort); + + // Prepare parameters + String sortFieldName = "status"; + String sortType = "asc"; + Integer pageNo = 0; + Integer pageSize = 10; + SbiFilterDto filterDto = new SbiFilterDto(); + List partnerIdList = new ArrayList<>(); + Pageable pageable = PageRequest.of(pageNo, pageSize); + + // Test different cases + String[] sortKeys = { + "status_asc", "status_desc", + "sbiExpiryStatus_asc", "sbiExpiryStatus_desc", + "countOfAssociatedDevices_asc", "countOfAssociatedDevices_desc", + "default" + }; + + for (String sortKey : sortKeys) { + if (sortKey.equals("default")) { + sortFieldName = "someField"; + sortType = "asc"; + } else { + String[] parts = sortKey.split("_"); + sortFieldName = parts[0]; + sortType = parts[1]; + } + + Page result = (Page) ReflectionTestUtils.invokeMethod( + secureBiometricInterfaceService, "getSbiDetails", sortFieldName, sortType, pageNo, pageSize, filterDto, pageable, partnerIdList, false); + + // Verify repository calls based on sort key + switch (sortKey) { + case "status_asc": + verify(sbiSummaryRepository, times(1)) + .getSummaryOfSbiDetailsByStatusAsc(any(), any(), any(), any(), any(), any(), anyList(), anyBoolean(), any()); + break; + case "status_desc": + verify(sbiSummaryRepository, times(1)) + .getSummaryOfSbiDetailsByStatusDesc(any(), any(), any(), any(), any(), any(), anyList(), anyBoolean(), any()); + break; + case "sbiExpiryStatus_asc": + verify(sbiSummaryRepository, times(1)) + .getSummaryOfSbiDetailsByExpiryStatusAsc(any(), any(), any(), any(), any(), any(), anyList(), anyBoolean(), any()); + break; + case "sbiExpiryStatus_desc": + verify(sbiSummaryRepository, times(1)) + .getSummaryOfSbiDetailsByExpiryStatusDesc(any(), any(), any(), any(), any(), any(), anyList(), anyBoolean(), any()); + break; + case "countOfAssociatedDevices_asc": + verify(sbiSummaryRepository, times(1)) + .getSummaryOfSbiDetailsByDevicesCountAsc(any(), any(), any(), any(), any(), any(), anyList(), anyBoolean(), any()); + break; + case "countOfAssociatedDevices_desc": + verify(sbiSummaryRepository, times(1)) + .getSummaryOfSbiDetailsByDevicesCountDesc(any(), any(), any(), any(), any(), any(), anyList(), anyBoolean(), any()); + break; + default: + verify(sbiSummaryRepository, times(1)) + .getSummaryOfSbiDetails(any(), any(), any(), any(), any(), any(), anyList(), anyBoolean(), any()); + break; + } + + // Reset mocks for the next iteration + reset(sbiSummaryRepository); + } + } + + private io.mosip.kernel.openid.bridge.model.MosipUserDto getMosipUserDto() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = new io.mosip.kernel.openid.bridge.model.MosipUserDto(); + mosipUserDto.setUserId("123"); + mosipUserDto.setMail("abc@gmail.com"); + return mosipUserDto; + } } diff --git a/partner/partner-management-service/src/test/java/io/mosip/pms/test/oauth/controller/ClientManagementControllerTest.java b/partner/partner-management-service/src/test/java/io/mosip/pms/test/oauth/controller/ClientManagementControllerTest.java index e631cf728e..1d1d1e7eb7 100644 --- a/partner/partner-management-service/src/test/java/io/mosip/pms/test/oauth/controller/ClientManagementControllerTest.java +++ b/partner/partner-management-service/src/test/java/io/mosip/pms/test/oauth/controller/ClientManagementControllerTest.java @@ -1,24 +1,25 @@ package io.mosip.pms.test.oauth.controller; import com.fasterxml.jackson.databind.ObjectMapper; +import io.mosip.pms.common.dto.PageResponseV2Dto; import io.mosip.pms.common.request.dto.RequestWrapper; import io.mosip.pms.common.response.dto.ResponseWrapper; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; import io.mosip.pms.oauth.client.controller.ClientManagementController; import io.mosip.pms.oauth.client.dto.*; -import io.mosip.pms.oauth.client.service.ClientManagementService; import io.mosip.pms.oauth.client.service.impl.ClientManagementServiceImpl; -import io.mosip.pms.partner.dto.PolicyGroupDto; import io.mosip.pms.partner.exception.PartnerServiceException; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mock; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; @@ -38,20 +39,18 @@ public class ClientManagementControllerTest { @Autowired ClientManagementController clientManagementController; - @Autowired - private ClientManagementServiceImpl serviceImpl; - - @Mock - ClientManagementService clientManagementService; + private MockMvc mockMvc; - @Mock - ClientManagementController clientController; + @MockBean + private ClientManagementServiceImpl clientManagementService; Map public_key; @Before public void setUp() { + this.mockMvc = MockMvcBuilders.standaloneSetup(clientManagementController).build(); + public_key = new HashMap<>(); public_key.put("kty","RSA"); public_key.put("e","AQAB"); @@ -59,45 +58,45 @@ public void setUp() { public_key.put( "kid", "1bbdc9de-c24f-4801-b6b3-691ac07641af"); public_key.put( "alg", "RS256"); public_key.put( "n","wXGQA574CU-WTWPILd4S3_1sJf0Yof0kwMeNctXc1thQo70Ljfn9f4igpRe7f8qNs_W6dLuLWemFhGJBQBQ7vvickECKNJfo_EzSD_yyPCg7k_AGbTWTkuoObHrpilwJGyKVSkOIujH_FqHIVkwkVXjWc25Lsb8Gq4nAHNQEqqgaYPLEi5evCR6S0FzcXTPuRh9zH-cM0Onjv4orrfYpEr61HcRp5MXL55b7yBoIYlXD8NfalcgdrWzp4VZHvQ8yT9G5eaf27XUn6ZBeBf7VnELcKFTyw1pK2wqoOxRBc8Y1wO6rEy8PlCU6wD-mbIzcjG1wUfnbgvJOM4A5G41quQ"); + } + @Test + @WithMockUser(roles = {"AUTH_PARTNER"}) public void testCreateOIDCClient() throws Exception { - io.mosip.pms.common.request.dto.RequestWrapper requestWrapper = new io.mosip.pms.common.request.dto.RequestWrapper<>(); - requestWrapper.setId("42"); - requestWrapper.setMetadata("Metadata"); - requestWrapper.setRequest(new ClientDetailCreateRequest()); - requestWrapper.setRequesttime(null); - requestWrapper.setVersion("1.0.2"); - String content = (new ObjectMapper()).writeValueAsString(requestWrapper); - MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post("/oauth/client") - .contentType(MediaType.APPLICATION_JSON) - .content(content); - ResultActions actualPerformResult = MockMvcBuilders.standaloneSetup(clientManagementController) - .build() - .perform(requestBuilder); - actualPerformResult.andExpect(MockMvcResultMatchers.status().is(400)); - } + RequestWrapper requestWrapper = new RequestWrapper<>(); + ClientDetailCreateRequestV2 clientDetailCreateRequestV2 = new ClientDetailCreateRequestV2(); + Map clientNameLangMap = new HashMap<>(); + clientNameLangMap.put("eng", "English Client Name"); + clientNameLangMap.put("fra", "French Client Name"); + clientNameLangMap.put("ara", "Arabic Client Name"); + + clientDetailCreateRequestV2.setClientNameLangMap(clientNameLangMap); + clientDetailCreateRequestV2.setName("Mock Name"); + clientDetailCreateRequestV2.setPolicyId("policy-id"); + clientDetailCreateRequestV2.setPublicKey(public_key); + clientDetailCreateRequestV2.setAuthPartnerId("auth-partner-id"); + clientDetailCreateRequestV2.setLogoUri("https://example.com/logo.png"); + List redirectUris = List.of("https://example.com/redirect1"); + clientDetailCreateRequestV2.setRedirectUris(redirectUris); + List grantTypes = Arrays.asList("authorization_code", "refresh_token"); + clientDetailCreateRequestV2.setGrantTypes(grantTypes); + List clientAuthMethods = List.of("private_key_jwt"); + clientDetailCreateRequestV2.setClientAuthMethods(clientAuthMethods); + + requestWrapper.setRequest(clientDetailCreateRequestV2); + String requestJson = new ObjectMapper().writeValueAsString(requestWrapper); + + mockMvc.perform(MockMvcRequestBuilders.post("/oauth/client") + .contentType(MediaType.APPLICATION_JSON) + .content(requestJson)) + .andExpect(MockMvcResultMatchers.status().isOk()); - @Test - public void testUpdateClient() throws Exception { - io.mosip.pms.common.request.dto.RequestWrapper requestWrapper = new io.mosip.pms.common.request.dto.RequestWrapper<>(); - requestWrapper.setId("42"); - requestWrapper.setMetadata("Metadata"); - requestWrapper.setRequest(new ClientDetailUpdateRequest()); - requestWrapper.setRequesttime(null); - requestWrapper.setVersion("1.0.2"); - String content = (new ObjectMapper()).writeValueAsString(requestWrapper); - MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.put("/oauth/client/{client_id}", "Client id") - .contentType(MediaType.APPLICATION_JSON) - .content(content); - ResultActions actualPerformResult = MockMvcBuilders.standaloneSetup(clientManagementController) - .build() - .perform(requestBuilder); - actualPerformResult.andExpect(MockMvcResultMatchers.status().is(400)); } @Test + @WithMockUser(roles = {"AUTH_PARTNER"}) public void testCreateOAUTHClient() throws Exception { io.mosip.pms.common.request.dto.RequestWrapper requestWrapper = new RequestWrapper<>(); requestWrapper.setId("42"); @@ -116,25 +115,36 @@ public void testCreateOAUTHClient() throws Exception { } @Test + @WithMockUser(roles = {"AUTH_PARTNER"}) public void testUpdateOAUTHClient() throws Exception { - io.mosip.pms.common.request.dto.RequestWrapper requestWrapper = new io.mosip.pms.common.request.dto.RequestWrapper<>(); - requestWrapper.setId("42"); - requestWrapper.setMetadata("Metadata"); - requestWrapper.setRequest(new ClientDetailUpdateRequestV2()); - requestWrapper.setRequesttime(null); - requestWrapper.setVersion("1.0.2"); - String content = (new ObjectMapper()).writeValueAsString(requestWrapper); - MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders - .put("/oauth/client/{client_id}", "Client id") - .contentType(MediaType.APPLICATION_JSON) - .content(content); - ResultActions actualPerformResult = MockMvcBuilders.standaloneSetup(clientManagementController) - .build() - .perform(requestBuilder); - actualPerformResult.andExpect(MockMvcResultMatchers.status().is(400)); + RequestWrapper requestWrapper = new RequestWrapper<>(); + ClientDetailUpdateRequestV2 clientDetailUpdateRequestV2 = new ClientDetailUpdateRequestV2(); + Map clientNameLangMap = new HashMap<>(); + clientNameLangMap.put("eng", "English Client Name"); + clientNameLangMap.put("fra", "French Client Name"); + clientNameLangMap.put("ara", "Arabic Client Name"); + + clientDetailUpdateRequestV2.setClientNameLangMap(clientNameLangMap); + clientDetailUpdateRequestV2.setClientName("Mock Name"); + clientDetailUpdateRequestV2.setLogoUri("https://example.com/logo.png"); + clientDetailUpdateRequestV2.setStatus("ACTIVE"); + List redirectUris = List.of("https://example.com/redirect1"); + clientDetailUpdateRequestV2.setRedirectUris(redirectUris); + List grantTypes = Arrays.asList("authorization_code", "refresh_token"); + clientDetailUpdateRequestV2.setGrantTypes(grantTypes); + List clientAuthMethods = List.of("private_key_jwt"); + clientDetailUpdateRequestV2.setClientAuthMethods(clientAuthMethods); + requestWrapper.setRequest(clientDetailUpdateRequestV2); + String requestJson = new ObjectMapper().writeValueAsString(requestWrapper); + + mockMvc.perform(MockMvcRequestBuilders.put("/oauth/client/123") + .contentType(MediaType.APPLICATION_JSON) + .content(requestJson)) + .andExpect(MockMvcResultMatchers.status().isOk()); } - @Test (expected = PartnerServiceException.class) + @Test () + @WithMockUser(roles = {"AUTH_PARTNER"}) public void testGetOAuthClient() throws Exception { io.mosip.pms.oauth.client.dto.ClientDetail clientDetail = new io.mosip.pms.oauth.client.dto.ClientDetail(); clientDetail.setAcrValues(Collections.singletonList("Value")); @@ -149,22 +159,43 @@ public void testGetOAuthClient() throws Exception { clientDetail.setRedirectUris(Collections.singletonList("Redirect Uris")); clientDetail.setStatus("Status"); - when(serviceImpl.getClientDetails("123")).thenReturn(clientDetail); + when(clientManagementService.getClientDetails("123")).thenReturn(clientDetail); ResponseWrapper expectedResponse = new ResponseWrapper<>(); expectedResponse.setResponse(clientDetail); ResponseWrapper actualResponse = clientManagementController.getOAuthClient("123"); - verify(serviceImpl).getClientDetails("123"); - assertEquals(expectedResponse, actualResponse); + verify(clientManagementService).getClientDetails("123"); + assertEquals(expectedResponse.getClass(), actualResponse.getClass()); } @Test - public void getAllOidcClients() throws Exception { - List oidcClientDtoList = new ArrayList<>(); - when(clientManagementService.getAllOidcClients()).thenReturn(oidcClientDtoList); - ResponseWrapper> actualResponse = clientController.getAllOidcClients(); + @WithMockUser(roles = {"PARTNER_ADMIN"}) + public void getPartnersClientsTest() throws Exception { + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + ClientFilterDto filterDto = new ClientFilterDto(); + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + PageResponseV2Dto pageResponse = new PageResponseV2Dto<>(); + responseWrapper.setResponse(pageResponse); + + Mockito.when(clientManagementService.getPartnersClients(sortFieldName, sortType, pageNo, pageSize, filterDto)) + .thenReturn(responseWrapper); + + mockMvc.perform(MockMvcRequestBuilders.get("/oauth/client") + .param("sortFieldName", sortFieldName) + .param("sortType", sortType) + .param("pageNo", String.valueOf(pageNo)) + .param("pageSize", String.valueOf(pageSize)) + .param("partnerId", "123") + .param("orgName", "ABC") + .param("policyGroupName", "test") + .param("policyName", "test") + .param("clientName", "abc") + .param("status", "approved")) + .andExpect(MockMvcResultMatchers.status().isOk()); } - } \ No newline at end of file diff --git a/partner/partner-management-service/src/test/java/io/mosip/pms/test/oauth/service/impl/ClientManagementServiceImplTest.java b/partner/partner-management-service/src/test/java/io/mosip/pms/test/oauth/service/impl/ClientManagementServiceImplTest.java index cde2c4b7ee..375dd7d2e3 100644 --- a/partner/partner-management-service/src/test/java/io/mosip/pms/test/oauth/service/impl/ClientManagementServiceImplTest.java +++ b/partner/partner-management-service/src/test/java/io/mosip/pms/test/oauth/service/impl/ClientManagementServiceImplTest.java @@ -1,5 +1,7 @@ package io.mosip.pms.test.oauth.service.impl; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.sql.Timestamp; import java.time.LocalDateTime; import java.time.ZoneId; @@ -14,6 +16,7 @@ import io.mosip.pms.common.entity.*; import io.mosip.pms.common.entity.ClientDetail; import io.mosip.pms.common.repository.*; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; import io.mosip.pms.device.util.AuditUtil; import io.mosip.pms.oidc.client.contant.ClientServiceAuditEnum; import com.fasterxml.jackson.core.JsonProcessingException; @@ -22,6 +25,7 @@ import io.mosip.pms.common.dto.PartnerDataPublishDto; import io.mosip.pms.common.dto.PolicyPublishDto; import io.mosip.pms.common.dto.Type; +import io.mosip.pms.common.dto.PageResponseV2Dto; import io.mosip.pms.common.exception.ApiAccessibleException; import io.mosip.pms.common.util.MapperUtils; import io.mosip.pms.oauth.client.dto.*; @@ -29,7 +33,6 @@ import net.minidev.json.parser.JSONParser; import org.json.simple.JSONArray; import org.json.simple.JSONObject; -import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -40,8 +43,14 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.env.Environment; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.http.MediaType; import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.context.junit4.SpringRunner; @@ -49,13 +58,16 @@ import static io.mosip.pms.common.util.UserDetailUtil.getLoggedInUserId; import static org.junit.Assert.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; import com.fasterxml.jackson.databind.ObjectMapper; import io.mosip.pms.common.helper.WebSubPublisher; import io.mosip.pms.common.util.RestUtil; -import io.mosip.pms.oauth.client.dto.ClientDetailCreateRequest; import io.mosip.pms.oauth.client.service.impl.ClientManagementServiceImpl; import io.mosip.pms.partner.constant.ErrorCode; import io.mosip.pms.partner.exception.PartnerServiceException; @@ -70,19 +82,22 @@ public class ClientManagementServiceImplTest { @Mock private Environment environment; - @Mock + @MockBean PartnerRepository partnerRepository; - @Mock + @MockBean ClientDetailRepository clientDetailRepository; - @Mock + @MockBean AuthPolicyRepository authPolicyRepository; - @Mock - PartnerPolicyRequestRepository partnerPolicyRequestRepository; + @MockBean + ClientSummaryRepository clientSummaryRepository; @MockBean + PartnerPolicyRequestRepository partnerPolicyRequestRepository; + + @Mock private RestUtil restUtil; @MockBean @@ -100,7 +115,7 @@ public class ClientManagementServiceImplTest { @Mock SecurityContext securityContext; - @Mock + @MockBean PartnerServiceRepository partnerServiceRepository; Map public_key; @@ -108,9 +123,6 @@ public class ClientManagementServiceImplTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); - ReflectionTestUtils.setField(serviceImpl, "clientDetailRepository", clientDetailRepository); - ReflectionTestUtils.setField(serviceImpl, "authPolicyRepository", authPolicyRepository); - ReflectionTestUtils.setField(serviceImpl, "partnerPolicyRequestRepository", partnerPolicyRequestRepository); ReflectionTestUtils.setField(serviceImpl, "webSubPublisher", webSubPublisher); ReflectionTestUtils.setField(serviceImpl, "restUtil", restUtil); @@ -125,6 +137,18 @@ public void setUp() { @Test public void createClientTest() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("PARTNER_ADMIN") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + ClientDetailCreateRequest request = new ClientDetailCreateRequest(); request.setPublicKey(public_key); request.setPolicyId("policy"); @@ -161,6 +185,18 @@ public void testCreateOIDCClient_WithEmptyPublicKey_ThrowsExceptionWithMock() th @Test (expected = PartnerServiceException.class) public void createOIDCClient_invalidPublicKey_throwsPartnerServiceException() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("PARTNER_ADMIN") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + ClientDetailCreateRequest createRequest = new ClientDetailCreateRequest(); createRequest.setName("ClientName"); createRequest.setAuthPartnerId("AuthPartnerId"); @@ -182,6 +218,18 @@ public void createOIDCClient_invalidPublicKey_throwsPartnerServiceException() th @Test (expected = PartnerServiceException.class) public void createOIDCClient_existingClientDetail_throwsPartnerServiceException() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("PARTNER_ADMIN") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + ClientDetailCreateRequest createRequest = new ClientDetailCreateRequest(); createRequest.setName("ClientName"); createRequest.setAuthPartnerId("AuthPartnerId"); @@ -220,6 +268,17 @@ public void createOIDCClient_existingClientDetail_throwsPartnerServiceException( @Test (expected = PartnerServiceException.class) public void createOIDCClient_invalidPartnerId_throwsPartnerServiceException() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("PARTNER_ADMIN") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); ClientDetailCreateRequest createRequest = new ClientDetailCreateRequest(); createRequest.setName("ClientName"); @@ -239,7 +298,9 @@ public void createOIDCClient_invalidPartnerId_throwsPartnerServiceException() th when(environment.getProperty(any(String.class))).thenReturn("https://testcase.pms.net/browse/OIDCClient.png"); when(clientDetailRepository.findById(any(String.class))).thenReturn(Optional.empty()); - when(partnerRepository.findById(any(String.class))).thenReturn(Optional.of(new Partner())); + Partner partner = new Partner(); + partner.setPartnerTypeCode("Device_Provider"); + when(partnerRepository.findById(any(String.class))).thenReturn(Optional.of(partner)); ClientDetailResponse response = serviceImpl.createOIDCClient(createRequest); @@ -248,10 +309,21 @@ public void createOIDCClient_invalidPartnerId_throwsPartnerServiceException() th @Test (expected = PartnerServiceException.class) public void createOIDCClient_validRequest_returnsClientDetailResponse() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("PARTNER_ADMIN") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); when(environment.getProperty("auth.url")).thenReturn("https://pms.net/partner"); when(clientDetailRepository.findById(anyString())).thenReturn(Optional.empty()); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(new Partner())); + when(partnerRepository.findById(anyString())).thenReturn(Optional.empty()); ClientDetailCreateRequest createRequest = new ClientDetailCreateRequest(); createRequest.setName("ClientName"); @@ -366,7 +438,19 @@ public void testUpdateOIDCClient_WithFailure() throws Exception { } @Test - public void testGetClientDetails_Success() { + public void testGetClientDetails_Success() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("PARTNER_ADMIN") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + PolicyGroup policyGroup = new PolicyGroup(); policyGroup.setCrBy("Cr By"); policyGroup.setCrDtimes(LocalDateTime.of(1, 1, 1, 1, 1)); @@ -438,13 +522,70 @@ public void testGetClientDetails_Success() { assertEquals(1, actualClientDetails.getGrantTypes().size()); assertEquals(1, actualClientDetails.getClientAuthMethods().size()); assertEquals(1, actualClientDetails.getClaims().size()); - verify(authPolicyRepository).findById(anyString()); verify(clientDetailRepository).findById(anyString()); } @Test (expected = PartnerServiceException.class) - public void testGetClientDetails_Exception() { + public void testGetClientDetails_Exception1() { + when(clientDetailRepository.findById(anyString())).thenReturn(Optional.empty()); + serviceImpl.getClientDetails("Id"); + } + + @Test (expected = PartnerServiceException.class) + public void testGetClientDetails_Exception2() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("PARTNER") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + io.mosip.pms.common.entity.ClientDetail clientDetail = new io.mosip.pms.common.entity.ClientDetail(); + clientDetail.setAcrValues("values"); + clientDetail.setClaims("Claims"); + Optional clientDetailOptional = Optional.of(clientDetail); + when(clientDetailRepository.findById(anyString())).thenReturn(clientDetailOptional); + + serviceImpl.getClientDetails("Id"); + } + + @Test (expected = PartnerServiceException.class) + public void testGetClientDetails_Exception3() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("PARTNER") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + io.mosip.pms.common.entity.ClientDetail clientDetail = new io.mosip.pms.common.entity.ClientDetail(); + clientDetail.setAcrValues("values"); + clientDetail.setClaims("Claims"); + Optional clientDetailOptional = Optional.of(clientDetail); + when(clientDetailRepository.findById(anyString())).thenReturn(clientDetailOptional); + + ArrayList partnerArrayList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partnerArrayList.add(partner); + when(partnerServiceRepository.findByUserId(any())).thenReturn(partnerArrayList); + + serviceImpl.getClientDetails("Id"); + } + + @Test (expected = Exception.class) + public void testGetClientDetails_Exception() throws Exception { when(authPolicyRepository.findById(anyString())) .thenThrow(new PartnerServiceException("An error occurred", "An error occurred")); @@ -459,7 +600,6 @@ public void testGetClientDetails_Exception() { clientDetail.setIsDeleted(false); clientDetail.setLogoUri("Logo Uri"); clientDetail.setName("Name"); - clientDetail.setPolicyId("PolicyId"); clientDetail.setPublicKey("Public Key"); clientDetail.setRedirectUris("Redirect Uris"); clientDetail.setRpId("RpId"); @@ -681,6 +821,17 @@ public void testGetPartnerCertificateWithSuccess() throws JsonProcessingExceptio @Test (expected = PartnerServiceException.class) public void testCreateOIDCClientWithError() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("PARTNER_ADMIN") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); ClientDetailCreateRequest createRequest = new ClientDetailCreateRequest(); createRequest.setName("ClientName"); @@ -1075,7 +1226,7 @@ public void testProcessCreateOIDCClient_ClientExists() throws Exception { assertNotNull(result.getPolicy()); } - @Test(expected = PartnerServiceException.class) + @Test(expected = Exception.class) public void testProcessCreateOIDCClient_PartnerCannotCreateOIDCClient() throws Exception { ClientDetailCreateRequest createRequest = new ClientDetailCreateRequest(); createRequest.setName("ClientName"); @@ -1172,52 +1323,51 @@ public void testProcessCreateOIDCClient_PartnerCannotCreateOIDCClient() throws E assertNotNull(result.getPartner()); assertNotNull(result.getPolicy()); } + @Test - public void getAllOidcClients() throws Exception { + public void getPartnersClientsTest() throws Exception { io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); SecurityContextHolder.setContext(securityContext); when(authentication.getPrincipal()).thenReturn(authUserDetails); when(securityContext.getAuthentication()).thenReturn(authentication); - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId("123"); - partner.setPartnerTypeCode("Auth_Partner"); - partner.setPolicyGroupId("abc"); - partner.setApprovalStatus("approved"); - partnerList.add(partner); - when(partnerServiceRepository.findByUserId(anyString())).thenReturn(partnerList); - - List clientDetailList = new ArrayList<>(); - ClientDetail clientDetail = new ClientDetail(); - clientDetail.setId("id123"); - clientDetail.setName("Sample Client"); - clientDetail.setRpId("rp123"); - clientDetail.setPolicyId("policy123"); - clientDetail.setLogoUri("https://example.com/logo.png"); - clientDetail.setRedirectUris("https://example.com/callback"); - clientDetail.setPublicKey("public-key-string"); - clientDetail.setClaims("claims-string"); - clientDetail.setAcrValues("acr-values-string"); - clientDetail.setStatus("active"); - clientDetail.setGrantTypes("grant-type-string"); - clientDetail.setClientAuthMethods("auth-methods-string"); - clientDetail.setCreatedBy("creator-user"); - clientDetail.setCreatedDateTime(LocalDateTime.now()); - clientDetail.setUpdatedBy("updater-user"); - clientDetail.setUpdatedDateTime(LocalDateTime.now()); - clientDetail.setIsDeleted(false); - when(clientDetailRepository.findAllByPartnerId(anyString())).thenReturn(clientDetailList); + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + ClientFilterDto filterDto = new ClientFilterDto(); + filterDto.setPartnerId("abc"); + filterDto.setStatus("ACTIVE"); + filterDto.setOrgName("ABC"); + Pageable pageable = PageRequest.of(pageNo, pageSize); + ClientSummaryEntity entity = new ClientSummaryEntity(); + entity.setClientId("123"); + Page page = new PageImpl<>(List.of(entity), pageable, 1); + + when(clientSummaryRepository.getSummaryOfAllPartnerClients(anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyList(), anyBoolean(), any())).thenReturn(page); + serviceImpl.getPartnersClients(sortFieldName, sortType, pageNo, pageSize, filterDto); + } - AuthPolicy authPolicy = new AuthPolicy(); - PolicyGroup policyGroup = new PolicyGroup(); - policyGroup.setName("abc"); - authPolicy.setPolicyGroup(policyGroup); - authPolicy.setName("abc"); - when(authPolicyRepository.findById(anyString())).thenReturn(Optional.of(authPolicy)); + @Test + public void getPartnersClientsTestException() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); - serviceImpl.getAllOidcClients(); + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + Pageable pageable = PageRequest.of(pageNo, pageSize); + ClientSummaryEntity entity = new ClientSummaryEntity(); + entity.setClientId("123"); + Page page = new PageImpl<>(List.of(entity), pageable, 1); + when(clientSummaryRepository.getSummaryOfAllPartnerClients(anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyList(), anyBoolean(), any())).thenReturn(page); + serviceImpl.getPartnersClients(sortFieldName, sortType, pageNo, pageSize, null); } private io.mosip.kernel.openid.bridge.model.MosipUserDto getMosipUserDto() { diff --git a/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/controller/MultiPartnerServiceControllerTest.java b/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/controller/MultiPartnerServiceControllerTest.java deleted file mode 100644 index 9899c7e384..0000000000 --- a/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/controller/MultiPartnerServiceControllerTest.java +++ /dev/null @@ -1,126 +0,0 @@ -package io.mosip.pms.test.partner.controller; - -import io.mosip.pms.common.response.dto.ResponseWrapper; -import io.mosip.pms.partner.controller.MultiPartnerServiceController; -import io.mosip.pms.partner.dto.*; -import io.mosip.pms.partner.service.MultiPartnerService; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.TestContext; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.web.context.WebApplicationContext; - -import java.util.ArrayList; -import java.util.List; - -@ContextConfiguration(classes = {TestContext.class, WebApplicationContext.class}) -@RunWith(SpringRunner.class) -@WebMvcTest -public class MultiPartnerServiceControllerTest { - - @InjectMocks - private MultiPartnerServiceController multiPartnerServiceController; - - @Mock - private MultiPartnerService multiPartnerService; - - @Test - @WithMockUser(roles = {"PARTNER"}) - public void getAllCertificateDetails() throws Exception { - CertificateDto certificateDto = new CertificateDto(); - certificateDto.setPartnerId("abc"); - certificateDto.setPartnerType("Auth_Partner"); - certificateDto.setIsCertificateAvailable(false); - - List certificateDtoList = new ArrayList<>(); - certificateDtoList.add(certificateDto); - - Mockito.when(multiPartnerService.getAllCertificateDetails()).thenReturn(certificateDtoList); - ResponseWrapper> response = multiPartnerServiceController.getAllCertificateDetails(); - } - - @Test - @WithMockUser(roles = {"PARTNER"}) - public void getAllPoliciesRequestList() throws Exception { - PolicyDto policyDto = new PolicyDto(); - policyDto.setPartnerId("abc"); - policyDto.setPartnerType("Auth_Partner"); - policyDto.setPolicyGroupName("123"); - policyDto.setPolicyName("test"); - List policyDtoList = new ArrayList<>(); - policyDtoList.add(policyDto); - Mockito.when(multiPartnerService.getAllRequestedPolicies()).thenReturn(policyDtoList); - ResponseWrapper> response = multiPartnerServiceController.getAllRequestedPolicies(); - } - - @Test - @WithMockUser(roles = {"PARTNER"}) - public void getAllApprovedPoliciesTest() throws Exception { - ApprovedPolicyDto policyDto = new ApprovedPolicyDto(); - policyDto.setPartnerId("abc"); - policyDto.setPartnerType("Auth_Partner"); - policyDto.setPolicyGroupName("123"); - List policyDtoList = new ArrayList<>(); - policyDtoList.add(policyDto); - Mockito.when(multiPartnerService.getAllApprovedAuthPartnerPolicies()).thenReturn(policyDtoList); - ResponseWrapper> response = multiPartnerServiceController.getAllApprovedAuthPartnerPolicies(); - } - - @Test - @WithMockUser(roles = {"PARTNER"}) - public void getAllApprovedPolicyGroupsList() throws Exception { - PolicyGroupDto policyGroupDto = new PolicyGroupDto(); - policyGroupDto.setPartnerId("abc"); - policyGroupDto.setPartnerType("Auth_Partner"); - policyGroupDto.setPolicyGroupId("123"); - policyGroupDto.setPolicyGroupName("testGroup"); - policyGroupDto.setPolicyGroupDescription("testDesc"); - List policyGroupDtoList = new ArrayList<>(); - policyGroupDtoList.add(policyGroupDto); - Mockito.when(multiPartnerService.getAllApprovedPartnerIdsWithPolicyGroups()).thenReturn(policyGroupDtoList); - ResponseWrapper> responseWrapper = multiPartnerServiceController.getAllApprovedPartnerIdsWithPolicyGroups(); - } - - @Test - @WithMockUser(roles = {"PARTNER"}) - public void getAllApiKeysForAuthPartners() throws Exception { - ApiKeyResponseDto apiKeyResponseDto = new ApiKeyResponseDto(); - apiKeyResponseDto.setStatus("ACTIVE"); - apiKeyResponseDto.setApiKeyLabel("test"); - apiKeyResponseDto.setPolicyId("policy123"); - apiKeyResponseDto.setPolicyName("policy123name"); - apiKeyResponseDto.setPolicyNameDescription("policy123desc"); - apiKeyResponseDto.setPolicyGroupId("policygroup000"); - apiKeyResponseDto.setPolicyGroupName("policygroup000name"); - apiKeyResponseDto.setPolicyGroupDescription("policygroup000desc"); - List apiKeyResponseDtoList = new ArrayList<>(); - apiKeyResponseDtoList.add(apiKeyResponseDto); - Mockito.when(multiPartnerService.getAllApiKeysForAuthPartners()).thenReturn(apiKeyResponseDtoList); - ResponseWrapper> response = multiPartnerServiceController.getAllApiKeysForAuthPartners(); - } - - @Test - public void saveUserConsentGiven() throws Exception { - UserDetailsDto userDetailsDto = new UserDetailsDto(); - Mockito.when(multiPartnerService.saveUserConsentGiven()).thenReturn(userDetailsDto); - ResponseWrapper response = multiPartnerServiceController.saveUserConsentGiven(); - } - - @Test - public void isUserConsentGiven() throws Exception { - UserDetailsDto userDetailsDto = new UserDetailsDto(); - Mockito.when(multiPartnerService.isUserConsentGiven()).thenReturn(userDetailsDto); - ResponseWrapper response = multiPartnerServiceController.isUserConsentGiven(); - } - - @Test - public void getConfigValuesTest() throws Exception { - multiPartnerServiceController.getConfigValues(); - } -} diff --git a/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/controller/PartnerManagementControllerTest.java b/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/controller/PartnerManagementControllerTest.java index df82f4b403..4d83817983 100644 --- a/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/controller/PartnerManagementControllerTest.java +++ b/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/controller/PartnerManagementControllerTest.java @@ -9,14 +9,14 @@ import java.time.LocalDateTime; import java.time.ZoneOffset; import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; +import java.util.*; +import io.mosip.pms.common.dto.PageResponseV2Dto; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; import io.mosip.pms.partner.manager.controller.PartnerManagementController; +import io.mosip.pms.partner.manager.dto.*; import lombok.SneakyThrows; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -48,12 +48,6 @@ import io.mosip.pms.common.request.dto.RequestWrapper; import io.mosip.pms.device.util.AuditUtil; import io.mosip.pms.partner.manager.constant.PartnerManageEnum; -import io.mosip.pms.partner.manager.dto.StatusRequestDto; -import io.mosip.pms.partner.manager.dto.ApikeyRequests; -import io.mosip.pms.partner.manager.dto.PartnerAPIKeyToPolicyMappingsResponse; -import io.mosip.pms.partner.manager.dto.PartnersPolicyMappingRequest; -import io.mosip.pms.partner.manager.dto.PartnersPolicyMappingResponse; -import io.mosip.pms.partner.manager.dto.RetrievePartnerDetailsResponse; import io.mosip.pms.partner.manager.service.PartnerManagerService; import io.mosip.pms.partner.request.dto.APIkeyStatusUpdateRequestDto; @@ -202,7 +196,7 @@ public void approveRejectPolicyMappings() throws JsonProcessingException, Except request.setVersion("1.0"); request.setRequesttime(ZonedDateTime.now(ZoneOffset.UTC).toLocalDateTime()); request.setMetadata("{}"); - Mockito.when(partnerManagementService.approveRejectPartnerPolicyMapping(mappingKey,requestDto)) + Mockito.when(partnerManagementService.approveRejectPartnerPolicyMapping(any(), any())) .thenReturn("Success"); mockMvc.perform(MockMvcRequestBuilders.put("/partners/policy/56789").contentType(MediaType.APPLICATION_JSON_VALUE) @@ -343,4 +337,231 @@ public void testActivateDeactivatePartnerAPIKey3() { } + @Test + @WithMockUser(roles = {"PARTNER_ADMIN"}) + public void getPartnerDetailsTest() throws Exception { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + + Mockito.when(partnerManagementService.getPartnerDetails(anyString())) + .thenReturn(responseWrapper); + + mockMvc.perform(MockMvcRequestBuilders.get("/admin-partners/{partnerId}", "samplePartnerId") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(MockMvcResultMatchers.status().isOk()); + } + + @Test + @WithMockUser(roles = {"PARTNER_ADMIN"}) + public void getAllPartnersTest() throws Exception { + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + PartnerFilterDto partnerFilterDto = new PartnerFilterDto(); + partnerFilterDto.setPartnerId("abc"); + partnerFilterDto.setPartnerTypeCode("Auth_Partner"); + partnerFilterDto.setOrganizationName("ABC"); + partnerFilterDto.setEmailAddress("abc"); + partnerFilterDto.setCertificateUploadStatus("not_uploaded"); + partnerFilterDto.setPolicyGroupName("default"); + partnerFilterDto.setIsActive(false); + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + + Mockito.when(partnerManagementService.getAdminPartners(sortFieldName, sortType, pageNo, pageSize, partnerFilterDto)) + .thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/admin-partners?sortFieldName=createdDateTime&sortType=desc&pageSize=8&pageNo=0&" + + "partnerId=abc&partnerType=Auth_Partner&orgName=ABC&emailAddress=abc&certificateUploadStatus=not_uploaded&policyGroupName=default&isActive=false")) + .andExpect(MockMvcResultMatchers.status().isOk()); + } + + @Test + @WithMockUser(roles = {"PARTNER_ADMIN"}) + public void getAllPartners_NoFiltersTest() throws Exception { + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + PartnerFilterDto partnerFilterDto = new PartnerFilterDto(); + partnerFilterDto.setPartnerId("abc"); + partnerFilterDto.setPartnerTypeCode("Auth_Partner"); + partnerFilterDto.setOrganizationName("ABC"); + partnerFilterDto.setEmailAddress("abc"); + partnerFilterDto.setCertificateUploadStatus("not_uploaded"); + partnerFilterDto.setPolicyGroupName("default"); + partnerFilterDto.setIsActive(false); + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + + Mockito.when(partnerManagementService.getAdminPartners(sortFieldName, sortType, pageNo, pageSize, partnerFilterDto)) + .thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/admin-partners?sortFieldName=createdDateTime&sortType=desc&pageSize=8&pageNo=0&")) + .andExpect(MockMvcResultMatchers.status().isOk()); + } + + @Test + @WithMockUser(roles = {"PARTNER_ADMIN"}) + public void getAllApiKeyRequestsTest() throws Exception { + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + ApiKeyFilterDto apiKeyFilterDto = new ApiKeyFilterDto(); + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + + Mockito.when(partnerManagementService.getAllApiKeyRequests(sortFieldName, sortType, pageNo, pageSize, apiKeyFilterDto)) + .thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/partner-api-keys") + .param("sortFieldName", sortFieldName) + .param("sortType", sortType) + .param("pageNo", String.valueOf(pageNo)) + .param("pageSize", String.valueOf(pageSize)) + .param("partnerId", "123") + .param("apiKeyLabel", "label") + .param("orgName", "ABC") + .param("status", "approved") + .param("policyName", "policy name") + .param("policyGroupName", "policy group")) + .andExpect(MockMvcResultMatchers.status().isOk()); + } + + @Test + @WithMockUser(roles = {"PARTNER_ADMIN"}) + public void getAllApiKeyRequests_NoFiltersTest() throws Exception { + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + ApiKeyFilterDto apiKeyFilterDto = new ApiKeyFilterDto(); + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + + Mockito.when(partnerManagementService.getAllApiKeyRequests(sortFieldName, sortType, pageNo, pageSize, apiKeyFilterDto)) + .thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/partner-api-keys") + .param("sortFieldName", sortFieldName) + .param("sortType", sortType) + .param("pageNo", String.valueOf(pageNo)) + .param("pageSize", String.valueOf(pageSize))) + .andExpect(MockMvcResultMatchers.status().isOk()); + } + + + @Test + @WithMockUser(roles = {"PARTNER_ADMIN"}) + public void getAllPartnerPolicyRequestsTest() throws Exception { + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + String partnerId = "123"; + String partnerComment = "Request details"; + String orgName = "ABC"; + String status = "approved"; + String policyId = "policy-123"; + String policyName = "Sample Policy"; + String policyGroupName = "Default Group"; + String partnerTypeCode = "Auth_Partner"; + String partnerType = "partnerType"; + PartnerPolicyRequestFilterDto partnerPolicyRequestFilterDto = new PartnerPolicyRequestFilterDto(); + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + + Mockito.when(partnerManagementService.getAllPartnerPolicyRequests(sortFieldName, sortType, pageNo, pageSize, partnerPolicyRequestFilterDto)) + .thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/partner-policy-requests") + .param("sortFieldName", sortFieldName) + .param("sortType", sortType) + .param("pageNo", String.valueOf(pageNo)) + .param("pageSize", String.valueOf(pageSize)) + .param("partnerId", partnerId) + .param("partnerComment", partnerComment) + .param("orgName", orgName) + .param("status", status) + .param("policyId", policyId) + .param("policyName", policyName) + .param("policyGroupName", policyGroupName) + .param("partnerType", partnerType) + .param("partnerTypeCode", partnerTypeCode)) + .andExpect(MockMvcResultMatchers.status().isOk()); + } + + @Test + @WithMockUser(roles = {"PARTNER_ADMIN"}) + public void getAllPartnerPolicyRequests_NoFiltersTest() throws Exception { + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + String partnerId = "123"; + String partnerComment = "Request details"; + String orgName = "ABC"; + String status = "approved"; + String policyId = "policy-123"; + String policyName = "Sample Policy"; + String policyGroupName = "Default Group"; + String partnerTypeCode = "Auth_Partner"; + PartnerPolicyRequestFilterDto partnerPolicyRequestFilterDto = new PartnerPolicyRequestFilterDto(); + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + + Mockito.when(partnerManagementService.getAllPartnerPolicyRequests(sortFieldName, sortType, pageNo, pageSize, partnerPolicyRequestFilterDto)) + .thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/partner-policy-requests") + .param("sortFieldName", sortFieldName) + .param("sortType", sortType) + .param("pageNo", String.valueOf(pageNo)) + .param("pageSize", String.valueOf(pageSize))) + .andExpect(MockMvcResultMatchers.status().isOk()); + } + + @Test + @WithMockUser(roles = {"PARTNER_ADMIN"}) + public void getCaCertificatesTest() throws Exception { + String sortFieldName = "caCertificateType"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + TrustCertificateFilterDto filterDto = new TrustCertificateFilterDto(); + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + + Mockito.when(partnerManagementService.getTrustCertificates(sortFieldName, sortType, pageNo, pageSize, filterDto)) + .thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/trust-chain-certificates") + .param("sortFieldName", sortFieldName) + .param("sortType", sortType) + .param("pageNo", String.valueOf(pageNo)) + .param("pageSize", String.valueOf(pageSize)) + .param("caCertificateType", "root") + .param("certificateId", "123") + .param("partnerDomain", "FTM") + .param("issuedTo", "CA") + .param("issuedBy", "CA")) + .andExpect(MockMvcResultMatchers.status().isOk()); + } + + @Test + @WithMockUser(roles = {"PARTNER_ADMIN"}) + public void getCaCertificates_NoFiltersTest() throws Exception { + String sortFieldName = "caCertificateType"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + TrustCertificateFilterDto filterDto = new TrustCertificateFilterDto(); + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + + Mockito.when(partnerManagementService.getTrustCertificates(sortFieldName, sortType, pageNo, pageSize, filterDto)) + .thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/trust-chain-certificates") + .param("sortFieldName", sortFieldName) + .param("sortType", sortType) + .param("pageNo", String.valueOf(pageNo)) + .param("pageSize", String.valueOf(pageSize))) + .andExpect(MockMvcResultMatchers.status().isOk()); + } + + @Test + @WithMockUser(roles = {"PARTNER_ADMIN"}) + public void downloadRootCertificateTest() throws Exception { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + Mockito.when(partnerManagementService.downloadTrustCertificates(anyString())).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/trust-chain-certificates/{certificateId}/certificateFile", "123") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(MockMvcResultMatchers.status().isOk()); + } } diff --git a/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/controller/PartnerServiceControllerTest.java b/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/controller/PartnerServiceControllerTest.java index 1a6207c074..eda07666c4 100644 --- a/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/controller/PartnerServiceControllerTest.java +++ b/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/controller/PartnerServiceControllerTest.java @@ -1,5 +1,8 @@ package io.mosip.pms.test.partner.controller; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.when; 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.status; @@ -11,14 +14,18 @@ import java.util.ArrayList; import java.util.List; +import io.mosip.pms.common.request.dto.RequestWrapperV2; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.partner.controller.PartnerServiceController; +import io.mosip.pms.partner.dto.CertificateDto; +import io.mosip.pms.partner.dto.PartnerDtoV3; import io.mosip.pms.partner.response.dto.*; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; @@ -26,10 +33,9 @@ import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -44,6 +50,7 @@ import io.mosip.pms.device.util.AuditUtil; import io.mosip.pms.partner.constant.PartnerServiceAuditEnum; import io.mosip.pms.partner.dto.PartnerPolicyMappingResponseDto; +import io.mosip.pms.partner.dto.ApiKeyResponseDto; import io.mosip.pms.partner.manager.service.PartnerManagerService; import io.mosip.pms.partner.request.dto.APIKeyGenerateRequestDto; import io.mosip.pms.partner.request.dto.AddContactRequestDto; @@ -58,6 +65,7 @@ import io.mosip.pms.partner.request.dto.PartnerRequest; import io.mosip.pms.partner.request.dto.PartnerSearchDto; import io.mosip.pms.partner.request.dto.PartnerUpdateRequest; +import io.mosip.pms.partner.request.dto.PartnerRequestDto; import io.mosip.pms.partner.response.dto.APIKeyGenerateResponseDto; import io.mosip.pms.partner.response.dto.APIkeyRequests; import io.mosip.pms.partner.response.dto.CACertificateResponseDto; @@ -72,39 +80,38 @@ @RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc -@EnableWebMvc public class PartnerServiceControllerTest { @Autowired private MockMvc mockMvc; - @Mock + @MockBean private PartnerService partnerService; - - @Mock - PartnerManagerService partnerManagerService; - + + @MockBean + private PartnerManagerService partnerManagerService; + + @MockBean + private AuditUtil auditUtil; + + @Autowired + private PartnerServiceController partnerServiceController; + @Autowired private ObjectMapper objectMapper; - - @Autowired - @Qualifier("selfTokenRestTemplate") - private RestTemplate restTemplate; - - @MockBean - AuditUtil auditUtil; - - @Before - public void setup() { - Mockito.doNothing().when(auditUtil).setAuditRequestDto(Mockito.any(PartnerServiceAuditEnum.class)); - } + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + doNothing().when(auditUtil).setAuditRequestDto(any(PartnerServiceAuditEnum.class), anyString(), anyString()); + } @Test @WithMockUser(roles = {"PARTNER"}) public void partnerSelfRegistrationTest() throws Exception { PartnerResponse response = new PartnerResponse(); - Mockito.when(partnerService.savePartner(Mockito.any())).thenReturn(response); + when(partnerService.savePartner(any())).thenReturn(response); RequestWrapper request = createRequest(); mockMvc.perform(post("/partners").contentType(MediaType.APPLICATION_JSON_VALUE) @@ -114,7 +121,7 @@ public void partnerSelfRegistrationTest() throws Exception { @Test @WithMockUser(roles = {"PARTNER"}) public void addContactsTest() throws Exception { - Mockito.when(partnerService.createAndUpdateContactDetails(Mockito.any(),Mockito.any())).thenReturn(new String()); + when(partnerService.createAndUpdateContactDetails(any(), any())).thenReturn(new String()); mockMvc.perform(post("/partners/12345/contact/add").contentType(MediaType.APPLICATION_JSON_VALUE) .content(objectMapper.writeValueAsString(addContactRequestWrapper()))).andExpect(status().isOk()); } @@ -123,7 +130,7 @@ public void addContactsTest() throws Exception { @WithMockUser(roles = {"PARTNERMANAGER"}) public void uploadCACertificateTest() throws Exception{ CACertificateResponseDto response = new CACertificateResponseDto(); - Mockito.when(partnerService.uploadCACertificate(cACertificateRequest())).thenReturn(response); + when(partnerService.uploadCACertificate(cACertificateRequest())).thenReturn(response); mockMvc.perform(post("/partners/certificate/ca/upload").contentType(MediaType.APPLICATION_JSON_VALUE) .content(objectMapper.writeValueAsString(createCACertificateRequest()))).andExpect(status().isOk()); } @@ -132,7 +139,7 @@ public void uploadCACertificateTest() throws Exception{ @WithMockUser(roles = {"PARTNER"}) public void uploadPartnerCertificateTest() throws Exception{ PartnerCertificateResponseDto response = new PartnerCertificateResponseDto(); - Mockito.when(partnerService.uploadPartnerCertificate(Mockito.any())).thenReturn(response); + when(partnerService.uploadPartnerCertificate(any())).thenReturn(response); mockMvc.perform(post("/partners/certificate/upload").contentType(MediaType.APPLICATION_JSON_VALUE) .content(objectMapper.writeValueAsString(partnerCertificateRequest()))).andExpect(status().isOk()); } @@ -140,7 +147,7 @@ public void uploadPartnerCertificateTest() throws Exception{ @Test @WithMockUser(roles = {"PARTNER"}) public void addBiometricExtractorsTest() throws JsonProcessingException, Exception { - Mockito.when(partnerService.addBiometricExtractors("123456", "12345", getExtractorsInput())).thenReturn(new String()); + when(partnerService.addBiometricExtractors("123456", "12345", getExtractorsInput())).thenReturn(new String()); mockMvc.perform(post("/partners/123456/bioextractors/12345").contentType(MediaType.APPLICATION_JSON_VALUE) .content(objectMapper.writeValueAsString(createAddBiometricExtractorRequest()))).andExpect(status().isOk()); } @@ -149,21 +156,21 @@ public void addBiometricExtractorsTest() throws JsonProcessingException, Excepti @WithMockUser(roles = {"PARTNER"}) public void getCredentialTypePolicyTest() throws Exception{ PartnerCredentialTypePolicyDto response = new PartnerCredentialTypePolicyDto(); - Mockito.when(partnerService.getPartnerCredentialTypePolicy(Mockito.anyString(),Mockito.anyString())).thenReturn(response); + when(partnerService.getPartnerCredentialTypePolicy(anyString(), anyString())).thenReturn(response); mockMvc.perform(MockMvcRequestBuilders.get("/partners/12345/credentialtype/12345/policies")).andExpect(MockMvcResultMatchers.status().isOk()); } @Test @WithMockUser(roles = {"PARTNER"}) public void mapPolicyToCredentialTypeTest() throws Exception{ - Mockito.when(partnerService.mapPartnerPolicyCredentialType(Mockito.anyString(),Mockito.anyString(),Mockito.anyString())).thenReturn(new String()); + when(partnerService.mapPartnerPolicyCredentialType(anyString(), anyString(), anyString())).thenReturn(new String()); mockMvc.perform(MockMvcRequestBuilders.post("/partners/12345/credentialtype/12345/policies/12345")).andExpect(MockMvcResultMatchers.status().isOk()); } @Test @WithMockUser(roles = {"PARTNER"}) public void getBiometricExtractorsTest() throws JsonProcessingException, Exception { - Mockito.when(partnerService.getBiometricExtractors("123456", "12345")).thenReturn(new ExtractorsDto()); + when(partnerService.getBiometricExtractors("123456", "12345")).thenReturn(new ExtractorsDto()); mockMvc.perform(MockMvcRequestBuilders.get("/partners/123456/bioextractors/12345")).andExpect(status().isOk()); } @@ -171,7 +178,7 @@ public void getBiometricExtractorsTest() throws JsonProcessingException, Excepti @WithMockUser(roles = {"PARTNER"}) public void retrievePartnerCertificateTest() throws Exception { PartnerCertDownloadResponeDto partnerCertDownloadResponeDto = new PartnerCertDownloadResponeDto(); - Mockito.when(partnerService.getPartnerCertificate(Mockito.any())).thenReturn(partnerCertDownloadResponeDto); + when(partnerService.getPartnerCertificate(any())).thenReturn(partnerCertDownloadResponeDto); mockMvc.perform(MockMvcRequestBuilders.get("/partners/12345/certificate")).andExpect(MockMvcResultMatchers.status().isOk()); } @@ -180,7 +187,7 @@ public void retrievePartnerCertificateTest() throws Exception { @WithMockUser(roles = {"PARTNER"}) public void retrievePartnerDetailsTest() throws Exception { RetrievePartnerDetailsResponse response = new RetrievePartnerDetailsResponse(); - Mockito.when(partnerService.getPartnerDetails("12345")).thenReturn(response); + when(partnerService.getPartnerDetails("12345")).thenReturn(response); mockMvc.perform(MockMvcRequestBuilders.get("/partners/12345")).andExpect(MockMvcResultMatchers.status().isOk()); } @@ -192,7 +199,7 @@ public void updatePartnerDetailsTest() throws Exception{ response.setPartnerId(partnerId); response.setStatus("true"); - Mockito.when(partnerService.updatePartnerDetail(Mockito.any(), Mockito.any())).thenReturn(response); + when(partnerService.updatePartnerDetail(any(), any())).thenReturn(response); RequestWrapper request = updateRequest(); mockMvc.perform(put("/partners/12345").contentType(MediaType.APPLICATION_JSON_VALUE) @@ -215,7 +222,7 @@ public void retrieveAllApiKeyRequestsSubmittedByPartnerTillDateTest()throws Exce List list_aPIkeyRequests = new ArrayList<>(); list_aPIkeyRequests.add(aPIkeyRequests); - Mockito.when(partnerService.retrieveAllApiKeyRequestsSubmittedByPartner(partnerId)).thenReturn(list_aPIkeyRequests); + when(partnerService.retrieveAllApiKeyRequestsSubmittedByPartner(partnerId)).thenReturn(list_aPIkeyRequests); mockMvc.perform(MockMvcRequestBuilders.get("/partners/12345/apikey/request")).andExpect(MockMvcResultMatchers.status().isOk()); } @@ -270,7 +277,7 @@ public void apikeyRequetsFilterValuesTest() throws Exception{ @Test @WithMockUser(roles = {"PARTNER"}) public void updatePolicyGroup() throws Exception{ - Mockito.when(partnerService.updatePolicyGroup(Mockito.any(),Mockito.any())).thenReturn("Success"); + when(partnerService.updatePolicyGroup(any(), any())).thenReturn("Success"); mockMvc.perform(put("/partners/1234/policygroup/5678")).andExpect(MockMvcResultMatchers.status().isOk()); } @@ -281,32 +288,43 @@ public void isEmailExists() throws Exception{ RequestWrapper request = new RequestWrapper<>(); EmailVerificationRequestDto requestDto = new EmailVerificationRequestDto(); request.setRequest(requestDto); - Mockito.when(partnerService.isPartnerExistsWithEmail(request.getRequest().getEmailId())).thenReturn(response); + when(partnerService.isPartnerExistsWithEmail(request.getRequest().getEmailId())).thenReturn(response); mockMvc.perform(put("/partners/email/verify").contentType(MediaType.APPLICATION_JSON_VALUE) .content(objectMapper.writeValueAsString(request))).andExpect(MockMvcResultMatchers.status().isOk()); } - @Test - @WithMockUser(roles = {"PARTNER"}) - public void mapPolicyToPartner() throws Exception{ - PartnerPolicyMappingResponseDto response = new PartnerPolicyMappingResponseDto(); - RequestWrapper request = new RequestWrapper<>(); - PartnerPolicyMappingRequest requestDto = new PartnerPolicyMappingRequest(); - request.setRequest(requestDto); - Mockito.when(partnerService.requestForPolicyMapping(request.getRequest(),"1234")).thenReturn(response); - mockMvc.perform(post("/partners/1234/policy/map").contentType(MediaType.APPLICATION_JSON_VALUE) - .content(objectMapper.writeValueAsString(request))).andExpect(MockMvcResultMatchers.status().isOk()); + @Test + @WithMockUser(roles = {"AUTH_PARTNER"}) + public void mapPolicyToPartner() throws Exception { + PartnerPolicyMappingResponseDto response = new PartnerPolicyMappingResponseDto(); + RequestWrapper request = new RequestWrapper<>(); + PartnerPolicyMappingRequest requestDto = new PartnerPolicyMappingRequest(); + requestDto.setPolicyName("abc"); + requestDto.setUseCaseDescription("abc"); + request.setRequest(requestDto); + + when(partnerService.requestForPolicyMapping(any(PartnerPolicyMappingRequest.class), eq("1234"))) + .thenReturn(response); + + MvcResult result = mockMvc.perform(post("/partners/1234/policy/map") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isOk()) + .andReturn(); + + String responseContent = result.getResponse().getContentAsString(); } - @Test - - @WithMockUser(roles = {"PARTNER_ADMIN"}) + @Test + @WithMockUser(roles = {"AUTH_PARTNER"}) public void generateAPIKey() throws Exception{ APIKeyGenerateResponseDto response = new APIKeyGenerateResponseDto(); RequestWrapper request = new RequestWrapper<>(); APIKeyGenerateRequestDto requestDto = new APIKeyGenerateRequestDto(); + requestDto.setPolicyName("abc"); + requestDto.setLabel("123"); request.setRequest(requestDto); - Mockito.when(partnerManagerService.generateAPIKey("1234",requestDto)).thenReturn(response); + when(partnerManagerService.generateAPIKey("1234",requestDto)).thenReturn(response); mockMvc.perform(MockMvcRequestBuilders.patch("/partners/1234/generate/apikey").contentType(MediaType.APPLICATION_JSON_VALUE) .content(objectMapper.writeValueAsString(request))).andExpect(MockMvcResultMatchers.status().isOk()); } @@ -318,19 +336,21 @@ public void getPartnerCertificateTest() throws Exception{ RequestWrapper requestWrapper = new RequestWrapper<>(); PartnerCertDownloadRequestDto requestDto = new PartnerCertDownloadRequestDto(); requestWrapper.setRequest(requestDto); - Mockito.when(partnerService.getPartnerCertificate(requestDto)).thenReturn(certDownloadResponeDto); + when(partnerService.getPartnerCertificate(requestDto)).thenReturn(certDownloadResponeDto); mockMvc.perform(MockMvcRequestBuilders.get("/partners/1234/certificate")).andExpect(MockMvcResultMatchers.status().isOk()); } @Test @WithMockUser(roles = {"PARTNER"}) - public void getOriginalPartnerCertificateTest() throws Exception{ + public void getPartnerCertificateDataTest() throws Exception{ + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); OriginalCertDownloadResponseDto originalCertDownloadResponseDto = new OriginalCertDownloadResponseDto(); - RequestWrapper requestWrapper = new RequestWrapper<>(); + RequestWrapperV2 requestWrapper = new RequestWrapperV2<>(); PartnerCertDownloadRequestDto requestDto = new PartnerCertDownloadRequestDto(); requestWrapper.setRequest(requestDto); - Mockito.when(partnerService.getOriginalPartnerCertificate(requestDto)).thenReturn(originalCertDownloadResponseDto); - mockMvc.perform(MockMvcRequestBuilders.get("/partners/1234/originalPartnerCertificate")).andExpect(MockMvcResultMatchers.status().isOk()); + responseWrapper.setResponse(originalCertDownloadResponseDto); + when(partnerService.getPartnerCertificateData(requestDto)).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/partners/1234/certificate-data")).andExpect(MockMvcResultMatchers.status().isOk()); } private RequestWrapper createFilterRequest(){ @@ -569,6 +589,103 @@ private AddContactRequestDto addContactRequestDto() { dto.setIs_Active(true); return dto; } - - + + @Test + @WithMockUser(roles = {"AUTH_PARTNER"}) + public void getPartnerCertificatesDetailsTest() throws Exception { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + + CertificateDto certificateDto = new CertificateDto(); + certificateDto.setPartnerId("abc"); + certificateDto.setPartnerType("Auth_Partner"); + certificateDto.setIsCertificateAvailable(false); + + List certificateDtoList = new ArrayList<>(); + certificateDtoList.add(certificateDto); + + responseWrapper.setResponse(certificateDtoList); + when(partnerService.getPartnerCertificatesDetails()).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/partners/partner-certificates-details")).andExpect(MockMvcResultMatchers.status().isOk()); + } + + @Test + @WithMockUser(roles = {"PARTNER"}) + public void getPartnersV3Test() throws Exception { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + PartnerDtoV3 partnerDto = new PartnerDtoV3(); + + List partnerDtoList = new ArrayList<>(); + partnerDtoList.add(partnerDto); + responseWrapper.setResponse(partnerDtoList); + + Mockito.when(partnerService.getPartnersV3(Mockito.anyString(), Mockito.any(), Mockito.any())) + .thenReturn(responseWrapper); + + mockMvc.perform(MockMvcRequestBuilders.get("/partners/v3") + .param("status", "approved") + .param("policyGroupAvailable", "true") + .param("partnerType", "Auth_Partner")) + .andExpect(status().isOk()); + } + + @Test + @WithMockUser(roles = {"PARTNER"}) + public void getPartnersV3Test2() throws Exception { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + PartnerDtoV3 partnerDto = new PartnerDtoV3(); + + List partnerDtoList = new ArrayList<>(); + partnerDtoList.add(partnerDto); + responseWrapper.setResponse(partnerDtoList); + + Mockito.when(partnerService.getPartnersV3(Mockito.anyString(), Mockito.any(), Mockito.any())) + .thenReturn(responseWrapper); + + mockMvc.perform(MockMvcRequestBuilders.get("/partners/v3") + .param("status", "approved") + .param("partnerType", "Device_Provider")) + .andExpect(status().isOk()); + } + @Test + @WithMockUser(roles = {"AUTH_PARTNER"}) + public void testPartnerRegistration() throws Exception { + PartnerRequestDto partnerRequestDto = new PartnerRequestDto(); + partnerRequestDto.setPartnerId("12345"); + partnerRequestDto.setOrganizationName("abc"); + partnerRequestDto.setAddress("abc"); + partnerRequestDto.setContactNumber("283282822"); + partnerRequestDto.setEmailId("abc@email.com"); + partnerRequestDto.setPartnerType("AUTH_PARTNER"); + + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequest(partnerRequestDto); + + PartnerResponse partnerResponse = new PartnerResponse(); + partnerResponse.setPartnerId("12345"); + + Mockito.when(partnerService.registerPartner(partnerRequestDto)).thenReturn(partnerResponse); + + mockMvc.perform(post("/partners/v2") + .contentType(MediaType.APPLICATION_JSON) + .content(new ObjectMapper().writeValueAsString(requestWrapper))) + .andExpect(status().isOk()).andReturn(); + } + + @Test + @WithMockUser(roles = {"AUTH_PARTNER"}) + public void testGetPartnersV3() throws Exception { + List partnerDtoV3List = new ArrayList<>(); + PartnerDtoV3 partnerDto = new PartnerDtoV3(); + partnerDto.setPartnerId("123"); + partnerDtoV3List.add(partnerDto); + + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + responseWrapper.setResponse(partnerDtoV3List); + + Mockito.when(partnerService.getPartnersV3("approved", true, "typeA")).thenReturn(responseWrapper); + + mockMvc.perform(MockMvcRequestBuilders.get("/partners/v3?status=approved")).andExpect(MockMvcResultMatchers.status().isOk()); + + } + } \ No newline at end of file diff --git a/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/controller/UserControllerTest.java b/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/controller/UserControllerTest.java index 4d19bfb00f..635843bd37 100644 --- a/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/controller/UserControllerTest.java +++ b/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/controller/UserControllerTest.java @@ -1,11 +1,14 @@ package io.mosip.pms.test.partner.controller; +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.result.MockMvcResultMatchers.status; import java.time.ZoneOffset; import java.time.ZonedDateTime; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.partner.dto.UserDetailsDto; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; @@ -38,8 +41,7 @@ public class UserControllerTest { @MockBean UserManagementService userManagementService; - - + @Autowired private ObjectMapper objectMapper; @@ -64,4 +66,33 @@ private RequestWrapper createRequest() { request.setVersion("1.0"); return request; } + + @Test + @WithMockUser(roles = {"AUTH_PARTNER"}) + public void saveUserConsent() throws Exception { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + UserDetailsDto userDetailsDto = new UserDetailsDto(); + responseWrapper.setResponse(userDetailsDto); + Mockito.when(userManagementService.saveUserConsent()).thenReturn(responseWrapper); + mockMvc.perform(post("/users/user-consent").contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } + + @Test + @WithMockUser(roles = {"AUTH_PARTNER"}) + public void isUserConsentGiven() throws Exception { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + UserDetailsDto userDetailsDto = new UserDetailsDto(); + responseWrapper.setResponse(userDetailsDto); + Mockito.when(userManagementService.isUserConsentGiven()).thenReturn(responseWrapper); + mockMvc.perform(get("/users/user-consent").contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()); + } + + @Test + @WithMockUser(roles = {"AUTH_PARTNER"}) + public void getConfigValuesTest() throws Exception { + mockMvc.perform(get("/system-config").contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()); + } } diff --git a/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/service/impl/MultiPartnerServiceImplTest.java b/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/service/impl/MultiPartnerServiceImplTest.java deleted file mode 100644 index 45e9d26ece..0000000000 --- a/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/service/impl/MultiPartnerServiceImplTest.java +++ /dev/null @@ -1,758 +0,0 @@ -package io.mosip.pms.test.partner.service.impl; - -import io.mosip.kernel.openid.bridge.model.AuthUserDetails; -import io.mosip.pms.common.dto.UserDetails; -import io.mosip.pms.common.entity.*; -import io.mosip.pms.common.repository.*; -import io.mosip.pms.common.util.RestUtil; -import io.mosip.pms.partner.exception.PartnerServiceException; -import io.mosip.pms.partner.service.impl.MultiPartnerServiceImpl; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.core.env.Environment; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.test.context.junit4.SpringRunner; - -import java.sql.Timestamp; -import java.time.LocalDateTime; -import java.util.*; - -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.when; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class MultiPartnerServiceImplTest { - - @Autowired - MultiPartnerServiceImpl multiPartnerServiceImpl; - - @MockBean - RestUtil restUtil; - - @MockBean - PartnerServiceRepository partnerRepository; - - @MockBean - PolicyGroupRepository policyGroupRepository; - - @MockBean - AuthPolicyRepository authPolicyRepository; - - @MockBean - PartnerPolicyRepository partnerPolicyRepository; - - @MockBean - UserDetailsRepository userDetailsRepository; - - @Mock - Environment environment; - @Mock - Authentication authentication; - @Mock - SecurityContext securityContext; - - @Test - public void getPartnerCertificatesTest() throws Exception { - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId("123"); - partner.setCertificateAlias("abs"); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - Map apiResponse = new HashMap<>(); - Map response = new HashMap<>(); - response.put("certificateData", "-----BEGIN CERTIFICATE-----\n" + - "MIIFfTCCA2WgAwIBAgIUOVZNyD46U0OAEhaGC/Y7NXbu+OkwDQYJKoZIhvcNAQEL\n" + - "BQAwTjELMAkGA1UEBhMCSU4xCzAJBgNVBAgMAk1IMQswCQYDVQQHDAJQTjELMAkG\n" + - "A1UECgwCQ0ExCzAJBgNVBAsMAkNBMQswCQYDVQQDDAJDQTAeFw0yNDA1MDkwNzI1\n" + - "MDJaFw0yOTA1MDkwNzI1MDJaME4xCzAJBgNVBAYTAklOMQswCQYDVQQIDAJNSDEL\n" + - "MAkGA1UEBwwCUE4xCzAJBgNVBAoMAkNBMQswCQYDVQQLDAJDQTELMAkGA1UEAwwC\n" + - "Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzdWD2DvhSnmLqU3fX\n" + - "RT3z8ikS6qHxn5Hu/a2ijkuZxAZj0UCUJ83kM20NwocJDHT1qx6+yjdl+BECsgoI\n" + - "ro9MXgFOsHCphyR5KiP4mY95qRlE03h7WBfr4wDn/6f5tCbqCcBqdXMAQxUp34D+\n" + - "Pro0EwkXNulHNMTvz5hpoCEiGyfXUP48I4q2nb8rMXaplhqz+vAYgA4rsK6K9IUh\n" + - "uJDxtZRHdIfxnvbfjxDbuPkN0ehOQ1uQrDVY6ENCIUxdgR/p94kZ+CNsD21c57gJ\n" + - "2wYg+BceQn1rVSGnfpqMoogZCMUWFvaE4i91419VXxDLgeC/4Qw8n5onBY+dVHjW\n" + - "04OolR2DqotFyaPlZiVdpUys6+KZ7fS9mwWEY0kqtLzcBeb4g4nPvObfKnqSmVMZ\n" + - "DHRuAx6MG3oFZrnNuS6oIYGwLpoko6iqEiGohHsSxMulT43XOxoNgDq9noQc9SYv\n" + - "tzdzijBRLAxNBDTB0rgZra27tLIFlqP1TpqZtM3ThOmPJQn6JG8WeiVWnmUkpmXX\n" + - "6opGqhLWMM/u1n4fdf716h7340RbCPJoOpTPphYo/WedFQskqZvhTU6HMIj4JQAj\n" + - "OVVwgtrDOdx051ps2hhiSU5tL4LmjLHIsfyoCSuHkzBhVMZ/jKFm8C4Or2RRG85A\n" + - "wtzEANSxVZRjw6S1hsHsI+8m2QIDAQABo1MwUTAdBgNVHQ4EFgQUjDli1GMiclHK\n" + - "igNm2kuKh48AON8wHwYDVR0jBBgwFoAUjDli1GMiclHKigNm2kuKh48AON8wDwYD\n" + - "VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAk6IWcDdBc1tngCaPNLhU\n" + - "c3pXRdTjDuLHMxHRiP/7Vi3V2xcKRak5ZMzYAJK6YThp3Z04V9d5jJoi/CDhMuPK\n" + - "RV1GmbdA7b24Jic2fQHWOJkgafT2Gx4yHmLo5ctSuDHPfSvzUgeghG0k3eNJgCai\n" + - "Ctr+wvCRZGvvbl2JnJUcWiHBxH/PaWJ4Jd1T4UKmhlFhTw26TXQGHuW/UJwgh8OR\n" + - "V8A+WeMXxKFsh38b8RnWVa6XdajIq9UAZvvd4Q16zjdnMWx/7zcIK5D1MDb/KmSJ\n" + - "yho1LKRZx5YtSeI4FWs8dzZ0nCCiTe7TrnnhlXThJ6rXeo5AshtM4fGrvizaf4n3\n" + - "7I9mJkqiccp1ml+2EcgsdX7HbnGE/R8VVbh3jUhWHuysLCiVSMbjnktCLWoXjSb9\n" + - "JqOYF3yo6JQslQB0fQMyKmvsn/FplQBbU0PUrg9vpAg9nZlZf3UHO5z072pXD6ky\n" + - "5pKjh+q0JOk00Eln9AoU6YuIyPBQ9mI3X8iYB5UhUBbgAPeg1pwWCWhdt40f0D5t\n" + - "JkVnICy+Gh1ps8QPA6coEaajbIq14Uh6eYEwxFHPsxlbn7pzjoCJG2v7N8VwgfuL\n" + - "DdGs4hFikdUAfBT/Diug/n9/ZgfdN6Ctf4U/SM65vZvfRqtLIoTIs4PcF3YtKK04\n" + - "m0UA3Sxxre0vVWYO4GmmZUY=\n" + - "-----END CERTIFICATE-----"); - apiResponse.put("response", response); - - when(environment.getProperty("pmp.partner.certificaticate.get.rest.uri")).thenReturn("uri"); - when(restUtil.getApi(anyString(), any(), eq(Map.class))).thenReturn(apiResponse); - multiPartnerServiceImpl.getAllCertificateDetails(); - } - - @Test(expected = PartnerServiceException.class) - public void getPartnerCertificatesTestException() throws Exception { - multiPartnerServiceImpl.getAllCertificateDetails(); - } - - @Test - public void getPartnerCertificatesTestException1() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId(""); - partner.setCertificateAlias(""); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - multiPartnerServiceImpl.getAllCertificateDetails(); - } - - @Test(expected = PartnerServiceException.class) - public void getPartnerCertificatesTestException2() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - multiPartnerServiceImpl.getAllCertificateDetails(); - } - - @Test - public void getAllPoliciesTest() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId("123"); - partner.setPartnerTypeCode("AUTH"); - partner.setPolicyGroupId("abc"); - List partnerPolicyRequestList = new ArrayList<>(); - PartnerPolicyRequest partnerPolicyRequest = new PartnerPolicyRequest(); - partnerPolicyRequest.setPolicyId("xyz"); - partnerPolicyRequest.setCrDtimes(Timestamp.valueOf(LocalDateTime.now())); - partnerPolicyRequest.setStatusCode("approved"); - partnerPolicyRequestList.add(partnerPolicyRequest); - partner.setPartnerPolicyRequests(partnerPolicyRequestList); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - PolicyGroup policyGroup = new PolicyGroup(); - policyGroup.setId("abc"); - policyGroup.setName("group1"); - policyGroup.setDesc("dgvhsd"); - when(policyGroupRepository.findPolicyGroupById(anyString())).thenReturn(policyGroup); - - String policyGroupName = "test"; - AuthPolicy authPolicy = new AuthPolicy(); - authPolicy.setName("policy123"); - when(policyGroupRepository.findPolicyGroupNameById(anyString())).thenReturn(policyGroupName); - when(authPolicyRepository.findByPolicyGroupAndId(anyString(), anyString())).thenReturn(authPolicy); - multiPartnerServiceImpl.getAllRequestedPolicies(); - - when(authPolicyRepository.findByPolicyGroupAndId(anyString(), anyString())).thenReturn(null); - multiPartnerServiceImpl.getAllRequestedPolicies(); - } - - @Test - public void getAllPoliciesTest1() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId("123"); - partner.setPartnerTypeCode("AUTH"); - partner.setPolicyGroupId("abc"); - List partnerPolicyRequestList = new ArrayList<>(); - partner.setPartnerPolicyRequests(partnerPolicyRequestList); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - PolicyGroup policyGroup = new PolicyGroup(); - policyGroup.setId("abc"); - policyGroup.setName("group1"); - policyGroup.setDesc("dgvhsd"); - when(policyGroupRepository.findPolicyGroupById(anyString())).thenReturn(policyGroup); - - AuthPolicy authPolicy = new AuthPolicy(); - authPolicy.setName("policy123"); - when(authPolicyRepository.findByPolicyGroupAndId(anyString(), anyString())).thenReturn(authPolicy); - - multiPartnerServiceImpl.getAllRequestedPolicies(); - } - - @Test - public void getAllPoliciesTest2() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId("123"); - partner.setPartnerTypeCode(""); - partner.setPolicyGroupId("abc"); - List partnerPolicyRequestList = new ArrayList<>(); - PartnerPolicyRequest partnerPolicyRequest = new PartnerPolicyRequest(); - partnerPolicyRequest.setPolicyId("xyz"); - partnerPolicyRequest.setCrDtimes(Timestamp.valueOf(LocalDateTime.now())); - partnerPolicyRequest.setStatusCode("approved"); - partnerPolicyRequestList.add(partnerPolicyRequest); - partner.setPartnerPolicyRequests(partnerPolicyRequestList); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - multiPartnerServiceImpl.getAllRequestedPolicies(); - } - - @Test - public void getAllPoliciesTest3() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId(""); - partner.setPartnerTypeCode("Auth_Partner"); - partner.setPolicyGroupId("abc"); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - multiPartnerServiceImpl.getAllRequestedPolicies(); - } - - @Test - public void getAllPoliciesTest4() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId("ddd"); - partner.setPartnerTypeCode("Auth_Partner"); - partner.setPolicyGroupId(""); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - multiPartnerServiceImpl.getAllRequestedPolicies(); - } - - @Test(expected = PartnerServiceException.class) - public void getAllPoliciesTestException() throws Exception { - multiPartnerServiceImpl.getAllRequestedPolicies(); - } - - @Test(expected = PartnerServiceException.class) - public void getAllPoliciesTestException1() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - multiPartnerServiceImpl.getAllRequestedPolicies(); - } - - - @Test - public void getAllApprovedAuthPartnerPolicies() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId("123"); - partner.setPartnerTypeCode("Auth_Partner"); - partner.setPolicyGroupId("abc"); - partner.setApprovalStatus("approved"); - List partnerPolicyRequestList = new ArrayList<>(); - PartnerPolicyRequest partnerPolicyRequest = new PartnerPolicyRequest(); - partnerPolicyRequest.setPolicyId("xyz"); - partnerPolicyRequest.setCrDtimes(Timestamp.valueOf(LocalDateTime.now())); - partnerPolicyRequest.setStatusCode("approved"); - partnerPolicyRequestList.add(partnerPolicyRequest); - partner.setPartnerPolicyRequests(partnerPolicyRequestList); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - PolicyGroup policyGroup = new PolicyGroup(); - policyGroup.setId("abc"); - policyGroup.setName("group1"); - policyGroup.setDesc("dgvhsd"); - when(policyGroupRepository.findPolicyGroupById(anyString())).thenReturn(policyGroup); - - AuthPolicy authPolicy = new AuthPolicy(); - authPolicy.setName("policy123"); - when(authPolicyRepository.findActivePoliciesByPolicyGroupId(anyString(), anyString())).thenReturn(authPolicy); - multiPartnerServiceImpl.getAllApprovedAuthPartnerPolicies(); - - when(authPolicyRepository.findActivePoliciesByPolicyGroupId(anyString(), anyString())).thenReturn(null); - multiPartnerServiceImpl.getAllApprovedAuthPartnerPolicies(); - } - - @Test - public void getAllApprovedAuthPartnerPoliciesTest1() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId("123"); - partner.setPartnerTypeCode("Auth_Partner"); - partner.setPolicyGroupId("abc"); - partner.setApprovalStatus("approved"); - List partnerPolicyRequestList = new ArrayList<>(); - partner.setPartnerPolicyRequests(partnerPolicyRequestList); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - PolicyGroup policyGroup = new PolicyGroup(); - policyGroup.setId("abc"); - policyGroup.setName("group1"); - policyGroup.setDesc("dgvhsd"); - when(policyGroupRepository.findPolicyGroupById(anyString())).thenReturn(policyGroup); - - AuthPolicy authPolicy = new AuthPolicy(); - authPolicy.setName("policy123"); - when(authPolicyRepository.findActivePoliciesByPolicyGroupId(anyString(), anyString())).thenReturn(authPolicy); - multiPartnerServiceImpl.getAllApprovedAuthPartnerPolicies(); - } - - @Test - public void getAllApprovedAuthPartnerPoliciesTest2() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId("123"); - partner.setPartnerTypeCode(""); - partner.setPolicyGroupId("abc"); - partner.setApprovalStatus("approved"); - List partnerPolicyRequestList = new ArrayList<>(); - partner.setPartnerPolicyRequests(partnerPolicyRequestList); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - multiPartnerServiceImpl.getAllApprovedAuthPartnerPolicies(); - } - - @Test - public void getAllApprovedAuthPartnerPoliciesTest3() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId("123"); - partner.setPartnerTypeCode("Auth_Partner"); - partner.setPolicyGroupId("abc"); - partner.setApprovalStatus(""); - List partnerPolicyRequestList = new ArrayList<>(); - partner.setPartnerPolicyRequests(partnerPolicyRequestList); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - multiPartnerServiceImpl.getAllApprovedAuthPartnerPolicies(); - } - - @Test(expected = PartnerServiceException.class) - public void getAllApprovedAuthPartnerPoliciesException() throws Exception { - multiPartnerServiceImpl.getAllApprovedAuthPartnerPolicies(); - } - - @Test(expected = PartnerServiceException.class) - public void getAllApprovedAuthPartnerPoliciesException1() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - multiPartnerServiceImpl.getAllApprovedAuthPartnerPolicies(); - } - @Test - public void getAllApprovedPolicyGroupsTest() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId("123"); - partner.setPartnerTypeCode("Auth_Partner"); - partner.setPolicyGroupId("abc"); - partner.setApprovalStatus("approved"); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - PolicyGroup policyGroup = new PolicyGroup(); - policyGroup.setId("abc"); - policyGroup.setName("group1"); - policyGroup.setDesc("dgvhsd"); - when(policyGroupRepository.findPolicyGroupById(anyString())).thenReturn(policyGroup); - multiPartnerServiceImpl.getAllApprovedPartnerIdsWithPolicyGroups(); - - PolicyGroup policyGroup1 = new PolicyGroup(); - when(policyGroupRepository.findPolicyGroupById(anyString())).thenReturn(policyGroup1); - multiPartnerServiceImpl.getAllApprovedPartnerIdsWithPolicyGroups(); - } - - @Test(expected = PartnerServiceException.class) - public void getAllApprovedPolicyGroupsTestException() throws Exception { - multiPartnerServiceImpl.getAllApprovedPartnerIdsWithPolicyGroups(); - } - - @Test(expected = PartnerServiceException.class) - public void getAllApprovedPolicyGroupsTestException1() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - multiPartnerServiceImpl.getAllApprovedPartnerIdsWithPolicyGroups(); - } - - @Test - public void getAllApiKeysForAuthPartnersTest() throws Exception{ - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId("123"); - partner.setPartnerTypeCode("Auth_Partner"); - partner.setPolicyGroupId("abc"); - partner.setApprovalStatus("approved"); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - - PartnerPolicy partnerPolicy = new PartnerPolicy(); - partnerPolicy.setPolicyApiKey("apikey123"); - partnerPolicy.setLabel("request"); - partnerPolicy.setIsActive(true); - partnerPolicy.setPartner(partner); - partnerPolicy.setPolicyId("test"); - List partnerPolicies = new ArrayList<>(); - partnerPolicies.add(partnerPolicy); - when(partnerPolicyRepository.findAPIKeysByPartnerId(anyString())).thenReturn(partnerPolicies); - - AuthPolicy authPolicy = new AuthPolicy(); - authPolicy.setId("test"); - authPolicy.setName("hjfvhd"); - authPolicy.setDescr("tttt"); - PolicyGroup policyGroup = new PolicyGroup(); - policyGroup.setId("abc"); - policyGroup.setName("group1"); - policyGroup.setDesc("group1d"); - authPolicy.setPolicyGroup(policyGroup); - Optional authPolicyDetails = Optional.of(authPolicy); - when(authPolicyRepository.findById(anyString())).thenReturn(authPolicyDetails); - multiPartnerServiceImpl.getAllApiKeysForAuthPartners(); - } - - @Test - public void getAllApiKeysForAuthPartnersTest1() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId("123"); - partner.setPartnerTypeCode("Auth_Partner"); - partner.setPolicyGroupId("abc"); - partner.setApprovalStatus("approved"); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - - PartnerPolicy partnerPolicy = new PartnerPolicy(); - partnerPolicy.setPolicyApiKey("apikey123"); - partnerPolicy.setLabel("request"); - partnerPolicy.setIsActive(false); - partnerPolicy.setPartner(partner); - partnerPolicy.setPolicyId("test"); - List partnerPolicies = new ArrayList<>(); - partnerPolicies.add(partnerPolicy); - when(partnerPolicyRepository.findAPIKeysByPartnerId(anyString())).thenReturn(partnerPolicies); - - AuthPolicy authPolicy = new AuthPolicy(); - authPolicy.setId("test"); - authPolicy.setName("hjfvhd"); - authPolicy.setDescr("tttt"); - PolicyGroup policyGroup = new PolicyGroup(); - policyGroup.setId("abc"); - policyGroup.setName("group1"); - policyGroup.setDesc("group1d"); - authPolicy.setPolicyGroup(policyGroup); - Optional authPolicyDetails = Optional.of(authPolicy); - when(authPolicyRepository.findById(anyString())).thenReturn(authPolicyDetails); - multiPartnerServiceImpl.getAllApiKeysForAuthPartners(); - } - - @Test - public void getAllApiKeysForAuthPartnersTest2() throws Exception{ - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId("123"); - partner.setPartnerTypeCode("Auth_Partner"); - partner.setPolicyGroupId("abc"); - partner.setApprovalStatus("approved"); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - - PartnerPolicy partnerPolicy = new PartnerPolicy(); - partnerPolicy.setPolicyApiKey("apikey123"); - partnerPolicy.setLabel("request"); - partnerPolicy.setIsActive(true); - partnerPolicy.setPartner(partner); - partnerPolicy.setPolicyId("test"); - List partnerPolicies = new ArrayList<>(); - partnerPolicies.add(partnerPolicy); - when(partnerPolicyRepository.findAPIKeysByPartnerId(anyString())).thenReturn(partnerPolicies); - multiPartnerServiceImpl.getAllApiKeysForAuthPartners(); - - AuthPolicy authPolicy = new AuthPolicy(); - Optional authPolicyDetails = Optional.of(authPolicy); - when(authPolicyRepository.findById(anyString())).thenReturn(authPolicyDetails); - multiPartnerServiceImpl.getAllApiKeysForAuthPartners(); - } - - @Test(expected = PartnerServiceException.class) - public void getAllApiKeysForAuthPartnersTestException() throws Exception { - multiPartnerServiceImpl.getAllApiKeysForAuthPartners(); - } - - @Test(expected = PartnerServiceException.class) - public void getAllApiKeysForAuthPartnersTestException1() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - multiPartnerServiceImpl.getAllApiKeysForAuthPartners(); - } - - @Test - public void saveUserConsentGivenTest() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId("123"); - partner.setPartnerTypeCode("Auth_Partner"); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - - UserDetails userDetails = new UserDetails(); - userDetails.setUserId("123"); - userDetails.setId("abc"); - userDetails.setCrDtimes(LocalDateTime.now()); - userDetails.setCrBy("abc"); - Optional optionalEntity = Optional.of(new UserDetails()); - when(userDetailsRepository.findByUserId(anyString())).thenReturn(optionalEntity); - when(userDetailsRepository.save(any())).thenReturn(userDetails); - multiPartnerServiceImpl.saveUserConsentGiven(); - } - - @Test - public void saveUserConsentGivenTest1() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId("123"); - partner.setPartnerTypeCode("Auth_Partner"); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - - UserDetails userDetails = new UserDetails(); - userDetails.setUserId("123"); - userDetails.setId("abc"); - userDetails.setCrDtimes(LocalDateTime.now()); - userDetails.setCrBy("abc"); - when(userDetailsRepository.save(any())).thenReturn(userDetails); - multiPartnerServiceImpl.saveUserConsentGiven(); - } - - @Test(expected = PartnerServiceException.class) - public void saveUserConsentGivenExceptionTest() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - multiPartnerServiceImpl.saveUserConsentGiven(); - } - @Test(expected = PartnerServiceException.class) - public void saveUserConsentGivenExceptionTest1() throws Exception { - multiPartnerServiceImpl.saveUserConsentGiven(); - } - - @Test - public void isUserConsentGivenTest() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - partner.setId("123"); - partner.setPartnerTypeCode("Auth_Partner"); - partnerList.add(partner); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - UserDetails userDetails = new UserDetails(); - userDetails.setUserId("123"); - userDetails.setId("abc"); - userDetails.setCrDtimes(LocalDateTime.now()); - userDetails.setCrBy("abc"); - userDetails.setConsentGiven("YES"); - userDetails.setConsentGivenDtimes(LocalDateTime.now()); - Optional optionalEntity = Optional.of(userDetails); - when(userDetailsRepository.findByUserId(anyString())).thenReturn(optionalEntity); - multiPartnerServiceImpl.isUserConsentGiven(); - } - - @Test(expected = PartnerServiceException.class) - public void isUserConsentGivenExceptionTest() throws Exception { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); - AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); - SecurityContextHolder.setContext(securityContext); - when(authentication.getPrincipal()).thenReturn(authUserDetails); - when(securityContext.getAuthentication()).thenReturn(authentication); - - List partnerList = new ArrayList<>(); - Partner partner = new Partner(); - when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); - when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); - multiPartnerServiceImpl.isUserConsentGiven(); - } - - @Test(expected = PartnerServiceException.class) - public void isUserConsentGivenExceptionTest1() throws Exception { - multiPartnerServiceImpl.isUserConsentGiven(); - } - - private io.mosip.kernel.openid.bridge.model.MosipUserDto getMosipUserDto() { - io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = new io.mosip.kernel.openid.bridge.model.MosipUserDto(); - mosipUserDto.setUserId("123"); - mosipUserDto.setMail("abc@gmail.com"); - return mosipUserDto; - } -} diff --git a/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/service/impl/PartnerManagementServiceImplTest.java b/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/service/impl/PartnerManagementServiceImplTest.java index 671e76e244..84166f4efd 100644 --- a/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/service/impl/PartnerManagementServiceImplTest.java +++ b/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/service/impl/PartnerManagementServiceImplTest.java @@ -1,16 +1,25 @@ package io.mosip.pms.test.partner.service.impl; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.sql.Timestamp; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; +import io.mosip.kernel.openid.bridge.model.AuthUserDetails; +import io.mosip.kernel.openid.bridge.model.MosipUserDto; +import io.mosip.pms.common.dto.PageResponseV2Dto; +import io.mosip.pms.common.entity.*; +import io.mosip.pms.common.repository.*; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.partner.manager.dto.*; +import io.mosip.pms.partner.response.dto.PartnerCertDownloadResponeDto; +import io.mosip.pms.partner.util.PartnerHelper; import org.json.simple.JSONObject; import org.junit.Before; import org.junit.Test; @@ -24,7 +33,14 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; -import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.core.env.Environment; +import org.springframework.data.domain.Page; +import org.springframework.http.MediaType; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.test.context.support.WithUserDetails; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.util.ReflectionTestUtils; @@ -32,32 +48,16 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import io.mosip.pms.common.entity.AuthPolicy; -import io.mosip.pms.common.entity.MISPLicenseEntity; -import io.mosip.pms.common.entity.Partner; -import io.mosip.pms.common.entity.PartnerPolicy; -import io.mosip.pms.common.entity.PartnerPolicyRequest; -import io.mosip.pms.common.entity.PolicyGroup; import io.mosip.pms.common.helper.WebSubPublisher; -import io.mosip.pms.common.repository.AuthPolicyRepository; -import io.mosip.pms.common.repository.BiometricExtractorProviderRepository; -import io.mosip.pms.common.repository.MispLicenseRepository; -import io.mosip.pms.common.repository.PartnerPolicyRepository; -import io.mosip.pms.common.repository.PartnerPolicyRequestRepository; -import io.mosip.pms.common.repository.PartnerRepository; -import io.mosip.pms.common.repository.PolicyGroupRepository; import io.mosip.pms.common.service.NotificatonService; import io.mosip.pms.common.util.RestUtil; import io.mosip.pms.device.util.AuditUtil; import io.mosip.pms.partner.manager.constant.ErrorCode; import io.mosip.pms.partner.manager.constant.PartnerManageEnum; -import io.mosip.pms.partner.manager.dto.PartnersPolicyMappingRequest; -import io.mosip.pms.partner.manager.dto.StatusRequestDto; import io.mosip.pms.partner.manager.exception.PartnerManagerServiceException; import io.mosip.pms.partner.manager.service.impl.PartnerManagementServiceImpl; import io.mosip.pms.partner.request.dto.APIKeyGenerateRequestDto; import io.mosip.pms.partner.request.dto.APIkeyStatusUpdateRequestDto; -import io.mosip.pms.test.PartnerManagementServiceTest; import io.mosip.pms.test.config.TestSecurityConfig; @SpringBootTest @@ -74,12 +74,18 @@ public class PartnerManagementServiceImplTest { @Mock PartnerRepository partnerRepository; + + @Mock + PartnerServiceRepository partnerServiceRepository; @Mock PartnerPolicyRequestRepository partnerPolicyRequestRepository; @Mock PolicyGroupRepository policyGroupRepository; + + @Mock + PartnerSummaryRepository partnerSummaryRepository; @Mock AuthPolicyRepository authPolicyRepository; @@ -92,6 +98,15 @@ public class PartnerManagementServiceImplTest { @Mock private WebSubPublisher webSubPublisher; + + @Mock + Authentication authentication; + + @Mock + SecurityContext securityContext; + + @Mock + PartnerHelper partnerHelper; @Autowired @Qualifier("selfTokenRestTemplate") @@ -108,6 +123,15 @@ public class PartnerManagementServiceImplTest { @Mock private ObjectMapper mapper; + + @Mock + ApiKeyRequestSummaryRepository apiKeyRequestSummaryRepository; + + @Mock + PartnerPolicyMappingRequestRepository partnerPolicyMappingRequestRepository; + + @Mock + Environment environment; @Before public void setUp() { @@ -594,7 +618,6 @@ public void activateDeactivateAuthEKYCPartnerTest_S6() { req.setStatus("Active"); String partnerId = "12345"; Optional partner = Optional.of(getPartner()); - partner.get().setIsActive(false); Mockito.when(partnerRepository.findById(partnerId)).thenReturn(partner); Mockito.when(restUtil.getApi(Mockito.anyString(), Mockito.any(), Mockito.any())).thenReturn(response); partnerManagementImpl.activateDeactivateAuthEKYCPartner(partnerId, req); @@ -776,12 +799,24 @@ public void getTheRequestForPartnerAPIKeyToPolicyMappingsForGivenRequestIdTest_S } @Test - public void updateAPIKeyStatusTest01() { + public void updateAPIKeyStatusTest01() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { APIkeyStatusUpdateRequestDto statusDto = new APIkeyStatusUpdateRequestDto(); statusDto.setLabel("456"); statusDto.setStatus("De-Activate"); Mockito.when(partnerPolicyRepository.findByPartnerIdPolicyIdAndLabel(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(getPartnerPolicy()); + + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("PARTNER_ADMIN") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); try { partnerManagementImpl.updateAPIKeyStatus("1234", "456",statusDto); }catch (PartnerManagerServiceException e) { @@ -790,13 +825,26 @@ public void updateAPIKeyStatusTest01() { } @Test - public void updateAPIKeyStatusTest02() { + public void updateAPIKeyStatusTest02() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { APIkeyStatusUpdateRequestDto statusDto = new APIkeyStatusUpdateRequestDto(); statusDto.setLabel("456"); statusDto.setStatus("De-Active"); Mockito.when(partnerPolicyRepository.findByPartnerIdPolicyIdAndLabel(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(getPartnerPolicy()); Mockito.when(authPolicyRepository.findById(Mockito.any())).thenReturn(Optional.of(getAuthPolicies().get(0))); + + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("PARTNER_ADMIN") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + partnerManagementImpl.updateAPIKeyStatus("1234", "456", statusDto); } @@ -816,13 +864,26 @@ public void updateAPIKeyStatusTest03() { } @Test - public void updateAPIKeyStatusTest04() { + public void updateAPIKeyStatusTest04() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { APIkeyStatusUpdateRequestDto statusDto = new APIkeyStatusUpdateRequestDto(); statusDto.setLabel("456"); statusDto.setStatus("Active"); Mockito.when(partnerPolicyRepository.findByPartnerIdPolicyIdAndLabel(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(getPartnerPolicy()); Mockito.when(authPolicyRepository.findById(Mockito.any())).thenReturn(Optional.of(getAuthPolicies().get(0))); + + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("PARTNER_ADMIN") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + partnerManagementImpl.updateAPIKeyStatus("1234", "456", statusDto); } @@ -1088,6 +1149,412 @@ private Partner getPartner() { part.setCertificateAlias("abcd"); part.setPolicyGroupId("234"); part.setPartnerTypeCode("Auth"); + part.setApprovalStatus("approved"); return part; } + + @Test + public void getPartnerDetailsTest() throws Exception { + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("FTM_Provider"); + partner.setApprovalStatus("approved"); + partner.setIsActive(true); + partner.setCertificateAlias("abs"); + partner.setPolicyGroupId("121"); + partnerList.add(partner); + when(partnerServiceRepository.findByUserId(anyString())).thenReturn(partnerList); + when(partnerServiceRepository.findById(anyString())).thenReturn(Optional.of(partner)); + PolicyGroup policyGroup = new PolicyGroup(); + policyGroup.setName("policygroup123"); + when(policyGroupRepository.findPolicyGroupById(anyString())).thenReturn(policyGroup); + PartnerCertDownloadResponeDto partnerCertDownloadResponeDto = new PartnerCertDownloadResponeDto(); + String certificate = "-----BEGIN CERTIFICATE-----\n" + + "MIIFfTCCA2WgAwIBAgIUOVZNyD46U0OAEhaGC/Y7NXbu+OkwDQYJKoZIhvcNAQEL\n" + + "BQAwTjELMAkGA1UEBhMCSU4xCzAJBgNVBAgMAk1IMQswCQYDVQQHDAJQTjELMAkG\n" + + "A1UECgwCQ0ExCzAJBgNVBAsMAkNBMQswCQYDVQQDDAJDQTAeFw0yNDA1MDkwNzI1\n" + + "MDJaFw0yOTA1MDkwNzI1MDJaME4xCzAJBgNVBAYTAklOMQswCQYDVQQIDAJNSDEL\n" + + "MAkGA1UEBwwCUE4xCzAJBgNVBAoMAkNBMQswCQYDVQQLDAJDQTELMAkGA1UEAwwC\n" + + "Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzdWD2DvhSnmLqU3fX\n" + + "RT3z8ikS6qHxn5Hu/a2ijkuZxAZj0UCUJ83kM20NwocJDHT1qx6+yjdl+BECsgoI\n" + + "ro9MXgFOsHCphyR5KiP4mY95qRlE03h7WBfr4wDn/6f5tCbqCcBqdXMAQxUp34D+\n" + + "Pro0EwkXNulHNMTvz5hpoCEiGyfXUP48I4q2nb8rMXaplhqz+vAYgA4rsK6K9IUh\n" + + "uJDxtZRHdIfxnvbfjxDbuPkN0ehOQ1uQrDVY6ENCIUxdgR/p94kZ+CNsD21c57gJ\n" + + "2wYg+BceQn1rVSGnfpqMoogZCMUWFvaE4i91419VXxDLgeC/4Qw8n5onBY+dVHjW\n" + + "04OolR2DqotFyaPlZiVdpUys6+KZ7fS9mwWEY0kqtLzcBeb4g4nPvObfKnqSmVMZ\n" + + "DHRuAx6MG3oFZrnNuS6oIYGwLpoko6iqEiGohHsSxMulT43XOxoNgDq9noQc9SYv\n" + + "tzdzijBRLAxNBDTB0rgZra27tLIFlqP1TpqZtM3ThOmPJQn6JG8WeiVWnmUkpmXX\n" + + "6opGqhLWMM/u1n4fdf716h7340RbCPJoOpTPphYo/WedFQskqZvhTU6HMIj4JQAj\n" + + "OVVwgtrDOdx051ps2hhiSU5tL4LmjLHIsfyoCSuHkzBhVMZ/jKFm8C4Or2RRG85A\n" + + "wtzEANSxVZRjw6S1hsHsI+8m2QIDAQABo1MwUTAdBgNVHQ4EFgQUjDli1GMiclHK\n" + + "igNm2kuKh48AON8wHwYDVR0jBBgwFoAUjDli1GMiclHKigNm2kuKh48AON8wDwYD\n" + + "VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAk6IWcDdBc1tngCaPNLhU\n" + + "c3pXRdTjDuLHMxHRiP/7Vi3V2xcKRak5ZMzYAJK6YThp3Z04V9d5jJoi/CDhMuPK\n" + + "RV1GmbdA7b24Jic2fQHWOJkgafT2Gx4yHmLo5ctSuDHPfSvzUgeghG0k3eNJgCai\n" + + "Ctr+wvCRZGvvbl2JnJUcWiHBxH/PaWJ4Jd1T4UKmhlFhTw26TXQGHuW/UJwgh8OR\n" + + "V8A+WeMXxKFsh38b8RnWVa6XdajIq9UAZvvd4Q16zjdnMWx/7zcIK5D1MDb/KmSJ\n" + + "yho1LKRZx5YtSeI4FWs8dzZ0nCCiTe7TrnnhlXThJ6rXeo5AshtM4fGrvizaf4n3\n" + + "7I9mJkqiccp1ml+2EcgsdX7HbnGE/R8VVbh3jUhWHuysLCiVSMbjnktCLWoXjSb9\n" + + "JqOYF3yo6JQslQB0fQMyKmvsn/FplQBbU0PUrg9vpAg9nZlZf3UHO5z072pXD6ky\n" + + "5pKjh+q0JOk00Eln9AoU6YuIyPBQ9mI3X8iYB5UhUBbgAPeg1pwWCWhdt40f0D5t\n" + + "JkVnICy+Gh1ps8QPA6coEaajbIq14Uh6eYEwxFHPsxlbn7pzjoCJG2v7N8VwgfuL\n" + + "DdGs4hFikdUAfBT/Diug/n9/ZgfdN6Ctf4U/SM65vZvfRqtLIoTIs4PcF3YtKK04\n" + + "m0UA3Sxxre0vVWYO4GmmZUY=\n" + + "-----END CERTIFICATE-----"; + partnerCertDownloadResponeDto.setCertificateData(certificate); + when(partnerHelper.getCertificate(any(),any(),any())).thenReturn(partnerCertDownloadResponeDto); + + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + partnerManagementImpl.getPartnerDetails("123"); + } + + @Test + public void getPartnerDetailsTest1() throws Exception { + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("DEVICE"); + partner.setApprovalStatus("approved"); + partner.setIsActive(true); + partnerList.add(partner); + when(partnerServiceRepository.findByUserId(anyString())).thenReturn(partnerList); + when(partnerServiceRepository.findById(anyString())).thenReturn(Optional.of(partner)); + PolicyGroup policyGroup = new PolicyGroup(); + policyGroup.setName("policygroup123"); + when(policyGroupRepository.findPolicyGroupById(anyString())).thenReturn(policyGroup); + + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + partnerManagementImpl.getPartnerDetails("123"); + } + + @Test + public void getAdminPartnersTest() throws Exception { + MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + PartnerFilterDto partnerFilterDto = new PartnerFilterDto(); + partnerFilterDto.setPartnerId("abc"); + partnerFilterDto.setPartnerTypeCode("Auth_Partner"); + partnerFilterDto.setOrganizationName("ABC"); + partnerFilterDto.setEmailAddress("abc"); + partnerFilterDto.setCertificateUploadStatus("not_uploaded"); + partnerFilterDto.setPolicyGroupName("default"); + partnerFilterDto.setIsActive(false); + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + Page page = null; + when(partnerSummaryRepository.getSummaryOfAllPartners(anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), any(), any())).thenReturn(page); + partnerManagementImpl.getAdminPartners(sortFieldName, sortType, pageNo, pageSize, partnerFilterDto); + } + + @Test + public void getAdminPartnersTestException() throws Exception { + MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + Page page = null; + when(partnerSummaryRepository.getSummaryOfAllPartners(anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), any(), any())).thenReturn(page); + partnerManagementImpl.getAdminPartners(sortFieldName, sortType, pageNo, pageSize, null); + } + + @Test + public void getAllApiKeyRequestsTest() throws Exception { + MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + ApiKeyFilterDto apiKeyFilterDto = new ApiKeyFilterDto(); + apiKeyFilterDto.setPartnerId("abc"); + apiKeyFilterDto.setPolicyName("policy"); + apiKeyFilterDto.setOrgName("ABC"); + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + Page page = null; + when(apiKeyRequestSummaryRepository.getSummaryOfAllApiKeyRequests(anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyList(), anyBoolean(), any())).thenReturn(page); + partnerManagementImpl.getAllApiKeyRequests(sortFieldName, sortType, pageNo, pageSize, apiKeyFilterDto); + } + + @Test + public void getAllApiKeyRequestsTestException() throws Exception { + MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + Page page = null; + when(apiKeyRequestSummaryRepository.getSummaryOfAllApiKeyRequests(anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyList(), anyBoolean(), any())).thenReturn(page); + partnerManagementImpl.getAllApiKeyRequests(sortFieldName, sortType, pageNo, pageSize, null); + } + + @Test + public void getAllPartnerPolicyRequestsTest() throws Exception { + MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + PartnerPolicyRequestFilterDto partnerPolicyRequestFilterDto = new PartnerPolicyRequestFilterDto(); + partnerPolicyRequestFilterDto.setPartnerId("abc"); + partnerPolicyRequestFilterDto.setPolicyName("policy"); + partnerPolicyRequestFilterDto.setOrganizationName("ABC"); + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + Page page = null; + when(partnerPolicyMappingRequestRepository.getSummaryOfAllPartnerPolicyRequests(anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyList(), anyBoolean(), any())).thenReturn(page); + partnerManagementImpl.getAllPartnerPolicyRequests(sortFieldName, sortType, pageNo, pageSize, partnerPolicyRequestFilterDto); + } + + @Test + public void getAllPartnerPolicyRequestsException() throws Exception { + MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + Page page = null; + when(partnerPolicyMappingRequestRepository.getSummaryOfAllPartnerPolicyRequests(anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyList(), anyBoolean(), any())).thenReturn(null); + partnerManagementImpl.getAllPartnerPolicyRequests(sortFieldName, sortType, pageNo, pageSize, null); + } + + @Test + public void getTrustCertificatesTest() throws Exception { + MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + String sortFieldName = "partnerDomain"; + String sortType = "desc"; + Integer pageNo = 0; + Integer pageSize = 8; + TrustCertificateFilterDto filterDto = new TrustCertificateFilterDto(); + filterDto.setCertificateId("abc"); + filterDto.setCaCertificateType("root"); + filterDto.setPartnerDomain("Auth"); + + TrustCertificateSummaryDto trustCertificateSummaryDto = new TrustCertificateSummaryDto(); + trustCertificateSummaryDto.setCaCertificateType("ROOT"); + trustCertificateSummaryDto.setCertId("abc"); + trustCertificateSummaryDto.setPartnerDomain("AUTH"); + List trustCertificateSummaryDtoList = new ArrayList<>(); + trustCertificateSummaryDtoList.add(trustCertificateSummaryDto); + + TrustCertTypeListResponseDto trustCertTypeListResponseDto = new TrustCertTypeListResponseDto(); + trustCertTypeListResponseDto.setPageNumber(1); + trustCertTypeListResponseDto.setPageSize(8); + trustCertTypeListResponseDto.setTotalRecords(10); + trustCertTypeListResponseDto.setAllPartnerCertificates(trustCertificateSummaryDtoList); + + Map apiResponse = new HashMap<>(); + apiResponse.put("response", trustCertTypeListResponseDto); + + when(restUtil.postApi(eq("https://localhost/v1/keymanager/getCaCertificates"), any(), eq(""), eq(""), + eq(MediaType.APPLICATION_JSON), any(), eq(Map.class))).thenReturn(apiResponse); + + when(mapper.writeValueAsString(any())).thenReturn(new ObjectMapper().writeValueAsString(trustCertTypeListResponseDto)); + when(mapper.readValue(anyString(), eq(TrustCertTypeListResponseDto.class))).thenReturn(trustCertTypeListResponseDto); + + ResponseWrapperV2> responseWrapper = + partnerManagementImpl.getTrustCertificates(sortFieldName, sortType, pageNo, pageSize, filterDto); + } + + @Test + public void getTrustCertificatesExceptionTest() throws Exception { + MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + String sortFieldName = "partnerDomain"; + String sortType = "desc"; + int pageNo = 0; + Integer pageSize = 8; + partnerManagementImpl.getTrustCertificates(sortFieldName, sortType, pageNo, pageSize, null); + } + + @Test + public void downloadTrustCertificatesTest() throws Exception { + MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + Map apiResponse = new HashMap<>(); + Map response = new HashMap<>(); + response.put("p7bFile", "-----BEGIN CERTIFICATE-----\n" + + "MIIFfTCCA2WgAwIBAgIUOVZNyD46U0OAEhaGC/Y7NXbu+OkwDQYJKoZIhvcNAQEL\n" + + "BQAwTjELMAkGA1UEBhMCSU4xCzAJBgNVBAgMAk1IMQswCQYDVQQHDAJQTjELMAkG\n" + + "A1UECgwCQ0ExCzAJBgNVBAsMAkNBMQswCQYDVQQDDAJDQTAeFw0yNDA1MDkwNzI1\n" + + "MDJaFw0yOTA1MDkwNzI1MDJaME4xCzAJBgNVBAYTAklOMQswCQYDVQQIDAJNSDEL\n" + + "MAkGA1UEBwwCUE4xCzAJBgNVBAoMAkNBMQswCQYDVQQLDAJDQTELMAkGA1UEAwwC\n" + + "Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzdWD2DvhSnmLqU3fX\n" + + "RT3z8ikS6qHxn5Hu/a2ijkuZxAZj0UCUJ83kM20NwocJDHT1qx6+yjdl+BECsgoI\n" + + "ro9MXgFOsHCphyR5KiP4mY95qRlE03h7WBfr4wDn/6f5tCbqCcBqdXMAQxUp34D+\n" + + "Pro0EwkXNulHNMTvz5hpoCEiGyfXUP48I4q2nb8rMXaplhqz+vAYgA4rsK6K9IUh\n" + + "uJDxtZRHdIfxnvbfjxDbuPkN0ehOQ1uQrDVY6ENCIUxdgR/p94kZ+CNsD21c57gJ\n" + + "2wYg+BceQn1rVSGnfpqMoogZCMUWFvaE4i91419VXxDLgeC/4Qw8n5onBY+dVHjW\n" + + "04OolR2DqotFyaPlZiVdpUys6+KZ7fS9mwWEY0kqtLzcBeb4g4nPvObfKnqSmVMZ\n" + + "DHRuAx6MG3oFZrnNuS6oIYGwLpoko6iqEiGohHsSxMulT43XOxoNgDq9noQc9SYv\n" + + "tzdzijBRLAxNBDTB0rgZra27tLIFlqP1TpqZtM3ThOmPJQn6JG8WeiVWnmUkpmXX\n" + + "6opGqhLWMM/u1n4fdf716h7340RbCPJoOpTPphYo/WedFQskqZvhTU6HMIj4JQAj\n" + + "OVVwgtrDOdx051ps2hhiSU5tL4LmjLHIsfyoCSuHkzBhVMZ/jKFm8C4Or2RRG85A\n" + + "wtzEANSxVZRjw6S1hsHsI+8m2QIDAQABo1MwUTAdBgNVHQ4EFgQUjDli1GMiclHK\n" + + "igNm2kuKh48AON8wHwYDVR0jBBgwFoAUjDli1GMiclHKigNm2kuKh48AON8wDwYD\n" + + "VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAk6IWcDdBc1tngCaPNLhU\n" + + "c3pXRdTjDuLHMxHRiP/7Vi3V2xcKRak5ZMzYAJK6YThp3Z04V9d5jJoi/CDhMuPK\n" + + "RV1GmbdA7b24Jic2fQHWOJkgafT2Gx4yHmLo5ctSuDHPfSvzUgeghG0k3eNJgCai\n" + + "Ctr+wvCRZGvvbl2JnJUcWiHBxH/PaWJ4Jd1T4UKmhlFhTw26TXQGHuW/UJwgh8OR\n" + + "V8A+WeMXxKFsh38b8RnWVa6XdajIq9UAZvvd4Q16zjdnMWx/7zcIK5D1MDb/KmSJ\n" + + "yho1LKRZx5YtSeI4FWs8dzZ0nCCiTe7TrnnhlXThJ6rXeo5AshtM4fGrvizaf4n3\n" + + "7I9mJkqiccp1ml+2EcgsdX7HbnGE/R8VVbh3jUhWHuysLCiVSMbjnktCLWoXjSb9\n" + + "JqOYF3yo6JQslQB0fQMyKmvsn/FplQBbU0PUrg9vpAg9nZlZf3UHO5z072pXD6ky\n" + + "5pKjh+q0JOk00Eln9AoU6YuIyPBQ9mI3X8iYB5UhUBbgAPeg1pwWCWhdt40f0D5t\n" + + "JkVnICy+Gh1ps8QPA6coEaajbIq14Uh6eYEwxFHPsxlbn7pzjoCJG2v7N8VwgfuL\n" + + "DdGs4hFikdUAfBT/Diug/n9/ZgfdN6Ctf4U/SM65vZvfRqtLIoTIs4PcF3YtKK04\n" + + "m0UA3Sxxre0vVWYO4GmmZUY=\n" + + "-----END CERTIFICATE-----"); + apiResponse.put("response", response); + + when(environment.getProperty("pmp.download.trust.certificates.get.rest.uri")).thenReturn("uri"); + when(restUtil.getApi(anyString(), any(), eq(Map.class))).thenReturn(apiResponse); + partnerManagementImpl.downloadTrustCertificates("123"); + } + + @Test + public void downloadTrustCertificatesExceptionTest1() throws Exception { + MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + partnerManagementImpl.downloadTrustCertificates(""); + } + + @Test + public void downloadTrustCertificatesExceptionTest2() throws Exception { + MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + List> errorList = new ArrayList<>(); + Map error = new HashMap<>(); + error.put("errorCode", "001"); + error.put("message", "error occured"); + errorList.add(error); + Map apiResponse = new HashMap<>(); + apiResponse.put("response", null); + apiResponse.put("errors", errorList); + + when(environment.getProperty("pmp.download.trust.certificates.get.rest.uri")).thenReturn("uri"); + when(restUtil.getApi(anyString(), any(), eq(Map.class))).thenReturn(apiResponse); + partnerManagementImpl.downloadTrustCertificates("123"); + } + + @Test + public void downloadTrustCertificatesExceptionTes3() throws Exception { + MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + List> errorList = new ArrayList<>(); + Map apiResponse = new HashMap<>(); + apiResponse.put("response", null); + apiResponse.put("errors", errorList); + + when(environment.getProperty("pmp.download.trust.certificates.get.rest.uri")).thenReturn("uri"); + when(restUtil.getApi(anyString(), any(), eq(Map.class))).thenReturn(apiResponse); + partnerManagementImpl.downloadTrustCertificates("123"); + } + + @Test + public void downloadTrustCertificatesExceptionTest5() throws Exception { + MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + List> errorList = new ArrayList<>(); + Map error = new HashMap<>(); + error.put("errorCodes", "001"); + error.put("messages", "error occured"); + errorList.add(error); + Map apiResponse = new HashMap<>(); + apiResponse.put("response", null); + apiResponse.put("errors", errorList); + + when(environment.getProperty("pmp.download.trust.certificates.get.rest.uri")).thenReturn("uri"); + when(restUtil.getApi(anyString(), any(), eq(Map.class))).thenReturn(apiResponse); + partnerManagementImpl.downloadTrustCertificates("123"); + } + + @Test + public void downloadTrustCertificatesExceptionTes4() throws Exception { + MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + Map apiResponse = new HashMap<>(); + apiResponse.put("response", null); + + when(environment.getProperty("pmp.download.trust.certificates.get.rest.uri")).thenReturn("uri"); + when(restUtil.getApi(anyString(), any(), eq(Map.class))).thenReturn(apiResponse); + partnerManagementImpl.downloadTrustCertificates("123"); + } + + private io.mosip.kernel.openid.bridge.model.MosipUserDto getMosipUserDto() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = new io.mosip.kernel.openid.bridge.model.MosipUserDto(); + mosipUserDto.setUserId("123"); + mosipUserDto.setMail("abc@gmail.com"); + return mosipUserDto; + } } diff --git a/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/service/impl/PartnerServiceImplTest.java b/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/service/impl/PartnerServiceImplTest.java index b4520e0414..ba65721ec5 100644 --- a/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/service/impl/PartnerServiceImplTest.java +++ b/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/service/impl/PartnerServiceImplTest.java @@ -4,6 +4,7 @@ import static org.mockito.Mockito.*; import java.io.IOException; +import java.lang.reflect.Method; import java.security.cert.Certificate; import java.sql.Timestamp; import java.time.LocalDateTime; @@ -12,11 +13,15 @@ import io.mosip.kernel.openid.bridge.model.AuthUserDetails; import io.mosip.pms.common.constant.EventType; import io.mosip.pms.common.dto.*; +import io.mosip.pms.common.response.dto.ResponseWrapper; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; import io.mosip.pms.partner.dto.DataShareDto; import io.mosip.pms.partner.dto.DataShareResponseDto; import io.mosip.pms.partner.dto.UploadCertificateRequestDto; +import io.mosip.pms.partner.dto.PartnerDtoV3; import io.mosip.pms.partner.request.dto.*; import io.mosip.pms.partner.response.dto.*; +import io.mosip.pms.partner.util.PartnerHelper; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -29,9 +34,12 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; +import org.springframework.core.env.Environment; import org.springframework.data.domain.PageImpl; import org.springframework.http.MediaType; import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.test.context.support.WithMockUser; @@ -131,6 +139,8 @@ public class PartnerServiceImplTest { UserDetailUtil userDetailUtil; @MockBean AuditUtil auditUtil; + @MockBean + PartnerHelper partnerHelper; @Mock FilterHelper filterHelper; @@ -141,6 +151,9 @@ public class PartnerServiceImplTest { @Mock Authentication authentication; + @Mock + Environment environment; + FilterValueDto deviceFilterValueDto = new FilterValueDto(); FilterDto filterDto = new FilterDto(); SearchFilter searchFilter = new SearchFilter(); @@ -220,6 +233,12 @@ private io.mosip.kernel.openid.bridge.model.MosipUserDto getMosipUserDto() { public void getPartnerCertificate_Test() throws Exception{ io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + Collection newAuthorities = List.of( + new SimpleGrantedAuthority("PARTNER_ADMIN") + ); + Method addAuthoritiesMethod = AuthUserDetails.class.getDeclaredMethod("addAuthorities", Collection.class, String.class); + addAuthoritiesMethod.setAccessible(true); + addAuthoritiesMethod.invoke(authUserDetails, newAuthorities, null); SecurityContextHolder.setContext(securityContext); when(authentication.getPrincipal()).thenReturn(authUserDetails); when(securityContext.getAuthentication()).thenReturn(authentication); @@ -249,8 +268,8 @@ public void getPartnerCertificate_Test() throws Exception{ Mockito.doNothing().when(webSubPublisher).notify(Mockito.any(),Mockito.any(),Mockito.any()); } - @Test(expected = PartnerServiceException.class) - public void getOriginalPartnerCertificate_Test() throws Exception{ + @Test + public void getPartnerCertificateData_Test() throws Exception{ io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); SecurityContextHolder.setContext(securityContext); @@ -266,19 +285,16 @@ public void getOriginalPartnerCertificate_Test() throws Exception{ PartnerCertDownloadRequestDto partnerCertDownloadRequestDto = new PartnerCertDownloadRequestDto(); partnerCertDownloadRequestDto.setPartnerId("id"); Mockito.when(partnerRepository.findById(Mockito.anyString())).thenReturn(Optional.empty()); - try { - pserviceImpl.getOriginalPartnerCertificate(partnerCertDownloadRequestDto); - }catch (PartnerServiceException e) { - assertFalse(e.getErrorCode().equals(ErrorCode.PARTNER_DOES_NOT_EXIST_EXCEPTION.getErrorCode())); - } + + pserviceImpl.getPartnerCertificateData(partnerCertDownloadRequestDto); + Optional getPartner = Optional.of(createPartner(Boolean.TRUE)); Optional policyGroup = Optional.of(createPolicyGroup(Boolean.TRUE)); Mockito.when(partnerRepository.findById(Mockito.anyString())).thenReturn(getPartner); Mockito.when(policyGroupRepository.findById(getPartner.get().getPolicyGroupId())).thenReturn(policyGroup); - OriginalCertDownloadResponseDto originalCertDownloadResponseDto = pserviceImpl.getOriginalPartnerCertificate(partnerCertDownloadRequestDto); + ResponseWrapperV2 originalCertDownloadResponseDto = pserviceImpl.getPartnerCertificateData(partnerCertDownloadRequestDto); assertNotNull(originalCertDownloadResponseDto); - assertEquals(originalCertDownloadResponseDto.getCaSignedCertificateData(), "12345"); Mockito.doNothing().when(webSubPublisher).notify(Mockito.any(),Mockito.any(),Mockito.any()); } @@ -1455,4 +1471,171 @@ private String caCertResponse() { + "\"errors\": null\n" + "}" ; } + + @Test + public void getPartnerCertificatesDetailsTest() throws Exception { + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setCertificateAlias("abs"); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); + + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + Map apiResponse = new HashMap<>(); + Map response = new HashMap<>(); + response.put("certificateData", "-----BEGIN CERTIFICATE-----\n" + + "MIIFfTCCA2WgAwIBAgIUOVZNyD46U0OAEhaGC/Y7NXbu+OkwDQYJKoZIhvcNAQEL\n" + + "BQAwTjELMAkGA1UEBhMCSU4xCzAJBgNVBAgMAk1IMQswCQYDVQQHDAJQTjELMAkG\n" + + "A1UECgwCQ0ExCzAJBgNVBAsMAkNBMQswCQYDVQQDDAJDQTAeFw0yNDA1MDkwNzI1\n" + + "MDJaFw0yOTA1MDkwNzI1MDJaME4xCzAJBgNVBAYTAklOMQswCQYDVQQIDAJNSDEL\n" + + "MAkGA1UEBwwCUE4xCzAJBgNVBAoMAkNBMQswCQYDVQQLDAJDQTELMAkGA1UEAwwC\n" + + "Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzdWD2DvhSnmLqU3fX\n" + + "RT3z8ikS6qHxn5Hu/a2ijkuZxAZj0UCUJ83kM20NwocJDHT1qx6+yjdl+BECsgoI\n" + + "ro9MXgFOsHCphyR5KiP4mY95qRlE03h7WBfr4wDn/6f5tCbqCcBqdXMAQxUp34D+\n" + + "Pro0EwkXNulHNMTvz5hpoCEiGyfXUP48I4q2nb8rMXaplhqz+vAYgA4rsK6K9IUh\n" + + "uJDxtZRHdIfxnvbfjxDbuPkN0ehOQ1uQrDVY6ENCIUxdgR/p94kZ+CNsD21c57gJ\n" + + "2wYg+BceQn1rVSGnfpqMoogZCMUWFvaE4i91419VXxDLgeC/4Qw8n5onBY+dVHjW\n" + + "04OolR2DqotFyaPlZiVdpUys6+KZ7fS9mwWEY0kqtLzcBeb4g4nPvObfKnqSmVMZ\n" + + "DHRuAx6MG3oFZrnNuS6oIYGwLpoko6iqEiGohHsSxMulT43XOxoNgDq9noQc9SYv\n" + + "tzdzijBRLAxNBDTB0rgZra27tLIFlqP1TpqZtM3ThOmPJQn6JG8WeiVWnmUkpmXX\n" + + "6opGqhLWMM/u1n4fdf716h7340RbCPJoOpTPphYo/WedFQskqZvhTU6HMIj4JQAj\n" + + "OVVwgtrDOdx051ps2hhiSU5tL4LmjLHIsfyoCSuHkzBhVMZ/jKFm8C4Or2RRG85A\n" + + "wtzEANSxVZRjw6S1hsHsI+8m2QIDAQABo1MwUTAdBgNVHQ4EFgQUjDli1GMiclHK\n" + + "igNm2kuKh48AON8wHwYDVR0jBBgwFoAUjDli1GMiclHKigNm2kuKh48AON8wDwYD\n" + + "VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAk6IWcDdBc1tngCaPNLhU\n" + + "c3pXRdTjDuLHMxHRiP/7Vi3V2xcKRak5ZMzYAJK6YThp3Z04V9d5jJoi/CDhMuPK\n" + + "RV1GmbdA7b24Jic2fQHWOJkgafT2Gx4yHmLo5ctSuDHPfSvzUgeghG0k3eNJgCai\n" + + "Ctr+wvCRZGvvbl2JnJUcWiHBxH/PaWJ4Jd1T4UKmhlFhTw26TXQGHuW/UJwgh8OR\n" + + "V8A+WeMXxKFsh38b8RnWVa6XdajIq9UAZvvd4Q16zjdnMWx/7zcIK5D1MDb/KmSJ\n" + + "yho1LKRZx5YtSeI4FWs8dzZ0nCCiTe7TrnnhlXThJ6rXeo5AshtM4fGrvizaf4n3\n" + + "7I9mJkqiccp1ml+2EcgsdX7HbnGE/R8VVbh3jUhWHuysLCiVSMbjnktCLWoXjSb9\n" + + "JqOYF3yo6JQslQB0fQMyKmvsn/FplQBbU0PUrg9vpAg9nZlZf3UHO5z072pXD6ky\n" + + "5pKjh+q0JOk00Eln9AoU6YuIyPBQ9mI3X8iYB5UhUBbgAPeg1pwWCWhdt40f0D5t\n" + + "JkVnICy+Gh1ps8QPA6coEaajbIq14Uh6eYEwxFHPsxlbn7pzjoCJG2v7N8VwgfuL\n" + + "DdGs4hFikdUAfBT/Diug/n9/ZgfdN6Ctf4U/SM65vZvfRqtLIoTIs4PcF3YtKK04\n" + + "m0UA3Sxxre0vVWYO4GmmZUY=\n" + + "-----END CERTIFICATE-----"); + apiResponse.put("response", response); + + when(environment.getProperty("pmp.partner.certificaticate.get.rest.uri")).thenReturn("uri"); + when(restUtil.getApi(anyString(), any(), eq(Map.class))).thenReturn(apiResponse); + pserviceImpl.getPartnerCertificatesDetails(); + } + + @Test + public void getPartnerCertificatesDetailsTestException() throws Exception { + pserviceImpl.getPartnerCertificatesDetails(); + } + + @Test + public void getPartnerCertificatesDetailsTestException1() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId(""); + partner.setCertificateAlias(""); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); + pserviceImpl.getPartnerCertificatesDetails(); + } + + @Test + public void getPartnerCertificatesDetailsTestException2() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); + pserviceImpl.getPartnerCertificatesDetails(); + } + + @Test + public void getPartnersV3Test() throws Exception{ + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Auth_Partner"); + partner.setPolicyGroupId("abc"); + partner.setApprovalStatus("approved"); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + when(partnerRepository.findPartnersByUserIdAndStatusAndPartnerTypeAndPolicyGroupAvailable(any(),any(),any(),any())).thenReturn(partnerList); + + PolicyGroup policyGroup = new PolicyGroup(); + policyGroup.setName("abc"); + when(policyGroupRepository.findPolicyGroupById(any())).thenReturn(policyGroup); + ResponseWrapperV2> responseWrapper = pserviceImpl.getPartnersV3("approved", true, "Auth_Partner"); + assertNotNull(responseWrapper); + } + + @Test + public void getPartnersV3Test1() throws Exception{ + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("FTM_Provider"); + partner.setApprovalStatus("approved"); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + when(partnerRepository.findPartnersByUserIdAndStatusAndPartnerTypeAndPolicyGroupAvailable(any(),any(),any(),any())).thenReturn(partnerList); + + ResponseWrapperV2> responseWrapper = pserviceImpl.getPartnersV3("approved", null, "FTM_Provider"); + assertNotNull(responseWrapper); + } + + @Test + public void getPartnersV3TestException() throws Exception{ + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Auth_Partner"); + partner.setPolicyGroupId("abc"); + partner.setApprovalStatus("approved"); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + when(partnerRepository.findPartnersByUserIdAndStatusAndPartnerTypeAndPolicyGroupAvailable(any(),any(),any(),any())).thenReturn(partnerList); + + PolicyGroup policyGroup = new PolicyGroup(); + when(policyGroupRepository.findPolicyGroupById(any())).thenReturn(policyGroup); + ResponseWrapperV2> responseWrapper = pserviceImpl.getPartnersV3("approved", true, "Auth_Partner"); + assertNotNull(responseWrapper); + } + } diff --git a/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/service/impl/UserManagementServiceImplTest.java b/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/service/impl/UserManagementServiceImplTest.java index b462f76e7c..b79058ece6 100644 --- a/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/service/impl/UserManagementServiceImplTest.java +++ b/partner/partner-management-service/src/test/java/io/mosip/pms/test/partner/service/impl/UserManagementServiceImplTest.java @@ -1,13 +1,21 @@ package io.mosip.pms.test.partner.service.impl; +import io.mosip.kernel.openid.bridge.model.AuthUserDetails; +import io.mosip.pms.common.dto.UserDetails; +import io.mosip.pms.common.entity.Partner; +import io.mosip.pms.common.repository.PartnerServiceRepository; +import io.mosip.pms.common.repository.UserDetailsRepository; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.context.junit4.SpringRunner; import io.mosip.pms.partner.dto.MosipUserDto; @@ -15,15 +23,36 @@ import io.mosip.pms.partner.keycloak.service.KeycloakImpl; import io.mosip.pms.user.service.impl.UserManagementServiceImpl; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + @RunWith(SpringRunner.class) @SpringBootTest public class UserManagementServiceImplTest { - @Autowired + @InjectMocks UserManagementServiceImpl userManagementServiceImpl; - @MockBean + @Mock private KeycloakImpl keycloakImpl; + + @Mock + Authentication authentication; + + @Mock + SecurityContext securityContext; + + @Mock + UserDetailsRepository userDetailsRepository; + + @Mock + PartnerServiceRepository partnerRepository; @Before public void setUp() { @@ -42,4 +71,129 @@ public void registerUserTest() { } + @Test + public void saveUserConsentTest() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Auth_Partner"); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); + + UserDetails userDetails = new UserDetails(); + userDetails.setUserId("123"); + userDetails.setId("abc"); + userDetails.setCrDtimes(LocalDateTime.now()); + userDetails.setCrBy("abc"); + Optional optionalEntity = Optional.of(new UserDetails()); + when(userDetailsRepository.findByUserId(anyString())).thenReturn(optionalEntity); + when(userDetailsRepository.save(any())).thenReturn(userDetails); + userManagementServiceImpl.saveUserConsent(); + } + + @Test + public void saveUserConsentTest1() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Auth_Partner"); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); + + UserDetails userDetails = new UserDetails(); + userDetails.setUserId("123"); + userDetails.setId("abc"); + userDetails.setCrDtimes(LocalDateTime.now()); + userDetails.setCrBy("abc"); + when(userDetailsRepository.save(any())).thenReturn(userDetails); + userManagementServiceImpl.saveUserConsent(); + } + + @Test + public void saveUserConsentExceptionTest() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); + userManagementServiceImpl.saveUserConsent(); + } + @Test + public void saveUserConsentExceptionTest1() throws Exception { + userManagementServiceImpl.saveUserConsent(); + } + + @Test + public void isUserConsentGivenTest() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + partner.setId("123"); + partner.setPartnerTypeCode("Auth_Partner"); + partnerList.add(partner); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); + UserDetails userDetails = new UserDetails(); + userDetails.setUserId("123"); + userDetails.setId("abc"); + userDetails.setCrDtimes(LocalDateTime.now()); + userDetails.setCrBy("abc"); + userDetails.setConsentGiven("YES"); + userDetails.setConsentGivenDtimes(LocalDateTime.now()); + Optional optionalEntity = Optional.of(userDetails); + when(userDetailsRepository.findByUserId(anyString())).thenReturn(optionalEntity); + userManagementServiceImpl.isUserConsentGiven(); + } + + @Test + public void isUserConsentGivenExceptionTest() throws Exception { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = getMosipUserDto(); + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, "123"); + SecurityContextHolder.setContext(securityContext); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + when(securityContext.getAuthentication()).thenReturn(authentication); + + List partnerList = new ArrayList<>(); + Partner partner = new Partner(); + when(partnerRepository.findByUserId(anyString())).thenReturn(partnerList); + when(partnerRepository.findById(anyString())).thenReturn(Optional.of(partner)); + userManagementServiceImpl.isUserConsentGiven(); + } + + @Test + public void isUserConsentGivenExceptionTest1() throws Exception { + userManagementServiceImpl.isUserConsentGiven(); + } + + private io.mosip.kernel.openid.bridge.model.MosipUserDto getMosipUserDto() { + io.mosip.kernel.openid.bridge.model.MosipUserDto mosipUserDto = new io.mosip.kernel.openid.bridge.model.MosipUserDto(); + mosipUserDto.setUserId("123"); + mosipUserDto.setMail("abc@gmail.com"); + return mosipUserDto; + } + } diff --git a/partner/partner-management-service/src/test/resources/application.properties b/partner/partner-management-service/src/test/resources/application.properties index 2e1fc7139f..978e1c2116 100644 --- a/partner/partner-management-service/src/test/resources/application.properties +++ b/partner/partner-management-service/src/test/resources/application.properties @@ -123,7 +123,9 @@ pmp.partner.certificaticate.upload.rest.uri=https://localhost/v1/keymanager/uplo pmp.partner.certificaticate.get.rest.uri=https://localhost/v1/keymanager/getPartnerCertificate pmp.partner.original.certificate.get.rest.uri=https://localhost/v1/keymanager/getPartnerSignedCertificate/{partnerCertId} pmp-keymanager.upload.other.domain.cert.rest.uri=http://kernel-keymanager-service/v1/keymanager/uploadOtherDomainCertificate -application.id=PMS +pmp.trust.certificates.post.rest.uri=${mosip.kernel.keymanager.url}/v1/keymanager/getCaCertificates +pmp.download.trust.certificates.get.rest.uri=${mosip.kernel.keymanager.url}/v1/keymanager/getCACertificateTrustPath/{caCertId} +application.id=PARTNER ###############Keycloak configuration ########################## mosip.iam.base-url=https://localhost/keycloak mosip.iam.realm.operations.base-url = ${mosip.iam.base-url}/auth/admin/realms/{realmId} @@ -235,6 +237,13 @@ mosip.pms.session.inactivity.prompt.timer=5 # amount of time that axios will wait for a response from the server before aborting the request and throwing an error in minutes mosip.pms.axios.timeout=3 +# maximum number of year to be allowed for SBI expiry date +mosip.pms.expiry.date.max.year=10 +# maximum number of year to be allowed for SBI created date +mosip.pms.created.date.max.year=10 +# Maximum number of items to be displayed per page in the pagination +mosip.pms.pagination.items.per.page=8 + mosip.pms.esignet.claims-mapping-file-url=https://raw.githubusercontent.com/mosip/mosip-config/develop-v3/idp-claims-mapping.json mosip.pms.esignet.amr-acr-mapping-file-url=https://raw.githubusercontent.com/mosip/mosip-config/develop-v3/amr-acr-mapping.json mosip.pms.esignet.oidc-client-create-url=https://api.dev.mosip.net/v1/idp/client-mgmt/oidc-client @@ -249,6 +258,7 @@ mosip.role.pms.patchdevicedetail=PARTNER_ADMIN mosip.role.pms.postdevicedetailsearch=PARTNER_ADMIN,DEVICE_PROVIDER,FTM_PROVIDER mosip.role.pms.postdevicedetaildevicetypesearch=PARTNER_ADMIN,DEVICE_PROVIDER,FTM_PROVIDER mosip.role.pms.postdevicedetailfiltervalues=PARTNER_ADMIN,DEVICE_PROVIDER,FTM_PROVIDER +mosip.role.pms.postdevicedetaildevicetypefiltervalues=PARTNER_ADMIN,DEVICE_PROVIDER,FTM_PROVIDER mosip.role.pms.postdevicedetaildevicesubtypefiltervalues=PARTNER_ADMIN,DEVICE_PROVIDER,FTM_PROVIDER mosip.role.pms.postftpchipdetail=PARTNER_ADMIN,FTM_PROVIDER mosip.role.pms.putftpchipdetail=PARTNER_ADMIN,FTM_PROVIDER @@ -297,22 +307,58 @@ mosip.role.pms.putmisplicense=MISP_PARTNER,MISP,PARTNERMANAGER,PARTNER_ADMIN mosip.role.pms.getmisplicense=MISP_PARTNER,MISP,PARTNERMANAGER,PARTNER_ADMIN mosip.role.pms.getmisplicensekey=PARTNERMANAGER,PARTNER_ADMIN mosip.role.pms.postmispfiltervalues=MISP_PARTNER,MISP,PARTNERMANAGER,PARTNER_ADMIN -mosip.role.pms.getallcertificatedetails=AUTH_PARTNER,ABIS_PARTNER,SDK_PARTNER,DEVICE_PROVIDER,FTM_PROVIDER,CREDENTIAL_PARTNER,PARTNER_ADMIN,ONLINE_VERIFICATION_PARTNER -mosip.role.pms.getallrequestedpolicies=AUTH_PARTNER,ABIS_PARTNER,SDK_PARTNER,CREDENTIAL_PARTNER,PARTNER_ADMIN,ONLINE_VERIFICATION_PARTNER -mosip.role.pms.getallapprovedauthpartnerpolicies=AUTH_PARTNER,PARTNER_ADMIN -mosip.role.pms.getallapprovedpartneridswithpolicygroups=AUTH_PARTNER,ABIS_PARTNER,SDK_PARTNER,CREDENTIAL_PARTNER,PARTNER_ADMIN,ONLINE_VERIFICATION_PARTNER -mosip.role.pms.getallapikeysforauthpartners=AUTH_PARTNER,PARTNER_ADMIN -mosip.role.pms.getalloidcclients=AUTH_PARTNER,PARTNER_ADMIN +mosip.role.pms.getpartnercertificates=AUTH_PARTNER,ABIS_PARTNER,SDK_PARTNER,DEVICE_PROVIDER,FTM_PROVIDER,CREDENTIAL_PARTNER,PARTNER_ADMIN,ONLINE_VERIFICATION_PARTNER +mosip.role.pms.getapikeysforauthpartners=AUTH_PARTNER,PARTNER_ADMIN mosip.role.pms.userconsent=AUTH_PARTNER,ABIS_PARTNER,SDK_PARTNER,DEVICE_PROVIDER,FTM_PROVIDER,CREDENTIAL_PARTNER,PARTNER_ADMIN,ONLINE_VERIFICATION_PARTNER +mosip.role.pms.getsbidetails=DEVICE_PROVIDER,PARTNER_ADMIN +mosip.role.pms.postadddevicetosbi=DEVICE_PROVIDER,PARTNER_ADMIN +mosip.role.pms.postapproveorrejectdevicewithsbimapping=PARTNER_ADMIN +mosip.role.pms.patchdeactivatedevice=DEVICE_PROVIDER,PARTNER_ADMIN +mosip.role.pms.patchdeactivatesbi=DEVICE_PROVIDER,PARTNER_ADMIN +mosip.role.pms.getftmchipdetails=FTM_PROVIDER,PARTNER_ADMIN +mosip.role.pms.patchdeactivateftm=FTM_PROVIDER,PARTNER_ADMIN +mosip.role.pms.getoriginalftmcertificate=FTM_PROVIDER,PARTNER_ADMIN +mosip.role.pms.getpartnerdetails=PARTNER_ADMIN +mosip.role.pms.getadminpartners=PARTNER_ADMIN +mosip.role.pms.getallpartnerpolicymappingrequests=PARTNER_ADMIN,AUTH_PARTNER,ABIS_PARTNER,SDK_PARTNER,CREDENTIAL_PARTNER,PARTNER_ADMIN,ONLINE_VERIFICATION_PARTNER +mosip.role.pms.getoauthpartnersclients=PARTNER_ADMIN,AUTH_PARTNER +mosip.role.pms.getpartnersapikeyrequests=PARTNER_ADMIN,AUTH_PARTNER +mosip.role.pms.getpartnersftmchipdetails=PARTNER_ADMIN +mosip.role.pms.getallsbidetails=PARTNER_ADMIN,DEVICE_PROVIDER +mosip.role.pms.getalldevicedetails=PARTNER_ADMIN +mosip.role.pms.gettrustcertificates=PARTNER_ADMIN +mosip.role.pms.getdownloadtrustcertificates=PARTNER_ADMIN +mosip.role.pms.getpartnersv3=DEVICE_PROVIDER,FTM_PROVIDER,PARTNER_ADMIN,AUTH_PARTNER,ABIS_PARTNER,SDK_PARTNER,CREDENTIAL_PARTNER,PARTNER_ADMIN,ONLINE_VERIFICATION_PARTNER #id for the API -mosip.pms.api.id.all.oidc.clients.get=mosip.pms.all.oidc.clients.get -mosip.pms.api.id.all.certificates.details.get=mosip.pms.all.certificates.details.get -mosip.pms.api.id.all.requested.policies.get=mosip.pms.all.requested.policies.get -mosip.pms.api.id.all.approved.auth.partners.policies.get=mosip.pms.all.approved.auth.partners.policies.get -mosip.pms.api.id.all.approved.partner.ids.with.policy.groups.get=mosip.pms.all.approved.partner.ids.with.policy.groups.get +mosip.pms.api.id.oauth.clients.get=mosip.pms.oauth.clients.get +mosip.pms.api.id.partner.certificates.get=mosip.pms.partner.certificates.get +mosip.pms.api.id.approved.partner.ids.with.policy.groups.get=mosip.pms.approved.partner.ids.with.policy.groups.get mosip.pms.api.id.configs.get=mosip.pms.configs.get -mosip.pms.api.id.all.api.keys.for.auth.partners.get=mosip.pms.all.api.keys.for.auth.partners.get -mosip.pms.api.id.user.consent.given.get=mosip.pms.user.consent.given.get -mosip.pms.api.id.save.user.consent.given.post=mosip.pms.save.user.consent.given.post -mosip.pms.api.id.original.partner.certificate.get=mosip.pms.original.partner.certificate.get \ No newline at end of file +mosip.pms.api.id.auth.partner.api.keys.get=mosip.pms.auth.partner.api.keys.get +mosip.pms.api.id.user.consent.get=mosip.pms.user.consent.get +mosip.pms.api.id.user.consent.post=mosip.pms.user.consent.post +mosip.pms.api.id.original.partner.certificate.get=mosip.pms.original.partner.certificate.get +mosip.pms.api.id.sbi.details.get=mosip.pms.sbi.details.get +mosip.pms.api.id.approved.device.provider.ids.get=mosip.pms.approved.device.provider.ids.get +mosip.pms.api.id.sbi.devices.get=mosip.pms.sbi.devices.get +mosip.pms.api.id.add.device.to.sbi.id.post=mosip.pms.add.device.to.sbi.id.post +mosip.pms.api.id.approve.mapping.device.to.sbi.post=mosip.pms.approve.mapping.device.to.sbi.post +mosip.pms.api.id.reject.mapping.device.to.sbi.post=mosip.pms.reject.mapping.device.to.sbi.post +mosip.pms.api.id.deactivate.device.patch=mosip.pms.deactivate.device.patch +mosip.pms.api.id.deactivate.sbi.patch=mosip.pms.deactivate.sbi.patch +mosip.pms.api.id.ftm.chip.details.get=mosip.pms.ftm.chip.details.get +mosip.pms.api.id.approved.ftm.provider.ids.get=mosip.pms.approved.ftm.provider.ids.get +mosip.pms.api.id.deactivate.ftm.patch=mosip.pms.deactivate.ftm.patch +mosip.pms.api.id.original.ftm.certificate.get=mosip.pms.original.ftm.certificate.get +mosip.pms.api.id.partner.details.get=mosip.pms.partner.details.get +mosip.pms.api.id.admin.partners.get=mosip.pms.admin.partners.get +mosip.pms.api.id.all.partner.policy.mapping.requests.get=mosip.pms.all.partner.policy.mapping.requests.get +mosip.pms.api.id.oauth.partners.clients.get=mosip.pms.oauth.partners.clients.get +mosip.pms.api.id.all.api.key.requests.get=mosip.pms.all.api.key.requests.get +mosip.pms.api.id.partners.ftm.chip.details.get=mosip.pms.partners.ftm.chip.details.get +mosip.pms.api.id.all.sbi.details.get=mosip.pms.all.sbi.details.get +mosip.pms.api.id.get.all.device.details.get=mosip.pms.get.all.device.details.get +mosip.pms.api.id.trust.certificates.get=mosip.pms.trust.certificates.get +mosip.pms.api.id.download.trust.certificates.get=mosip.pms.download.trust.certificates.get +mosip.pms.api.id.partners.v3.get=mosip.pms.partners.v3.get \ No newline at end of file diff --git a/partner/pms-common/pom.xml b/partner/pms-common/pom.xml index 74a804c048..4941570b0a 100644 --- a/partner/pms-common/pom.xml +++ b/partner/pms-common/pom.xml @@ -6,10 +6,10 @@ io.mosip.pms pms-parent - 1.3.0-dp.1 + 1.3.0-beta1 pms-common - 1.3.0-dp.1 + 1.3.0-beta1 pms-common UTF-8 diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/constant/CommonConstant.java b/partner/pms-common/src/main/java/io/mosip/pms/common/constant/CommonConstant.java index 7dc5c60ca6..8f41114e08 100644 --- a/partner/pms-common/src/main/java/io/mosip/pms/common/constant/CommonConstant.java +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/constant/CommonConstant.java @@ -11,4 +11,8 @@ public final class CommonConstant { public static final String PENDING_CERT_UPLOAD ="pending_cert_upload"; public static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; + + public static final String ASC = "asc"; + + public static final String DESC = "desc"; } diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/constant/ValidationErrorCode.java b/partner/pms-common/src/main/java/io/mosip/pms/common/constant/ValidationErrorCode.java index 19d5771c7b..f06bf5b75a 100644 --- a/partner/pms-common/src/main/java/io/mosip/pms/common/constant/ValidationErrorCode.java +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/constant/ValidationErrorCode.java @@ -12,7 +12,13 @@ public enum ValidationErrorCode { FILTER_COLUMN_NOT_SUPPORTED("PMS-MSD-324", "Received Filter Type not supported"), COLUMN_DOESNT_EXIST_FILTER("PMS-MSD-348", "Received column does not support filter"), CONSTRAINT_VIOLATION("PMS-MSD-xxx", "Contraint Violation-"), - INVALID_COLUMN_NAME("PMS-MSD-325", "Invalid Column Name passed"); + INVALID_COLUMN_NAME("PMS-MSD-325", "Invalid Column Name passed"), + INVALID_REQUEST_PARAM("PMS_REQUEST_ERROR_001", "Invalid request."), + INVALID_REQUEST_ID("PMS_REQUEST_ERROR_002", "Invalid Request Id"), + INVALID_REQUEST_VERSION("PMS_REQUEST_ERROR_003", "Request version is invalid"), + INVALID_REQUEST_DATETIME("PMS_REQUEST_ERROR_004", "Invalid request time"), + INVALID_REQUEST_BODY("PMS_REQUEST_ERROR_005", "Request body is invalid"), + INVALID_REQUEST_DATETIME_NOT_CURRENT_DATE("PMS_REQUEST_ERROR_006", "Request date should be current date"); /** * Error Code diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/dto/PageResponseV2Dto.java b/partner/pms-common/src/main/java/io/mosip/pms/common/dto/PageResponseV2Dto.java new file mode 100644 index 0000000000..03ad158d91 --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/dto/PageResponseV2Dto.java @@ -0,0 +1,21 @@ +package io.mosip.pms.common.dto; + +import java.util.ArrayList; +import java.util.List; + +import javax.validation.Valid; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PageResponseV2Dto { + private long pageNo; + private long pageSize; + private long totalResults; + @Valid + private List data = new ArrayList<>(); +} diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/dto/PolicyCountDto.java b/partner/pms-common/src/main/java/io/mosip/pms/common/dto/PolicyCountDto.java new file mode 100644 index 0000000000..aaf5f84cd4 --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/dto/PolicyCountDto.java @@ -0,0 +1,15 @@ +package io.mosip.pms.common.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PolicyCountDto { + + private Long draftPoliciesCount = 0L; + private Long activePoliciesCount = 0L; + +} diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/entity/ApiKeyRequestsSummaryEntity.java b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/ApiKeyRequestsSummaryEntity.java new file mode 100644 index 0000000000..6c1f300640 --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/ApiKeyRequestsSummaryEntity.java @@ -0,0 +1,85 @@ +package io.mosip.pms.common.entity; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import javax.persistence.*; +import java.util.Date; + +@Entity +@Getter +@Setter +@ToString +@SqlResultSetMapping( + name = "Mapping.ApiKeyRequestsSummaryEntity", + classes = { + @ConstructorResult( + targetClass = ApiKeyRequestsSummaryEntity.class, + columns = { + @ColumnResult(name = "apiKeyId", type = String.class), + @ColumnResult(name = "partnerId", type = String.class), + @ColumnResult(name = "apiKeyLabel", type = String.class), + @ColumnResult(name = "orgName", type = String.class), + @ColumnResult(name = "policyId", type = String.class), + @ColumnResult(name = "policyName", type = String.class), + @ColumnResult(name = "policyDescription", type = String.class), + @ColumnResult(name = "policyGroupId", type = String.class), + @ColumnResult(name = "policyGroupName", type = String.class), + @ColumnResult(name = "policyGroupDescription", type = String.class), + @ColumnResult(name = "status", type = String.class), + @ColumnResult(name = "createdDateTime", type = Date.class) + } + ) + } +) +public class ApiKeyRequestsSummaryEntity { + + public ApiKeyRequestsSummaryEntity( + String apiKeyId, String partnerId, String apiKeyLabel, String orgName, String policyId, + String policyName, String policyDescription, String policyGroupId, String policyGroupName, String policyGroupDescription, + String status, Date createdDateTime) { + this.apiKeyId = apiKeyId; + this.partnerId = partnerId; + this.apiKeyLabel = apiKeyLabel; + this.orgName = orgName; + this.policyId = policyId; + this.policyName = policyName; + this.policyDescription = policyDescription; + this.policyGroupId = policyGroupId; + this.policyGroupDescription = policyGroupDescription; + this.policyGroupName = policyGroupName; + this.status = status; + this.createdDateTime = createdDateTime; + } + + // No-argument constructor + public ApiKeyRequestsSummaryEntity() { + super(); + } + + @Id + private String apiKeyId; + + private String partnerId; + + private String apiKeyLabel; + + private String orgName; + + private String policyId; + + private String policyName; + + private String policyDescription; + + private String policyGroupId; + + private String policyGroupName; + + private String policyGroupDescription; + + private String status; + + private Date createdDateTime; +} diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/entity/ClientDetailV2.java b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/ClientDetailV2.java new file mode 100644 index 0000000000..e0d02c6331 --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/ClientDetailV2.java @@ -0,0 +1,72 @@ +package io.mosip.pms.common.entity; + +import lombok.Data; + +import javax.persistence.*; +import java.time.LocalDateTime; +import java.util.Date; + +@Entity +@Table(name="oidc_client") +@Data +public class ClientDetailV2 { + + @Id + private String id; + + @Column(name = "name") + private String name; + + @Column(name = "rp_id") + private String rpId; + + @Column(name = "policy_id") + private String policyId; + + @Column(name = "logo_uri") + private String logoUri; + + @Column(name = "redirect_uris") + private String redirectUris; + + @Column(name = "public_key", columnDefinition = "TEXT") + private String publicKey; + + @Column(name = "claims") + private String claims; + + @Column(name = "acr_values") + private String acrValues; + + @Column(name = "status") + private String status; + + @Column(name = "grant_types") + private String grantTypes; + + @Column(name = "auth_methods") + private String clientAuthMethods; + + @Column(name = "cr_by", nullable = false, length = 256) + public String createdBy; + + @Column(name = "cr_dtimes", nullable = false) + public Date createdDateTime; + + @Column(name = "upd_by", length = 256) + public String updatedBy; + + @Column(name = "upd_dtimes") + public Date updatedDateTime; + + @Column(name = "is_deleted") + public Boolean isDeleted; + + @ManyToOne + @JoinColumn(name="rp_id", insertable = false, updatable = false) + private PartnerV3 partner; + + @ManyToOne + @JoinColumn(name = "policy_id", insertable = false, updatable = false) + private AuthPolicy policy; +} diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/entity/ClientSummaryEntity.java b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/ClientSummaryEntity.java new file mode 100644 index 0000000000..5b927291c5 --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/ClientSummaryEntity.java @@ -0,0 +1,84 @@ +package io.mosip.pms.common.entity; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import javax.persistence.*; +import java.util.Date; + +@Entity +@Getter +@Setter +@ToString +@SqlResultSetMapping( + name = "Mapping.ClientSummaryEntity", + classes = { @ConstructorResult( + targetClass = ClientSummaryEntity.class, + columns = { + @ColumnResult(name = "partnerId", type = String.class), + @ColumnResult(name = "orgName", type = String.class), + @ColumnResult(name = "policyGroupName", type = String.class), + @ColumnResult(name = "policyGroupDescription", type = String.class), + @ColumnResult(name = "policyName", type = String.class), + @ColumnResult(name = "policyDescription", type = String.class), + @ColumnResult(name = "clientId", type = String.class), + @ColumnResult(name = "clientName", type = String.class), + @ColumnResult(name = "status", type = String.class), + @ColumnResult(name = "createdDateTime", type = Date.class), + @ColumnResult(name = "policyGroupId", type = String.class), + @ColumnResult(name = "updatedDateTime", type = Date.class) + }) + } +) +public class ClientSummaryEntity { + + public ClientSummaryEntity(String partnerId, String orgName, String policyGroupName, String policyGroupDescription, + String policyName, String policyDescription, String clientId, + String clientName, String status, Date createdDateTime, String policyGroupId, + Date updatedDateTime) { + + this.partnerId = partnerId; + this.orgName = orgName; + this.policyGroupName = policyGroupName; + this.policyGroupDescription = policyGroupDescription; + this.policyName = policyName; + this.policyDescription = policyDescription; + this.clientId = clientId; + this.clientName = clientName; + this.status = status; + this.createdDateTime = createdDateTime; + this.policyGroupId = policyGroupId; + this.updatedDateTime = updatedDateTime; + } + + // No-argument constructor + public ClientSummaryEntity() { + super(); + } + + private String partnerId; + + private String orgName; + + private String policyGroupName; + + private String policyGroupDescription; + + private String policyName; + + private String policyDescription; + + @Id + private String clientId; + + private String clientName; + + private String status; + + private Date createdDateTime; + + private String policyGroupId; + + private Date updatedDateTime; +} diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerPolicyRequestSummaryEntity.java b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerPolicyRequestSummaryEntity.java new file mode 100644 index 0000000000..136a0cf437 --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerPolicyRequestSummaryEntity.java @@ -0,0 +1,96 @@ +package io.mosip.pms.common.entity; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.util.Date; +import javax.persistence.*; + +@Entity +@Getter +@Setter +@ToString +@SqlResultSetMapping( + name = "Mapping.PartnerPolicyRequestSummaryEntity", + classes = { @ConstructorResult( + targetClass = PartnerPolicyRequestSummaryEntity.class, + columns = { + @ColumnResult(name = "id", type = String.class), + @ColumnResult(name = "partnerId", type = String.class), + @ColumnResult(name = "partnerStatus", type = String.class), + @ColumnResult(name = "partnerType", type = String.class), + @ColumnResult(name = "policyGroupId", type = String.class), + @ColumnResult(name = "policyGroupName", type = String.class), + @ColumnResult(name = "orgName", type = String.class), + @ColumnResult(name = "policyName", type = String.class), + @ColumnResult(name = "policyId", type = String.class), + @ColumnResult(name = "partnerComment", type = String.class), + @ColumnResult(name = "status", type = String.class), + @ColumnResult(name = "createdDateTime", type = Date.class), + @ColumnResult(name = "updatedDateTime", type = Date.class), + @ColumnResult(name = "policyDescription", type = String.class), + @ColumnResult(name = "policyGroupDescription", type = String.class) + }) + } +) +public class PartnerPolicyRequestSummaryEntity { + + public PartnerPolicyRequestSummaryEntity( + String id, String partnerId, String partnerStatus, String orgName, String partnerType, + String policyGroupId, String policyGroupName, String policyId, String policyName, String status, + Date createdDateTime, String partnerComment, Date updatedDateTime, + String policyDescription, String policyGroupDescription) { + this.id = id; + this.partnerId = partnerId; + this.partnerStatus = partnerStatus; + this.partnerType = partnerType; + this.orgName = orgName; + this.policyId = policyId; + this.policyGroupId = policyGroupId; + this.policyGroupName = policyGroupName; + this.policyName = policyName; + this.partnerComment = partnerComment; + this.status = status; + this.createdDateTime = createdDateTime; + this.updatedDateTime = updatedDateTime; + this.policyDescription = policyDescription; + this.policyGroupDescription = policyGroupDescription; + } + + // No-argument constructor + public PartnerPolicyRequestSummaryEntity() { + super(); + } + + @Id + private String id; + + private String partnerId; + + private String partnerStatus; + + private String partnerType; + + private String orgName; + + private String policyId; + + private String policyGroupId; + + private String policyGroupName; + + private String policyName; + + private String partnerComment; + + private String status; + + private Date createdDateTime; + + private Date updatedDateTime; + + private String policyDescription; + + private String policyGroupDescription; +} diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerPolicyRequestV2.java b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerPolicyRequestV2.java new file mode 100644 index 0000000000..4436571776 --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerPolicyRequestV2.java @@ -0,0 +1,56 @@ +package io.mosip.pms.common.entity; + +import lombok.Data; + +import javax.persistence.*; +import java.sql.Timestamp; + +@Entity +@Table(name="partner_policy_request") +@Data +public class PartnerPolicyRequestV2 { + + @Id + private String id; + + @Column(name="policy_id") + private String policyId; + + @Column(name="part_id") + private String partnerId; + + @Column(name="request_datetimes") + private Timestamp requestDateTime; + + @Column(name="request_detail") + private String requestDetail; + + @Column(name="cr_by") + private String createdBy; + + @Column(name="cr_dtimes") + private Timestamp createdDateTime; + + @Column(name="del_dtimes") + private Timestamp deletedDateTime; + + @Column(name="is_deleted") + private Boolean isDeleted; + + @Column(name="status_code") + private String statusCode; + + @Column(name="upd_by") + private String updatedBy; + + @Column(name="upd_dtimes") + private Timestamp updatedDateTime; + + @ManyToOne + @JoinColumn(name="part_id", insertable = false, updatable = false) + private PartnerV3 partner; + + @ManyToOne + @JoinColumn(name = "policy_id", insertable = false, updatable = false) + private AuthPolicy policy; +} diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerPolicyV2.java b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerPolicyV2.java new file mode 100644 index 0000000000..d4a70ac762 --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerPolicyV2.java @@ -0,0 +1,57 @@ +package io.mosip.pms.common.entity; + +import javax.persistence.*; +import java.sql.Timestamp; + +@Entity +@Table(name="partner_policy") +public class PartnerPolicyV2 { + + @Id + @Column(name="policy_api_key") + private String apiKeyId; + + @Column(name="part_id") + private String partnerId; + + @Column(name="cr_by") + private String createdBy; + + @Column(name="cr_dtimes") + private Timestamp createdDateTime; + + @Column(name="del_dtimes") + private Timestamp deletedDateTime; + + @Column(name="is_active") + private Boolean isActive; + + @Column(name="is_deleted") + private Boolean isDeleted; + + @Column(name="policy_id") + private String policyId; + + @Column(name="upd_by") + private String updatedBy; + + @Column(name="upd_dtimes") + private Timestamp updatedDateTime; + + @Column(name="valid_from_datetime") + private Timestamp validFromDatetime; + + @Column(name="valid_to_datetime") + private Timestamp validToDatetime; + + @Column(name = "label") + private String label; + + @ManyToOne + @JoinColumn(name="part_id", insertable = false, updatable = false) + private PartnerV3 partner; + + @ManyToOne + @JoinColumn(name = "policy_id", insertable = false, updatable = false) + private AuthPolicy policy; +} \ No newline at end of file diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerSummaryEntity.java b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerSummaryEntity.java new file mode 100644 index 0000000000..d3d613fc66 --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerSummaryEntity.java @@ -0,0 +1,76 @@ +package io.mosip.pms.common.entity; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.util.Date; +import javax.persistence.*; + +@Entity +@Getter +@Setter +@ToString +@SqlResultSetMapping( + name = "Mapping.PartnerSummaryEntity", + classes = { @ConstructorResult( + targetClass = PartnerSummaryEntity.class, + columns = { + @ColumnResult(name = "partnerId", type = String.class), + @ColumnResult(name = "partnerType", type = String.class), + @ColumnResult(name = "orgName", type = String.class), + @ColumnResult(name = "policyGroupId", type = String.class), + @ColumnResult(name = "policyGroupName", type = String.class), + @ColumnResult(name = "emailAddress", type = String.class), + @ColumnResult(name = "certificateUploadStatus", type = String.class), + @ColumnResult(name = "status", type = String.class), + @ColumnResult(name = "isActive", type = Boolean.class), + @ColumnResult(name = "createdDateTime", type = Date.class) + }) + } +) +public class PartnerSummaryEntity { + + public PartnerSummaryEntity( + String partnerId, String partnerType, String orgName, String policyGroupId, + String policyGroupName, String emailAddress, + String certificateUploadStatus, String status, Boolean isActive, + Date createdDateTime) { + this.partnerId = partnerId; + this.partnerType = partnerType; + this.orgName = orgName; + this.policyGroupId = policyGroupId; + this.policyGroupName = policyGroupName; + this.emailAddress = emailAddress; + this.certificateUploadStatus = certificateUploadStatus; + this.status = status; + this.isActive = isActive; + this.createdDateTime = createdDateTime; + } + + // No-argument constructor + public PartnerSummaryEntity() { + super(); + } + + @Id + private String partnerId; + + private String partnerType; + + private String orgName; + + private String policyGroupId; + + private String policyGroupName; + + private String emailAddress; + + private String certificateUploadStatus; + + private String status; + + private Boolean isActive; + + private Date createdDateTime; +} diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerV3.java b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerV3.java new file mode 100644 index 0000000000..dac1c61872 --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PartnerV3.java @@ -0,0 +1,77 @@ +package io.mosip.pms.common.entity; + +import lombok.Data; + +import javax.persistence.*; +import java.sql.Timestamp; +import java.util.List; + +@Entity +@Table(name="partner") +@Data +public class PartnerV3 { + + @Id + private String id; + + @Column(name="address") + private String address; + + @Column(name="contact_no") + private String contactNo; + + @Column(name="cr_by") + private String crBy; + + @Column(name="cr_dtimes") + private Timestamp crDtimes; + + @Column(name="del_dtimes") + private Timestamp delDtimes; + + @Column(name="email_id") + private String emailId; + + @Column(name="is_active") + private Boolean isActive; + + @Column(name="is_deleted") + private Boolean isDeleted; + + @Column(name="name") + private String name; + + @Column(name="policy_group_id") + private String policyGroupId; + + @Column(name="certificate_alias") + private String certificateAlias; + + @Column(name = "partner_type_code") + private String partnerTypeCode; + + @Column(name="approval_status") + private String approvalStatus; + + @Column(name="upd_by") + private String updBy; + + @Column(name="upd_dtimes") + private Timestamp updDtimes; + + @Column(name="user_id") + private String userId; + + @Column(name = "lang_code") + private String langCode; + + @Column(name = "logo_url") + private String logoUrl; + + @Column(name = "addl_info") + private String additionalInfo; + + @ManyToOne + @JoinColumn(name = "policy_group_id", insertable = false, updatable = false) + private PolicyGroup policyGroup; +} diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PolicySummaryEntity.java b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PolicySummaryEntity.java new file mode 100644 index 0000000000..8db982a2e2 --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/entity/PolicySummaryEntity.java @@ -0,0 +1,60 @@ +package io.mosip.pms.common.entity; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import javax.persistence.*; +import java.util.Date; + +@Entity +@Getter +@Setter +@ToString +@SqlResultSetMapping( + name = "Mapping.PolicySummaryEntity", + classes = { @ConstructorResult( + targetClass = PolicySummaryEntity.class, + columns = { + @ColumnResult(name = "policyId", type = String.class), + @ColumnResult(name = "policyName", type = String.class), + @ColumnResult(name = "policyDescription", type = String.class), + @ColumnResult(name = "policyGroupId", type = String.class), + @ColumnResult(name = "policyGroupName", type = String.class), + @ColumnResult(name = "status", type = String.class), + @ColumnResult(name = "createdDateTime", type = Date.class) + }) + } +) +public class PolicySummaryEntity { + + public PolicySummaryEntity(String policyId, String policyName, String policyDescription, + String policyGroupId, String policyGroupName, String status, Date createdDateTime) { + this.policyId = policyId; + this.policyName = policyName; + this.policyDescription = policyDescription; + this.policyGroupId = policyGroupId; + this.policyGroupName = policyGroupName; + this.status = status; + this.createdDateTime = createdDateTime; + } + + public PolicySummaryEntity() { + super(); + } + + @Id + private String policyId; + + private String policyName; + + private String policyDescription; + + private String policyGroupId; + + private String policyGroupName; + + private String status; + + private Date createdDateTime; +} diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/repository/ApiKeyRequestSummaryRepository.java b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/ApiKeyRequestSummaryRepository.java new file mode 100644 index 0000000000..111b2d8091 --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/ApiKeyRequestSummaryRepository.java @@ -0,0 +1,50 @@ +package io.mosip.pms.common.repository; + +import io.mosip.kernel.core.dataaccess.spi.repository.BaseRepository; +import io.mosip.pms.common.entity.ApiKeyRequestsSummaryEntity; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository("ApiKeyRequestSummaryRepository") +public interface ApiKeyRequestSummaryRepository extends BaseRepository { + + @Query(value = "SELECT new io.mosip.pms.common.entity.ApiKeyRequestsSummaryEntity(" + + "pp.apiKeyId, pp.partnerId, pp.label, p.name, pp.policyId, ap.name, ap.descr, pg.id, pg.name, pg.desc, " + + "CASE " + + "WHEN pp.isActive = false THEN 'deactivated' " + + "WHEN pp.isActive = true THEN 'activated' " + + "END, " + + "pp.createdDateTime) " + + "FROM PartnerPolicyV2 pp " + + "LEFT JOIN pp.partner p " + + "LEFT JOIN pp.policy ap " + + "LEFT JOIN ap.policyGroup pg " + + "WHERE (:partnerId IS NULL OR lower(pp.partnerId) LIKE %:partnerId%) " + + "AND (p.partnerTypeCode = 'Auth_Partner') " + + "AND (:apiKeyLabel IS NULL OR lower(pp.label) LIKE %:apiKeyLabel%) " + + "AND (:orgName IS NULL OR lower(p.name) LIKE %:orgName%) " + + "AND (:policyName IS NULL OR lower(ap.name) LIKE %:policyName%) " + + "AND (:policyGroupName IS NULL OR lower(pg.name) LIKE %:policyGroupName%) " + + "AND (:status IS NULL OR " + + "(:status = 'deactivated' AND pp.isActive = false) " + + "OR (:status = 'activated' AND pp.isActive = true))" + + "AND (:isPartnerAdmin = true OR (p.id IN :partnerIdList)) " + ) + Page getSummaryOfAllApiKeyRequests( + @Param("partnerId") String partnerId, + @Param("apiKeyLabel") String apiKeyLabel, + @Param("orgName") String orgName, + @Param("policyName") String policyName, + @Param("policyGroupName") String policyGroupName, + @Param("status") String status, + @Param("partnerIdList") List partnerIdList, + @Param("isPartnerAdmin") boolean isPartnerAdmin, + Pageable pageable + ); + +} \ No newline at end of file diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/repository/AuthPolicyRepository.java b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/AuthPolicyRepository.java index 79bc4eca07..fa257afce0 100644 --- a/partner/pms-common/src/main/java/io/mosip/pms/common/repository/AuthPolicyRepository.java +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/AuthPolicyRepository.java @@ -2,6 +2,7 @@ import java.util.List; +import io.mosip.pms.common.dto.PolicyCountDto; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; @@ -36,7 +37,14 @@ public interface AuthPolicyRepository extends JpaRepository{ @Query(value = "select * from auth_policy ap where ap.policy_group_id=? and (ap.is_deleted is null or ap.is_deleted = false) and ap.is_active = true",nativeQuery = true) List findActivePoliciesByPolicyGroupId(String policyGroupId); - + + @Query("SELECT new io.mosip.pms.common.dto.PolicyCountDto(" + + "COUNT(CASE WHEN ap.isActive = false AND ap.schema IS NULL THEN 1 END), " + + "COUNT(CASE WHEN ap.isActive = true AND ap.schema IS NOT NULL THEN 1 END)) " + + "FROM AuthPolicy ap " + + "WHERE ap.policyGroup.id = :policyGroupId AND (ap.isDeleted IS NULL OR ap.isDeleted = false)") + PolicyCountDto findPolicyCountsByPolicyGroupId(@Param("policyGroupId") String policyGroupId); + @Query(value = "select * from auth_policy ap where ap.name=? and (ap.is_deleted is null or ap.is_deleted = false) and ap.is_active = true",nativeQuery = true) AuthPolicy findByPolicyName(String policyName); diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/repository/ClientSummaryRepository.java b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/ClientSummaryRepository.java new file mode 100644 index 0000000000..6c8fdc2a07 --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/ClientSummaryRepository.java @@ -0,0 +1,42 @@ +package io.mosip.pms.common.repository; + +import io.mosip.kernel.core.dataaccess.spi.repository.BaseRepository; +import io.mosip.pms.common.entity.ClientSummaryEntity; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository("ClientSummaryRepository") +public interface ClientSummaryRepository extends BaseRepository { + + @Query(value = "SELECT new ClientSummaryEntity(" + + "c.rpId, p.name, pg.name, pg.desc, ap.name, " + + "ap.descr, c.id, c.name, c.status, c.createdDateTime, pg.id, c.updatedDateTime) " + + "FROM ClientDetailV2 c " + + "LEFT JOIN c.policy ap " + + "LEFT JOIN c.partner p " + + "LEFT JOIN p.policyGroup pg " + + "WHERE (:partnerId IS NULL OR lower(c.rpId) LIKE %:partnerId%) " + + "AND (:orgName IS NULL OR lower(p.name) LIKE %:orgName%) " + + "AND (:policyGroupName IS NULL OR lower(pg.name) LIKE %:policyGroupName%) " + + "AND (:policyName IS NULL OR lower(ap.name) LIKE %:policyName%) " + + "AND (:clientName IS NULL OR lower(c.name) LIKE %:clientName%) " + + "AND (:status IS NULL OR c.status = :status) " + + "AND (:isPartnerAdmin = true OR (c.rpId IN :partnerIdList)) " + ) + Page getSummaryOfAllPartnerClients( + @Param("partnerId") String partnerId, + @Param("orgName") String orgName, + @Param("policyGroupName") String policyGroupName, + @Param("policyName") String policyName, + @Param("clientName") String clientName, + @Param("status") String status, + @Param("partnerIdList") List partnerIdList, + @Param("isPartnerAdmin") boolean isPartnerAdmin, + Pageable pageable + ); +} diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/repository/DeviceDetailSbiRepository.java b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/DeviceDetailSbiRepository.java index db147a1622..3b905cacd2 100644 --- a/partner/pms-common/src/main/java/io/mosip/pms/common/repository/DeviceDetailSbiRepository.java +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/DeviceDetailSbiRepository.java @@ -6,9 +6,20 @@ import io.mosip.pms.common.entity.DeviceDetailSBI; +import java.util.List; + @Repository public interface DeviceDetailSbiRepository extends JpaRepository{ @Query(value = "select * from device_detail_sbi dds where dds.device_detail_id=?1 and dds.sbi_id = ?2",nativeQuery = true) DeviceDetailSBI findByDeviceDetailAndSbi(String deviceDetailId, String sbiId); + + @Query(value = "select * from device_detail_sbi dds where dds.dprovider_id=?1 and dds.sbi_id = ?2",nativeQuery = true) + List findByDeviceProviderIdAndSbiId(String dproviderId, String sbiId); + + @Query(value = "select * from device_detail_sbi dds where dds.device_detail_id=?1",nativeQuery = true) + List findByDeviceDetailId(String deviceDetailId); + + @Query(value = "select * from device_detail_sbi dds where dds.dprovider_id=?1 and dds.sbi_id=?2 and dds.device_detail_id=?3",nativeQuery = true) + DeviceDetailSBI findByDeviceProviderIdAndSbiIdAndDeviceDetailId(String dproviderId, String sbiId, String deviceDetailId); } diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/repository/PartnerPolicyMappingRequestRepository.java b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/PartnerPolicyMappingRequestRepository.java new file mode 100644 index 0000000000..199ea888ea --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/PartnerPolicyMappingRequestRepository.java @@ -0,0 +1,53 @@ +package io.mosip.pms.common.repository; + +import io.mosip.kernel.core.dataaccess.spi.repository.BaseRepository; +import io.mosip.pms.common.entity.PartnerPolicyRequestSummaryEntity; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface PartnerPolicyMappingRequestRepository extends BaseRepository { + + @Query(value = "SELECT new PartnerPolicyRequestSummaryEntity(" + + "ppr.id, ppr.partnerId, " + + "CASE " + + "WHEN p.approvalStatus = 'approved' AND p.isActive = true THEN 'approved' " + + "WHEN p.approvalStatus = 'approved' AND p.isActive = false THEN 'deactivated' " + + "WHEN p.approvalStatus = 'InProgress' THEN 'InProgress' " + + "WHEN p.approvalStatus = 'rejected' THEN 'rejected' " + + "END AS status, " + + "p.name, p.partnerTypeCode, p.policyGroupId, pg.name, ppr.policyId, ap.name, " + + "ppr.statusCode, ppr.createdDateTime, ppr.requestDetail, ppr.updatedDateTime, ap.descr, pg.desc) " + + "FROM PartnerPolicyRequestV2 ppr " + + "LEFT JOIN ppr.policy ap " + + "LEFT JOIN ppr.partner p " + + "LEFT JOIN p.policyGroup pg " + + "WHERE (:partnerId IS NULL OR lower(ppr.partnerId) LIKE %:partnerId%) " + + "AND (:partnerTypeCode IS NULL OR lower(p.partnerTypeCode) LIKE %:partnerTypeCode%) " + + "AND (:organizationName IS NULL OR lower(p.name) LIKE %:organizationName%) " + + "AND (:policyId IS NULL OR lower(ap.id) LIKE %:policyId%) " + + "AND (:policyName IS NULL OR lower(ap.name) LIKE %:policyName%) " + + "AND (:policyGroupName IS NULL OR lower(pg.name) LIKE %:policyGroupName%) " + + "AND (:partnerComment IS NULL OR lower(ppr.requestDetail) LIKE %:partnerComment%) " + + "AND (:statusCode IS NULL OR ppr.statusCode = :statusCode) " + + "AND (:isPartnerAdmin = true OR (p.id IN :partnerIdList)) " + ) + Page getSummaryOfAllPartnerPolicyRequests( + @Param("partnerId") String partnerId, + @Param("partnerTypeCode") String partnerTypeCode, + @Param("organizationName") String organizationName, + @Param("policyId") String policyId, + @Param("policyName") String policyName, + @Param("statusCode") String statusCode, + @Param("partnerComment") String partnerComment, + @Param("policyGroupName") String policyGroupName, + @Param("partnerIdList") List partnerIdList, + @Param("isPartnerAdmin") boolean isPartnerAdmin, + Pageable pageable + ); +} \ No newline at end of file diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/repository/PartnerPolicyRequestRepository.java b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/PartnerPolicyRequestRepository.java index 46119fc72a..0f2fde9466 100644 --- a/partner/pms-common/src/main/java/io/mosip/pms/common/repository/PartnerPolicyRequestRepository.java +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/PartnerPolicyRequestRepository.java @@ -23,4 +23,7 @@ public interface PartnerPolicyRequestRepository extends JpaRepository findByPartnerIdAndPolicyIdAndStatusCode(String partnerId, String policyId, String status); + + @Query(value = "select * from partner_policy_request ppr where ppr.policy_id=?1 and ppr.status_code=?2", nativeQuery = true ) + List findByPolicyIdAndStatusCode(String policyId, String status); } diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/repository/PartnerServiceRepository.java b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/PartnerServiceRepository.java index 101ed945e0..b76aab248e 100644 --- a/partner/pms-common/src/main/java/io/mosip/pms/common/repository/PartnerServiceRepository.java +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/PartnerServiceRepository.java @@ -37,4 +37,18 @@ public interface PartnerServiceRepository extends JpaRepository @Query(value = "select * from partner ppr where ppr.user_id=?", nativeQuery = true) public List findByUserId(String userId); + + @Query("SELECT p FROM Partner p " + + "WHERE p.userId = :userId " + + "AND (p.approvalStatus = :status) " + + "AND (:partnerType IS NULL OR p.partnerTypeCode = :partnerType) " + + "AND ((:policyGroupAvailable IS NULL) " + + "OR (:policyGroupAvailable = TRUE AND p.policyGroupId IS NOT NULL) " + + "OR (:policyGroupAvailable = FALSE AND p.policyGroupId IS NULL))") + public List findPartnersByUserIdAndStatusAndPartnerTypeAndPolicyGroupAvailable( + @Param("status") String status, + @Param("userId") String userId, + @Param("partnerType") String partnerType, + @Param("policyGroupAvailable") Boolean policyGroupAvailable); + } diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/repository/PartnerSummaryRepository.java b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/PartnerSummaryRepository.java new file mode 100644 index 0000000000..2903efc1df --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/PartnerSummaryRepository.java @@ -0,0 +1,41 @@ +package io.mosip.pms.common.repository; + +import io.mosip.kernel.core.dataaccess.spi.repository.BaseRepository; +import io.mosip.pms.common.entity.PartnerSummaryEntity; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository("PartnerSummaryRepository") +public interface PartnerSummaryRepository extends BaseRepository { + + @Query(value = "SELECT new PartnerSummaryEntity(" + + "p.id, p.partnerTypeCode, p.name, p.policyGroup.id, pg.name, " + + "p.emailId, CASE WHEN p.certificateAlias IS NULL THEN 'not_uploaded' ELSE 'uploaded' END, " + + "p.approvalStatus, p.isActive, p.crDtimes) " + + "FROM PartnerV3 p " + + "LEFT JOIN p.policyGroup pg " + + "WHERE (:partnerId IS NULL OR lower(p.id) LIKE %:partnerId%) " + + "AND (:partnerTypeCode IS NULL OR lower(p.partnerTypeCode) LIKE %:partnerTypeCode%) " + + "AND (:organizationName IS NULL OR lower(p.name) LIKE %:organizationName%) " + + "AND (:policyGroupName IS NULL OR lower(pg.name) LIKE %:policyGroupName%) " + + "AND (:certificateUploadStatus IS NULL OR " + + "(:certificateUploadStatus = 'not_uploaded' AND p.certificateAlias IS NULL) " + + "OR (:certificateUploadStatus = 'uploaded' AND p.certificateAlias IS NOT NULL)) " + + "AND (:emailAddress IS NULL OR lower(p.emailId) LIKE %:emailAddress%) " + + "AND (:isActive IS NULL OR p.isActive = :isActive)" + ) + Page getSummaryOfAllPartners( + @Param("partnerId") String partnerId, + @Param("partnerTypeCode") String partnerTypeCode, + @Param("organizationName") String organizationName, + @Param("policyGroupName") String policyGroupName, + @Param("certificateUploadStatus") String certificateUploadStatus, + @Param("emailAddress") String emailAddress, + @Param("isActive") Boolean isActive, + Pageable pageable + ); + +} \ No newline at end of file diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/repository/PolicySummaryRepository.java b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/PolicySummaryRepository.java new file mode 100644 index 0000000000..e65cf6c22e --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/repository/PolicySummaryRepository.java @@ -0,0 +1,67 @@ +package io.mosip.pms.common.repository; + +import io.mosip.kernel.core.dataaccess.spi.repository.BaseRepository; +import io.mosip.pms.common.entity.PolicySummaryEntity; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository("PolicySummaryRepository") +public interface PolicySummaryRepository extends BaseRepository { + + String POLICY_SUMMARY_QUERY = "SELECT new PolicySummaryEntity(" + + "p.id, p.name, p.descr, p.policyGroup.id, pg.name, " + + "CASE " + + "WHEN (p.schema IS NULL AND p.isActive = false) THEN 'draft' " + + "WHEN (p.schema IS NOT NULL AND p.isActive = true) THEN 'activated' " + + "WHEN (p.schema IS NOT NULL AND p.isActive = false) THEN 'deactivated' " + + "END as status, " + + "p.crDtimes) " + + "FROM AuthPolicy p " + + "LEFT JOIN p.policyGroup pg " + + "WHERE (:policyId IS NULL OR lower(p.id) LIKE %:policyId%) " + + "AND (:policyType IS NULL OR lower(p.policyType) LIKE %:policyType%) " + + "AND (:policyName IS NULL OR lower(p.name) LIKE %:policyName%) " + + "AND (:policyDescription IS NULL OR lower(p.descr) LIKE %:policyDescription%) " + + "AND (:policyGroupName IS NULL OR lower(pg.name) LIKE %:policyGroupName%) " + + "AND (:status IS NULL OR " + + "(:status = 'draft' AND p.schema IS NULL AND p.isActive = false) " + + "OR (:status = 'deactivated' AND p.schema IS NOT NULL AND p.isActive = false) " + + "OR (:status = 'activated' AND p.schema IS NOT NULL AND p.isActive = true))"; + + @Query(POLICY_SUMMARY_QUERY) + Page getSummaryOfAllPolicies( + @Param("policyId") String policyId, + @Param("policyType") String policyType, + @Param("policyName") String policyName, + @Param("policyDescription") String policyDescription, + @Param("policyGroupName") String policyGroupName, + @Param("status") String status, + Pageable pageable + ); + + @Query(POLICY_SUMMARY_QUERY + " ORDER BY status ASC") + Page getSummaryOfAllPoliciesByStatusAsc( + @Param("policyId") String policyId, + @Param("policyType") String policyType, + @Param("policyName") String policyName, + @Param("policyDescription") String policyDescription, + @Param("policyGroupName") String policyGroupName, + @Param("status") String status, + Pageable pageable + ); + + @Query(POLICY_SUMMARY_QUERY + " ORDER BY status DESC") + Page getSummaryOfAllPoliciesByStatusDesc( + @Param("policyId") String policyId, + @Param("policyType") String policyType, + @Param("policyName") String policyName, + @Param("policyDescription") String policyDescription, + @Param("policyGroupName") String policyGroupName, + @Param("status") String status, + Pageable pageable + ); + +} diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/request/dto/RequestWrapperV2.java b/partner/pms-common/src/main/java/io/mosip/pms/common/request/dto/RequestWrapperV2.java new file mode 100644 index 0000000000..3000052722 --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/request/dto/RequestWrapperV2.java @@ -0,0 +1,24 @@ +package io.mosip.pms.common.request.dto; + +import java.time.LocalDateTime; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Data; + +@Data +public class RequestWrapperV2 { + private String id; + private String version; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") + private LocalDateTime requestTime; + + private Object metadata; + + @NotNull + @Valid + private T request; +} \ No newline at end of file diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/response/dto/ResponseWrapperV2.java b/partner/pms-common/src/main/java/io/mosip/pms/common/response/dto/ResponseWrapperV2.java new file mode 100644 index 0000000000..49a6c24156 --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/response/dto/ResponseWrapperV2.java @@ -0,0 +1,29 @@ +package io.mosip.pms.common.response.dto; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.List; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import io.mosip.pms.common.request.dto.ErrorResponse; +import lombok.Data; + +@Data +public class ResponseWrapperV2 { + private String id; + private String version; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") + private LocalDateTime responseTime = LocalDateTime.now(ZoneId.of("UTC")); + private Object metadata; + @NotNull + @Valid + private T response; + + private List errors = new ArrayList<>(); + +} \ No newline at end of file diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/util/RequestValidator.java b/partner/pms-common/src/main/java/io/mosip/pms/common/util/RequestValidator.java new file mode 100644 index 0000000000..17fe011f51 --- /dev/null +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/util/RequestValidator.java @@ -0,0 +1,97 @@ +package io.mosip.pms.common.util; + +import io.micrometer.core.lang.NonNull; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.pms.common.constant.ValidationErrorCode; +import io.mosip.pms.common.exception.RequestException; +import io.mosip.pms.common.request.dto.ErrorResponse; +import io.mosip.pms.common.request.dto.RequestWrapperV2; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.*; + +@Component +public class RequestValidator { + + public static final String VERSION = "1.0"; + + private static final Logger LOGGER = PMSLogger.getLogger(RequestValidator.class); + + public void validateId(String operation, String requestId) { + if (Objects.nonNull(requestId)) { + if (!requestId.equals(operation)) { + LOGGER.error("", "", "validateId", "\n" + "Id is not correct"); + throw new RequestException(ValidationErrorCode.INVALID_REQUEST_ID.getErrorCode(), + ValidationErrorCode.INVALID_REQUEST_ID.getErrorMessage()); + } + } else { + LOGGER.error("", "", "validateId", "\n" + "Id is null"); + throw new RequestException(ValidationErrorCode.INVALID_REQUEST_ID.getErrorCode(), + ValidationErrorCode.INVALID_REQUEST_ID.getErrorMessage()); + } + } + + public Optional> validate(@NonNull String operation, RequestWrapperV2 requestWrapper) { + try { + validateId(operation, requestWrapper.getId()); + validateReqTime(requestWrapper.getRequestTime()); + validateVersion(requestWrapper.getVersion()); + validateRequest(requestWrapper.getRequest()); + } catch (RequestException ex) { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + responseWrapper.setId(operation); + responseWrapper.setVersion(VERSION); + responseWrapper.setErrors(setErrorResponse(ex.getErrors().get(0).getErrorCode(), ex.getErrors().get(0).getMessage())); + return Optional.of(responseWrapper); + } + return Optional.empty(); + } + + protected void validateReqTime(LocalDateTime reqTime) { + if (Objects.isNull(reqTime)) { + LOGGER.error("", "", "validateReqTime", "requesttime is null"); + throw new RequestException(ValidationErrorCode.INVALID_REQUEST_DATETIME.getErrorCode(), + ValidationErrorCode.INVALID_REQUEST_DATETIME.getErrorMessage()); + } else { + LocalDate localDate = reqTime.toLocalDate(); + LocalDate serverDate = new Date().toInstant().atZone(ZoneId.of("UTC")).toLocalDate(); + if (localDate.isBefore(serverDate) || localDate.isAfter(serverDate)) { + throw new RequestException(ValidationErrorCode.INVALID_REQUEST_DATETIME_NOT_CURRENT_DATE.getErrorCode(), + ValidationErrorCode.INVALID_REQUEST_DATETIME_NOT_CURRENT_DATE.getErrorMessage()); + } + } + } + + protected void validateVersion(String ver) { + if (Objects.isNull(ver)) { + LOGGER.error("", "", "validateVersion", "version is null"); + throw new RequestException(ValidationErrorCode.INVALID_REQUEST_VERSION.getErrorCode(), + ValidationErrorCode.INVALID_REQUEST_VERSION.getErrorMessage()); + } else if (!VERSION.equalsIgnoreCase(ver)) { + LOGGER.error("", "", "validateVersion", "version is not correct"); + throw new RequestException(ValidationErrorCode.INVALID_REQUEST_VERSION.getErrorCode(), + ValidationErrorCode.INVALID_REQUEST_VERSION.getErrorMessage()); + } + } + + protected void validateRequest(Object request) { + if (Objects.isNull(request)) { + LOGGER.error("", "", "validateRequest", "\n" + "request is null"); + throw new RequestException(ValidationErrorCode.INVALID_REQUEST_BODY.getErrorCode(), + ValidationErrorCode.INVALID_REQUEST_BODY.getErrorMessage()); + } + } + + public static List setErrorResponse(String errorCode, String errorMessage) { + List errorResponseList = new ArrayList<>(); + ErrorResponse errorResponse = new ErrorResponse(); + errorResponse.setErrorCode(errorCode); + errorResponse.setMessage(errorMessage); + errorResponseList.add(errorResponse); + return errorResponseList; + } +} diff --git a/partner/pms-common/src/main/java/io/mosip/pms/common/util/RestUtil.java b/partner/pms-common/src/main/java/io/mosip/pms/common/util/RestUtil.java index 1d15098384..9f00683216 100644 --- a/partner/pms-common/src/main/java/io/mosip/pms/common/util/RestUtil.java +++ b/partner/pms-common/src/main/java/io/mosip/pms/common/util/RestUtil.java @@ -239,6 +239,37 @@ public T getApi(String apiUrl, Map pathsegments, Class re return result; } + /** + * + * @param + * @param apiUrl + * @param pathsegments + * @param responseType + * @return + */ + @SuppressWarnings("unchecked") + public T getApiWithContentType(String apiUrl, Map pathsegments, Class responseType, MediaType mediaType) { + T result = null; + UriComponentsBuilder builder = null; + if (apiUrl != null) { + builder = UriComponentsBuilder.fromUriString(apiUrl); + URI urlWithPath = builder.build(pathsegments); + RestTemplate restTemplate; + try { + restTemplate = getRestTemplate(); + result = (T) restTemplate + .exchange(urlWithPath, HttpMethod.GET, setRequestHeader(null, mediaType), responseType).getBody(); + } catch (Exception e) { + logger.error("Error occurred while calling {}", urlWithPath, e.getStackTrace()); + throw new ApiAccessibleException( + ApiAccessibleExceptionConstant.API_NOT_ACCESSIBLE_EXCEPTION.getErrorCode(), + ApiAccessibleExceptionConstant.API_NOT_ACCESSIBLE_EXCEPTION.getErrorMessage()); + } + + } + return result; + } + /** * * @return diff --git a/partner/policy-management-service/Dockerfile b/partner/policy-management-service/Dockerfile index 52e50f2df8..4a51b60034 100644 --- a/partner/policy-management-service/Dockerfile +++ b/partner/policy-management-service/Dockerfile @@ -32,9 +32,6 @@ ENV spring_config_label_env=${spring_config_label} # environment variable to pass spring configuration url, at docker runtime ENV spring_config_url_env=${spring_config_url} -# environment variable to pass iam_adapter url, at docker runtime -ENV iam_adapter_url_env=${iam_adapter_url} - # can be passed during Docker build as build time environment for github branch to pickup configuration from. ARG container_user=mosip @@ -66,5 +63,8 @@ USER ${container_user_uid}:${container_user_gid} EXPOSE 9107 -CMD wget -q --show-progress "${iam_adapter_url_env}" -O kernel-auth-adapter.jar; \ - java -jar -Dloader.path=./kernel-auth-adapter.jar -Dspring.cloud.config.label="${spring_config_label_env}" -Dspring.profiles.active="${active_profile_env}" -Dspring.cloud.config.uri="${spring_config_url_env}" policy-management-service.jar ; \ +CMD java -jar \ + -Dspring.cloud.config.label="${spring_config_label_env}" \ + -Dspring.profiles.active="${active_profile_env}" \ + -Dspring.cloud.config.uri="${spring_config_url_env}" \ + policy-management-service.jar diff --git a/partner/policy-management-service/README.md b/partner/policy-management-service/README.md index 68d65a0448..135bb7793e 100644 --- a/partner/policy-management-service/README.md +++ b/partner/policy-management-service/README.md @@ -1,4 +1,68 @@ # Policy management service -This repository contains the source code for policy management service. For an overview refer [here](https://nayakrounak.gitbook.io/mosip-docs/modules/partner-management). +## Overview +This repository contains the source code for policy management service. For an overview refer [here](https://docs.mosip.io/1.2.0/partners). +## Databases +Refer to [SQL scripts](../../db_scripts). + +## Build & run (for developers) +The project requires JDK 1.11. + +1. Build and install: + ``` + $ cd partner/policy-management-service + $ mvn install -DskipTests=true -Dmaven.javadoc.skip=true -Dgpg.skip=true + ``` +2. Build Docker for a service: + ``` + $ cd + $ docker build -f Dockerfile + ``` + +### Configuration +[policy-management-default.properties](https://github.com/mosip/mosip-config/blob/master/policy-default.properties) + +[application-default.properties](https://github.com/mosip/mosip-config/blob/master/application-default.properties) + +defined here. + +### Add auth-adapter in a class-path to run a services + ``` + + io.mosip.kernel + kernel-auth-adapter + ${kernel.auth.adapter.version} + + ``` + +## Deployment in K8 cluster with other MOSIP services: +### Pre-requisites +* Set KUBECONFIG variable to point to existing K8 cluster kubeconfig file: + ``` + export KUBECONFIG=~/.kube/ + ``` +### Install + ``` + $ cd deploy + $ ./install.sh + ``` +### Delete + ``` + $ cd deploy + $ ./delete.sh + ``` +### Restart + ``` + $ cd deploy + $ ./restart.sh + ``` + +## Test +Automated functional tests available in [Functional Tests](../../api-test). + +## APIs +API documentation is available [here](https://mosip.github.io/documentation/). + +## License +This project is licensed under the terms of [Mozilla Public License 2.0](../../LICENSE) \ No newline at end of file diff --git a/partner/policy-management-service/pom.xml b/partner/policy-management-service/pom.xml index dc8fb01ae6..7c59a64c10 100644 --- a/partner/policy-management-service/pom.xml +++ b/partner/policy-management-service/pom.xml @@ -5,10 +5,10 @@ pms-parent io.mosip.pms - 1.3.0-dp.1 + 1.3.0-beta1 - 1.3.0-dp.1 + 1.3.0-beta1 policy-management-service policy-management-service @@ -18,15 +18,20 @@ 1.2.0.1 provided + + io.mosip.kernel + kernel-auth-adapter + ${kernel.authadapter.version} + io.mosip.pms policy-validator - 1.3.0-dp.1 + 1.3.0-beta1 io.mosip.pms pms-common - 1.3.0-dp.1 + 1.3.0-beta1 io.micrometer diff --git a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/controller/PolicyManagementController.java b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/controller/PolicyManagementController.java index c2d1a39f41..b422840c7b 100644 --- a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/controller/PolicyManagementController.java +++ b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/controller/PolicyManagementController.java @@ -3,9 +3,21 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.util.List; +import java.util.Optional; import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import io.mosip.pms.common.request.dto.RequestWrapperV2; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.common.util.RequestValidator; +import io.mosip.pms.policy.util.PolicyUtil; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.json.simple.parser.ParseException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -18,7 +30,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; - +import org.springframework.web.bind.annotation.RequestParam; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; @@ -30,6 +42,7 @@ import io.mosip.pms.common.dto.PolicySearchDto; import io.mosip.pms.common.dto.SearchAuthPolicy; import io.mosip.pms.common.dto.SearchDto; +import io.mosip.pms.common.dto.PageResponseV2Dto; import io.mosip.pms.common.entity.PolicyGroup; import io.mosip.pms.common.util.PMSLogger; import io.mosip.pms.policy.dto.FilterResponseCodeDto; @@ -48,6 +61,12 @@ import io.mosip.pms.policy.dto.PolicyWithAuthPolicyDto; import io.mosip.pms.policy.dto.RequestWrapper; import io.mosip.pms.policy.dto.ResponseWrapper; +import io.mosip.pms.policy.dto.PolicyGroupDto; +import io.mosip.pms.policy.dto.PolicySummaryDto; +import io.mosip.pms.policy.dto.PolicyFilterDto; +import io.mosip.pms.policy.dto.DeactivatePolicyResponseDto; +import io.mosip.pms.policy.dto.DeactivatePolicyGroupResponseDto; +import io.mosip.pms.policy.dto.DeactivateRequestDto; import io.mosip.pms.policy.service.PolicyManagementService; import io.mosip.pms.policy.util.AuditUtil; import io.swagger.annotations.Api; @@ -61,16 +80,20 @@ public class PolicyManagementController { private static final Logger logger = PMSLogger.getLogger(PolicyManagementController.class); + @Value("${mosip.pms.api.id.deactivate.policy.patch}") + private String patchDeactivatePolicy; + + @Value("${mosip.pms.api.id.deactivate.policy.group.patch}") + private String patchDeactivatePolicyGroupId; + @Autowired private PolicyManagementService policyManagementService; @Autowired AuditUtil auditUtil; - @Value("${mosip.pms.api.id.all.policy.groups.get}") - private String getAllPolicyGroupsId; - - public static final String VERSION = "1.0"; + @Autowired + RequestValidator requestValidator; @PreAuthorize("hasAnyRole(@authorizedRoles.getPostpoliciesgroupnew())") @PostMapping(value = "/group/new") @@ -100,7 +123,6 @@ public ResponseWrapper updatePolicyGroup(@PathVari response.setId(createRequest.getId()); response.setVersion(createRequest.getVersion()); return response; - } @PreAuthorize("hasAnyRole(@authorizedRoles.getPostpolicies())") @@ -293,16 +315,98 @@ public ResponseWrapper> getPoliciesByGroupName(@PathVaria return response; } - @PreAuthorize("hasAnyRole(@authorizedRoles.getGetallpolicygroups())") - @GetMapping(value = "/getAllPolicyGroups") - @Operation(summary = "Service to get all policy groups", description = "Service to get all policy groups") - public ResponseWrapper> getAllPolicyGroups() throws JsonParseException, JsonMappingException, IOException { - ResponseWrapper> response = new ResponseWrapper<>(); - response.setId(getAllPolicyGroupsId); - response.setVersion(VERSION); - logger.info("Calling PolicyManagementService from PolicyManagementController."); - response.setResponse(policyManagementService.getAllPolicyGroups()); - logger.info("Returning response from PolicyManagementController."); - return response; + @PreAuthorize("hasAnyRole(@authorizedRoles.getGetpolicygroups())") + @GetMapping(value = "/policy-groups") + @Operation(summary = "This endpoint retrieves details about all active Policy Groups", + description = "Available since release-1.3.x.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true)))}) + public ResponseWrapperV2> getPolicyGroups() throws JsonParseException, JsonMappingException, IOException { + return policyManagementService.getPolicyGroups(); + } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getGetallpolicies())") + @GetMapping(value = "/v2") + @Operation(summary = "This endpoint retrieves the list of all Policies", + description = "Available since release-1.3.x. It is configured for both the POLICYMANAGER and PARTNER_ADMIN roles.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + public ResponseWrapperV2> getAllPolicies( + @RequestParam(value = "sortFieldName", required = false) String sortFieldName, + @RequestParam(value = "sortType", required = false) String sortType, // e.g., ASC or DESC + @RequestParam(value = "pageNo", defaultValue = "0") int pageNo, + @RequestParam(value = "pageSize", defaultValue = "8") int pageSize, + @RequestParam(value = "policyType", required = false) String policyType, + @RequestParam(value = "policyId", required = false) String policyId, + @RequestParam(value = "policyName", required = false) String policyName, + @RequestParam(value = "policyDescription", required = false) String policyDescription, + @RequestParam(value = "policyGroupName", required = false) String policyGroupName, + @Parameter( + description = "Status of policy", + in = ParameterIn.QUERY, + schema = @Schema(allowableValues = {"activated", "deactivated", "draft"}) + ) + @RequestParam(value = "status", required = false) String status) { + + PolicyUtil.validateGetAllPoliciesRequestParameters(sortFieldName, sortType, pageNo, pageSize); + PolicyFilterDto filterDto = new PolicyFilterDto(); + if (policyType != null) { + filterDto.setPolicyType(policyType.toLowerCase()); + } + if (policyId != null) { + filterDto.setPolicyId(policyId.toLowerCase()); + } + if (policyName != null) { + filterDto.setPolicyName(policyName.toLowerCase()); + } + if (policyDescription != null) { + filterDto.setPolicyDescription(policyDescription.toLowerCase()); + } + if (policyGroupName != null) { + filterDto.setPolicyGroupName(policyGroupName.toLowerCase()); + } + if (status != null) { + filterDto.setStatus(status); + } + return policyManagementService.getAllPolicies(sortFieldName, sortType, pageNo, pageSize, filterDto); + } + + @PreAuthorize("hasRole(@authorizedRoles.getPartneradmin()) and hasRole(@authorizedRoles.getPolicymanager())") + @PatchMapping(value = "/{policyId}") + @Operation(summary = "Available since release-1.3.x. This endpoint deactivates a policy based on the Policy Id", description = "This endpoint deactivates a policy based on the Policy Id, accessible only by Partner Admin. It checks if any policy requests are associated with the policy: it can be deactivated if there are no requests or if there are rejected requests. It cannot be deactivated if there are approved or pending requests, returning error codes PMS_POL_063 or PMS_POL_064, respectively. This endpoint is configured for both POLICYMANAGER and PARTNER_ADMIN roles.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + public ResponseWrapperV2 deactivatePolicy(@PathVariable("policyId") @NotBlank String policyId, @RequestBody @Valid RequestWrapperV2 + requestWrapper) { + Optional> validationResponse = requestValidator.validate(patchDeactivatePolicy, requestWrapper); + if (validationResponse.isPresent()) { + return validationResponse.get(); + } + return policyManagementService.deactivatePolicy(policyId, requestWrapper.getRequest()); + } + + @PreAuthorize("hasAnyRole(@authorizedRoles.getPatchdeactivatepolicygroup())") + @PatchMapping(value = "/group/{policyGroupId}") + @Operation(summary = "This endpoint allows Partner Admin users to deactivate a Policy Group based on the Policy Group Id.", + description = "Available since release-1.3.x. It is configured for the POLICYMANAGER and PARTNER_ADMIN roles.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) + }) + public ResponseWrapperV2 deactivatePolicyGroup(@PathVariable("policyGroupId") @NotBlank String policyGroupId, @RequestBody @Valid RequestWrapperV2 + requestWrapper) { + Optional> validationResponse = requestValidator.validate(patchDeactivatePolicyGroupId, requestWrapper); + if (validationResponse.isPresent()) { + return validationResponse.get(); + } + return policyManagementService.deactivatePolicyGroup(policyGroupId, requestWrapper.getRequest()); } } diff --git a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/AuthorizedRolesDto.java b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/AuthorizedRolesDto.java index 7e6788702b..122104b5b8 100644 --- a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/AuthorizedRolesDto.java +++ b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/AuthorizedRolesDto.java @@ -51,5 +51,13 @@ public class AuthorizedRolesDto { private List getactivegroupgroupname; - private List getallpolicygroups; + private List getpolicygroups; + + private List getallpolicies; + + private List partneradmin; + + private List policymanager; + + private List patchdeactivatepolicygroup; } diff --git a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/DeactivatePolicyGroupResponseDto.java b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/DeactivatePolicyGroupResponseDto.java new file mode 100644 index 0000000000..35336db1fb --- /dev/null +++ b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/DeactivatePolicyGroupResponseDto.java @@ -0,0 +1,14 @@ +package io.mosip.pms.policy.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class DeactivatePolicyGroupResponseDto { + + @Schema(description = "Unique identifier for the policy group", example = "12345") + private String policyGroupId; + + @Schema(description = "Indicates whether the policy group is active (true if active, false otherwise)", example = "true") + private Boolean isActive; +} diff --git a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/DeactivatePolicyResponseDto.java b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/DeactivatePolicyResponseDto.java new file mode 100644 index 0000000000..cee92158b6 --- /dev/null +++ b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/DeactivatePolicyResponseDto.java @@ -0,0 +1,14 @@ +package io.mosip.pms.policy.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class DeactivatePolicyResponseDto { + + @Schema(description = "Unique identifier for the policy", example = "12345") + private String policyId; + + @Schema(description = "Indicates whether the policy is active (true if active, false otherwise)", example = "true") + private Boolean isActive; +} diff --git a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/DeactivateRequestDto.java b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/DeactivateRequestDto.java new file mode 100644 index 0000000000..d6068e2190 --- /dev/null +++ b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/DeactivateRequestDto.java @@ -0,0 +1,11 @@ +package io.mosip.pms.policy.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class DeactivateRequestDto { + + @Schema(description = "Status for deactivate policy", example = "De-Activate") + private String status; +} diff --git a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyCreateRequestDto.java b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyCreateRequestDto.java index feb6d3d0e4..bc2439de8f 100644 --- a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyCreateRequestDto.java +++ b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyCreateRequestDto.java @@ -39,7 +39,7 @@ public class PolicyCreateRequestDto { public String name; @NotBlank(message="value is empty or null") - @Size(min = 1, max = 128, message = "Length should be in between 1 and 128 chars") + @Size(min = 1, max = 256, message = "Length should be in between 1 and 256 chars") public String desc; @NotBlank(message="value is empty or null") diff --git a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyFilterDto.java b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyFilterDto.java new file mode 100644 index 0000000000..4d5b4fd92b --- /dev/null +++ b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyFilterDto.java @@ -0,0 +1,20 @@ +package io.mosip.pms.policy.dto; + +import lombok.Data; +import java.util.Date; + +@Data +public class PolicyFilterDto { + + private String policyId; + + private String policyType; + + private String policyName; + + private String policyDescription; + + private String policyGroupName; + + private String status; +} diff --git a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyGroupCreateRequestDto.java b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyGroupCreateRequestDto.java index 12bbcf4b49..b16c3e2383 100644 --- a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyGroupCreateRequestDto.java +++ b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyGroupCreateRequestDto.java @@ -24,6 +24,6 @@ public class PolicyGroupCreateRequestDto { public String name; @NotBlank(message="value is empty or null") - @Size(min = 1, max = 128, message = "Length should be in between 1 and 128 chars") + @Size(min = 1, max = 256, message = "Length should be in between 1 and 256 chars") public String desc; } diff --git a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyGroupDto.java b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyGroupDto.java new file mode 100644 index 0000000000..ee27446399 --- /dev/null +++ b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyGroupDto.java @@ -0,0 +1,10 @@ +package io.mosip.pms.policy.dto; + +import lombok.Data; + +@Data +public class PolicyGroupDto { + private String id; + private String description; + private String name; +} \ No newline at end of file diff --git a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyGroupUpdateRequestDto.java b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyGroupUpdateRequestDto.java index 4a56d981df..286d683f28 100644 --- a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyGroupUpdateRequestDto.java +++ b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyGroupUpdateRequestDto.java @@ -16,7 +16,7 @@ public class PolicyGroupUpdateRequestDto { private String name; @NotBlank(message="value is empty or null") - @Size(min = 1, max = 128, message = "Length should be between 1 and 128 chars") + @Size(min = 1, max = 256, message = "Length should be between 1 and 256 chars") private String desc; private Boolean isActive; diff --git a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicySummaryDto.java b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicySummaryDto.java new file mode 100644 index 0000000000..20b08273a5 --- /dev/null +++ b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicySummaryDto.java @@ -0,0 +1,31 @@ +package io.mosip.pms.policy.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +public class PolicySummaryDto { + + @Schema(description = "Unique identifier for the policy", example = "12345") + private String policyId; + + @Schema(description = "Name of the policy", example = "abc") + private String policyName; + + @Schema(description = "Description of the policy", example = "desc") + private String policyDescription; + + @Schema(description = "Unique identifier for the policy group", example = "23456") + private String policyGroupId; + + @Schema(description = "Name of the policy group", example = "abc") + private String policyGroupName; + + @Schema(description = "Indicates status of the policy (activated, deactivated, draft)", example = "draft") + private String status; + + @Schema(description = "Date and time when the record was created", example = "2024-08-01T14:30:00Z") + private Date createdDateTime; +} diff --git a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyUpdateRequestDto.java b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyUpdateRequestDto.java index 9b1b8745b1..c004edac9a 100644 --- a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyUpdateRequestDto.java +++ b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/dto/PolicyUpdateRequestDto.java @@ -31,7 +31,7 @@ public class PolicyUpdateRequestDto { private String name; @NotBlank(message="value is empty or null") - @Size(min = 1, max = 128, message = "Length should be in between 1 and 128 chars") + @Size(min = 1, max = 256, message = "Length should be in between 1 and 256 chars") private String desc; private JSONObject policies; diff --git a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/errorMessages/ErrorMessages.java b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/errorMessages/ErrorMessages.java index 6936ca3223..6d9c70de54 100644 --- a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/errorMessages/ErrorMessages.java +++ b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/errorMessages/ErrorMessages.java @@ -45,8 +45,25 @@ public enum ErrorMessages { ACTIVE_POLICY_EXISTS_UNDER_POLICY_GROUP("PMS_POL_056","Active policies exists under the policy group."), ACTIVE_APIKEY_EXISTS_UNDER_POLICY("PMS_POL_057","Active apiKey exists under the policy."), PUBLISHED_POLICY_STATUS_UPDATE("PMS_POL_058","Status cannot be changed for published policy."), - POLICY_GROUPS_NOT_AVAILABLE("PMS_POL_059", "There are no active policy groups."); - + POLICY_GROUPS_NOT_AVAILABLE("PMS_POL_059", "There are no active policy groups."), + POLICY_GROUPS_FETCH_ERROR("PMS_POL_060", "Error while fetching policy groups."), + INVALID_SORT_TYPE("PMS_PRT_358", "Sort type %s is not supported"), + INVALID_SORT_FIELD("PMS_PRT_357", "Invalid sort field %s"), + INVALID_PAGE_NO("PMS_PRT_360", "Invalid Page No"), + INVALID_PAGE_SIZE("PMS_PRT_361", "Invalid page size"), + POLICIES_FETCH_ERROR("PMS_POL_061", "Error while fetching policies"), + POLICY_ALREADY_DEACTIVATED("PMS_POL_062", "The policy has already been deactivated."), + POLICY_HAS_APPROVED_PARTNER_POLICY_REQUEST_ERROR("PMS_POL_063", "An approved partner policy request is associated with this policy."), + POLICY_HAS_PENDING_PARTNER_POLICY_REQUEST_ERROR("PMS_POL_064", "A pending partner policy request is associated with this policy."), + POLICY_DOES_NOT_EXIST("PMS_POL_065", "The specified policy does not exist."), + POLICY_DEACTIVATION_ERROR("PMS_POL_066", "Error while deactivating policy"), + POLICY_GROUP_ALREADY_DEACTIVATED("PMS_POL_067", "The policy group has already been deactivated"), + POLICY_GROUP_DOES_NOT_EXIST("PMS_POL_068", "The specified policy group does not exist"), + ACTIVE_AND_DRAFT_POLICIES_EXISTS_UNDER_POLICY_GROUP( "PMS_POL_069", "Active or draft policies are associated with the policy group"), + DRAFT_POLICIES_EXISTS_UNDER_POLICY_GROUP("PMS_POL_070","Draft policies exists under the policy group."), + POLICY_GROUP_DEACTIVATION_ERROR("PMS_POL_071", "Error while deactivating policy group"), + POLICY_NOT_APPROVED("PMS_POL_072", "The selected policy is not in activated status"), + DEACTIVATE_STATUS_CODE("PMS_POL_073", "Request status should be De-Activate"); private final String errorCode; private final String errorMessage; diff --git a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/service/PolicyManagementService.java b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/service/PolicyManagementService.java index 2e0c7787a0..c92f1f562d 100644 --- a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/service/PolicyManagementService.java +++ b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/service/PolicyManagementService.java @@ -16,6 +16,8 @@ import java.util.Optional; import java.util.stream.Collectors; +import io.mosip.pms.common.constant.CommonConstant; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; import org.apache.commons.io.IOUtils; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; @@ -24,6 +26,9 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @@ -40,6 +45,7 @@ import io.mosip.pms.common.dto.FilterDto; import io.mosip.pms.common.dto.FilterValueDto; import io.mosip.pms.common.dto.PageResponseDto; +import io.mosip.pms.common.dto.PolicyCountDto; import io.mosip.pms.common.dto.PolicyFilterValueDto; import io.mosip.pms.common.dto.PolicyPublishDto; import io.mosip.pms.common.dto.PolicySearchDto; @@ -47,10 +53,13 @@ import io.mosip.pms.common.dto.SearchDto; import io.mosip.pms.common.dto.SearchFilter; import io.mosip.pms.common.dto.Type; +import io.mosip.pms.common.dto.PageResponseV2Dto; import io.mosip.pms.common.entity.AuthPolicy; +import io.mosip.pms.common.entity.PartnerPolicyRequest; import io.mosip.pms.common.entity.AuthPolicyH; import io.mosip.pms.common.entity.PartnerPolicy; import io.mosip.pms.common.entity.PolicyGroup; +import io.mosip.pms.common.entity.PolicySummaryEntity; import io.mosip.pms.common.helper.FilterHelper; import io.mosip.pms.common.helper.SearchHelper; import io.mosip.pms.common.helper.WebSubPublisher; @@ -58,6 +67,8 @@ import io.mosip.pms.common.repository.AuthPolicyRepository; import io.mosip.pms.common.repository.PartnerPolicyRepository; import io.mosip.pms.common.repository.PolicyGroupRepository; +import io.mosip.pms.common.repository.PolicySummaryRepository; +import io.mosip.pms.common.repository.PartnerPolicyRequestRepository; import io.mosip.pms.common.util.MapperUtils; import io.mosip.pms.common.util.PMSLogger; import io.mosip.pms.common.util.PageUtils; @@ -80,6 +91,12 @@ import io.mosip.pms.policy.dto.PolicyUpdateRequestDto; import io.mosip.pms.policy.dto.PolicyWithAuthPolicyDto; import io.mosip.pms.policy.dto.ResponseWrapper; +import io.mosip.pms.policy.dto.PolicyGroupDto; +import io.mosip.pms.policy.dto.PolicySummaryDto; +import io.mosip.pms.policy.dto.PolicyFilterDto; +import io.mosip.pms.policy.dto.DeactivatePolicyResponseDto; +import io.mosip.pms.policy.dto.DeactivatePolicyGroupResponseDto; +import io.mosip.pms.policy.dto.DeactivateRequestDto; import io.mosip.pms.policy.errorMessages.ErrorMessages; import io.mosip.pms.policy.errorMessages.PolicyManagementServiceException; import io.mosip.pms.policy.util.AuditUtil; @@ -110,6 +127,8 @@ public class PolicyManagementService { private static final Logger logger = PMSLogger.getLogger(PolicyManagementService.class); + private static final String DEACTIVATE = "De-Activate"; + @Autowired private AuthPolicyRepository authPolicyRepository; @@ -119,6 +138,9 @@ public class PolicyManagementService { @Autowired private AuthPolicyHRepository authPolicyHRepository; + @Autowired + private PolicySummaryRepository policySummaryRepository; + @Autowired PolicyValidator policyValidator; @@ -127,6 +149,9 @@ public class PolicyManagementService { @Autowired PartnerPolicyRepository partnerPolicyRepository; + + @Autowired + PartnerPolicyRequestRepository partnerPolicyRequestRepository; @Value("${pmp.policy.schema.url}") private String policySchemaUrl; @@ -134,6 +159,18 @@ public class PolicyManagementService { @Value("${pmp.allowed.policy.types}") private String supportedPolicyTypes; + @Value("${mosip.pms.api.id.policy.groups.get}") + private String getPolicyGroupsId; + + @Value("${mosip.pms.api.id.policies.get}") + private String getPoliciesId; + + @Value("${mosip.pms.api.id.deactivate.policy.patch}") + private String patchDeactivatePolicyId; + + @Value("${mosip.pms.api.id.deactivate.policy.group.patch}") + private String patchDeactivatePolicyGroupId; + @Autowired SearchHelper searchHelper; @@ -151,7 +188,10 @@ public class PolicyManagementService { public static final String ACTIVE_STATUS = "active"; public static final String NOTACTIVE_STATUS = "de-active"; - public static final String ALL = "all"; + public static final String ALL = "all"; + public static final String VERSION = "1.0"; + public static final String APPROVED = "approved"; + public static final String IN_PROGRESS = "InProgress"; /** The mapper. */ @Autowired @@ -1050,13 +1090,238 @@ public List getActivePolicyDetailsByGroupName(String policyGro } - public List getAllPolicyGroups() { - List policyGroupsList = policyGroupRepository.findAllActivePolicyGroups(); - if (policyGroupsList.isEmpty()) { - logger.error("There are no active policy groups"); - throw new PolicyManagementServiceException(ErrorMessages.POLICY_GROUPS_NOT_AVAILABLE.getErrorCode(), - ErrorMessages.POLICY_GROUPS_NOT_AVAILABLE.getErrorMessage()); + public ResponseWrapperV2> getPolicyGroups() { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + try { + List policyGroupsList; + policyGroupsList = policyGroupRepository.findAllActivePolicyGroups(); + if (policyGroupsList.isEmpty()) { + logger.error("There are no active policy groups"); + throw new PolicyManagementServiceException(ErrorMessages.POLICY_GROUPS_NOT_AVAILABLE.getErrorCode(), + ErrorMessages.POLICY_GROUPS_NOT_AVAILABLE.getErrorMessage()); + } + List policyGroupDtoList = new ArrayList<>(); + for (PolicyGroup policyGroup : policyGroupsList) { + PolicyGroupDto policyGroupDto = new PolicyGroupDto(); + policyGroupDto.setId(policyGroup.getId()); + policyGroupDto.setDescription(policyGroup.getDesc()); + policyGroupDto.setName(policyGroup.getName()); + + policyGroupDtoList.add(policyGroupDto); + } + responseWrapper.setResponse(policyGroupDtoList); + } catch (PolicyManagementServiceException ex) { + logger.info("sessionId", "idType", "id", "In getPolicyGroups method of PolicyManagementService - " + ex.getMessage()); + responseWrapper.setErrors(PolicyUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + logger.debug("sessionId", "idType", "id", ex.getStackTrace()); + logger.error("sessionId", "idType", "id", + "In getPolicyGroups method of PolicyManagementService - " + ex.getMessage()); + String errorCode = ErrorMessages.POLICY_GROUPS_FETCH_ERROR.getErrorCode(); + String errorMessage = ErrorMessages.POLICY_GROUPS_FETCH_ERROR.getErrorMessage(); + responseWrapper.setErrors(PolicyUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getPolicyGroupsId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + public ResponseWrapperV2> getAllPolicies(String sortFieldName, String sortType, int pageNo, int pageSize, PolicyFilterDto filterDto) { + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + try { + PageResponseV2Dto pageResponseV2Dto = new PageResponseV2Dto<>(); + // Pagination + Pageable pageable = PageRequest.of(pageNo, pageSize); + + Page page = getAllPolicies(sortFieldName, sortType, pageNo, pageSize, filterDto, pageable); + if (Objects.nonNull(page) && !page.getContent().isEmpty()) { + List policySummaryDtoList = MapperUtils.mapAll(page.getContent(), PolicySummaryDto.class); + pageResponseV2Dto.setPageNo(pageNo); + pageResponseV2Dto.setPageSize(pageSize); + pageResponseV2Dto.setTotalResults(page.getTotalElements()); + pageResponseV2Dto.setData(policySummaryDtoList); + } + responseWrapper.setResponse(pageResponseV2Dto); + } catch (PolicyManagementServiceException ex) { + logger.info("sessionId", "idType", "id", "In getAllPolicies method of PolicyManagementService - " + ex.getMessage()); + responseWrapper.setErrors(PolicyUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + logger.debug("sessionId", "idType", "id", ex.getStackTrace()); + logger.error("sessionId", "idType", "id", + "In getAllPolicies method of PolicyManagementService - " + ex.getMessage()); + String errorCode = ErrorMessages.POLICIES_FETCH_ERROR.getErrorCode(); + String errorMessage = ErrorMessages.POLICIES_FETCH_ERROR.getErrorMessage(); + responseWrapper.setErrors(PolicyUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(getPoliciesId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + private Page getAllPolicies(String sortFieldName, String sortType, int pageNo, int pageSize, PolicyFilterDto filterDto, Pageable pageable) { + //Sorting + if (Objects.nonNull(sortFieldName) && Objects.nonNull(sortType)) { + //sorting handling for the 'status' field + if (sortFieldName.equalsIgnoreCase("status") && sortType.equalsIgnoreCase(CommonConstant.ASC)) { + return policySummaryRepository. + getSummaryOfAllPoliciesByStatusAsc(filterDto.getPolicyId(), filterDto.getPolicyType(), filterDto.getPolicyName(), + filterDto.getPolicyDescription(), filterDto.getPolicyGroupName(), filterDto.getStatus(), pageable); + } else if (sortFieldName.equalsIgnoreCase("status") && sortType.equalsIgnoreCase(CommonConstant.DESC)) { + return policySummaryRepository. + getSummaryOfAllPoliciesByStatusDesc(filterDto.getPolicyId(), filterDto.getPolicyType(), filterDto.getPolicyName(), + filterDto.getPolicyDescription(), filterDto.getPolicyGroupName(), filterDto.getStatus(), pageable); + } + //Sorting for other fields + Sort sort = PolicyUtil.getSortingRequest(getSortColumn(sortFieldName), sortType); + pageable = PageRequest.of(pageNo, pageSize, sort); + } + return policySummaryRepository. + getSummaryOfAllPolicies(filterDto.getPolicyId(), filterDto.getPolicyType(), filterDto.getPolicyName(), + filterDto.getPolicyDescription(), filterDto.getPolicyGroupName(), filterDto.getStatus(), pageable); + } + + public String getSortColumn(String alias) { + return PolicyUtil.aliasToColumnMap.getOrDefault(alias, alias); // Return alias if no match found + } + + public ResponseWrapperV2 deactivatePolicy(String policyId, DeactivateRequestDto requestDto) { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + try { + if (Objects.isNull(policyId) || policyId.isBlank()){ + logger.error("The policy id is null or empty"); + throw new PolicyManagementServiceException(ErrorMessages.INVALID_INPUT_PARAMETER.getErrorCode(), + ErrorMessages.INVALID_INPUT_PARAMETER.getErrorMessage()); + } + String status = requestDto.getStatus(); + if (Objects.isNull(status) || status.isBlank() || !status.equals(DEACTIVATE)) { + logger.info(status + " : is Invalid Input Parameter, it should be (De-Activate)"); + throw new PolicyManagementServiceException(ErrorMessages.DEACTIVATE_STATUS_CODE.getErrorCode(), + ErrorMessages.DEACTIVATE_STATUS_CODE.getErrorMessage()); + } + Optional policy = authPolicyRepository.findById(policyId); + if (policy.isEmpty()){ + logger.error("The policy does not exits for policy Id:", policyId); + throw new PolicyManagementServiceException(ErrorMessages.POLICY_DOES_NOT_EXIST.getErrorCode(), + ErrorMessages.POLICY_DOES_NOT_EXIST.getErrorMessage()); + } + if (!policy.get().getIsActive()){ + if (policy.get().getPolicySchema() == null) { + logger.error("The selected policy is not in an activated status:", policyId); + throw new PolicyManagementServiceException(ErrorMessages.POLICY_NOT_APPROVED.getErrorCode(), + ErrorMessages.POLICY_NOT_APPROVED.getErrorMessage()); + } else { + logger.error("The policy is already deactivated for policy Id:", policyId); + throw new PolicyManagementServiceException(ErrorMessages.POLICY_ALREADY_DEACTIVATED.getErrorCode(), + ErrorMessages.POLICY_ALREADY_DEACTIVATED.getErrorMessage()); + } + } + List approvedPartnerPolicyRequest = partnerPolicyRequestRepository.findByPolicyIdAndStatusCode(policyId, APPROVED); + if (!approvedPartnerPolicyRequest.isEmpty()){ + logger.error("An approved partner policy request is associated with the policy having ID:", policyId); + throw new PolicyManagementServiceException(ErrorMessages.POLICY_HAS_APPROVED_PARTNER_POLICY_REQUEST_ERROR.getErrorCode(), + ErrorMessages.POLICY_HAS_APPROVED_PARTNER_POLICY_REQUEST_ERROR.getErrorMessage()); + } + List pendingPartnerPolicyRequest = partnerPolicyRequestRepository.findByPolicyIdAndStatusCode(policyId, IN_PROGRESS); + if (!pendingPartnerPolicyRequest.isEmpty()){ + logger.error("A pending partner policy request is associated with the policy having ID:", policyId); + throw new PolicyManagementServiceException(ErrorMessages.POLICY_HAS_PENDING_PARTNER_POLICY_REQUEST_ERROR.getErrorCode(), + ErrorMessages.POLICY_HAS_PENDING_PARTNER_POLICY_REQUEST_ERROR.getErrorMessage()); + } + //deactivate policy + AuthPolicy authPolicy = policy.get(); + authPolicy.setIsActive(false); + authPolicy.setUpdDtimes(LocalDateTime.now()); + authPolicy.setUpdBy(getUser()); + AuthPolicy updatedAuthPolicy = authPolicyRepository.save(authPolicy); + logger.error("policy has been deactivated successfully having Id:", policyId); + + DeactivatePolicyResponseDto deactivatePolicyResponseDto = new DeactivatePolicyResponseDto(); + deactivatePolicyResponseDto.setPolicyId(updatedAuthPolicy.getId()); + deactivatePolicyResponseDto.setIsActive(updatedAuthPolicy.getIsActive()); + responseWrapper.setResponse(deactivatePolicyResponseDto); + } catch (PolicyManagementServiceException ex) { + logger.info("sessionId", "idType", "id", "In deactivatePolicy method of PolicyManagementService - " + ex.getMessage()); + responseWrapper.setErrors(PolicyUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + logger.debug("sessionId", "idType", "id", ex.getStackTrace()); + logger.error("sessionId", "idType", "id", + "In deactivatePolicy method of PolicyManagementService - " + ex.getMessage()); + String errorCode = ErrorMessages.POLICY_DEACTIVATION_ERROR.getErrorCode(); + String errorMessage = ErrorMessages.POLICY_DEACTIVATION_ERROR.getErrorMessage(); + responseWrapper.setErrors(PolicyUtil.setErrorResponse(errorCode, errorMessage)); + } + responseWrapper.setId(patchDeactivatePolicyId); + responseWrapper.setVersion(VERSION); + return responseWrapper; + } + + public ResponseWrapperV2 deactivatePolicyGroup(String policyGroupId, DeactivateRequestDto requestDto) { + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + try { + if (Objects.isNull(policyGroupId) || policyGroupId.isBlank()){ + logger.error("The policy group id is null or empty"); + throw new PolicyManagementServiceException(ErrorMessages.INVALID_INPUT_PARAMETER.getErrorCode(), + ErrorMessages.INVALID_INPUT_PARAMETER.getErrorMessage()); + } + String status = requestDto.getStatus(); + if (Objects.isNull(status) || status.isBlank() || !status.equals(DEACTIVATE)) { + logger.info(status + " : is Invalid Input Parameter, it should be (De-Activate)"); + throw new PolicyManagementServiceException(ErrorMessages.DEACTIVATE_STATUS_CODE.getErrorCode(), + ErrorMessages.DEACTIVATE_STATUS_CODE.getErrorMessage()); + } + Optional policyGroupFromDb = policyGroupRepository.findById(policyGroupId); + if (policyGroupFromDb.isEmpty()){ + logger.error("The policy group does not exits for policy group Id:", policyGroupId); + throw new PolicyManagementServiceException(ErrorMessages.POLICY_GROUP_DOES_NOT_EXIST.getErrorCode(), + ErrorMessages.POLICY_GROUP_DOES_NOT_EXIST.getErrorMessage()); + } + if (!policyGroupFromDb.get().getIsActive()){ + logger.error("The policy group is already deactivated for policy group Id:", policyGroupId); + throw new PolicyManagementServiceException(ErrorMessages.POLICY_GROUP_ALREADY_DEACTIVATED.getErrorCode(), + ErrorMessages.POLICY_GROUP_ALREADY_DEACTIVATED.getErrorMessage()); + } + PolicyCountDto policyCountDto = authPolicyRepository.findPolicyCountsByPolicyGroupId(policyGroupId); + + if (policyCountDto.getActivePoliciesCount() > 0 && policyCountDto.getDraftPoliciesCount() > 0) { + logger.error("Active and draft policies are associated with the policy group. PolicyGroupId: {}", policyGroupId); + throw new PolicyManagementServiceException( + ErrorMessages.ACTIVE_AND_DRAFT_POLICIES_EXISTS_UNDER_POLICY_GROUP.getErrorCode(), + ErrorMessages.ACTIVE_AND_DRAFT_POLICIES_EXISTS_UNDER_POLICY_GROUP.getErrorMessage() + ); + } else if (policyCountDto.getActivePoliciesCount() > 0) { + logger.error("Active policies are associated with the policy group having ID:", policyGroupId); + throw new PolicyManagementServiceException(ErrorMessages.ACTIVE_POLICY_EXISTS_UNDER_POLICY_GROUP.getErrorCode(), + ErrorMessages.ACTIVE_POLICY_EXISTS_UNDER_POLICY_GROUP.getErrorMessage()); + } else if (policyCountDto.getDraftPoliciesCount() > 0) { + logger.error("Draft policies are associated with the policy group having ID:", policyGroupId); + throw new PolicyManagementServiceException(ErrorMessages.DRAFT_POLICIES_EXISTS_UNDER_POLICY_GROUP.getErrorCode(), + ErrorMessages.DRAFT_POLICIES_EXISTS_UNDER_POLICY_GROUP.getErrorMessage()); + } + //deactivate policy group + PolicyGroup policyGroup = policyGroupFromDb.get(); + policyGroup.setIsActive(false); + policyGroup.setUpdDtimes(LocalDateTime.now()); + policyGroup.setUpdBy(getUser()); + PolicyGroup deactivatedPolicyGroup = policyGroupRepository.save(policyGroup); + logger.error("policy group has been deactivated successfully having Id:", policyGroupId); + + DeactivatePolicyGroupResponseDto deactivatePolicyGroupResponseDto = new DeactivatePolicyGroupResponseDto(); + deactivatePolicyGroupResponseDto.setPolicyGroupId(deactivatedPolicyGroup.getId()); + deactivatePolicyGroupResponseDto.setIsActive(deactivatedPolicyGroup.getIsActive()); + responseWrapper.setResponse(deactivatePolicyGroupResponseDto); + } catch (PolicyManagementServiceException ex) { + logger.info("sessionId", "idType", "id", "In deactivatePolicyGroup method of PolicyManagementService - " + ex.getMessage()); + responseWrapper.setErrors(PolicyUtil.setErrorResponse(ex.getErrorCode(), ex.getErrorText())); + } catch (Exception ex) { + logger.debug("sessionId", "idType", "id", ex.getStackTrace()); + logger.error("sessionId", "idType", "id", + "In deactivatePolicyGroup method of PolicyManagementService - " + ex.getMessage()); + String errorCode = ErrorMessages.POLICY_GROUP_DEACTIVATION_ERROR.getErrorCode(); + String errorMessage = ErrorMessages.POLICY_GROUP_DEACTIVATION_ERROR.getErrorMessage(); + responseWrapper.setErrors(PolicyUtil.setErrorResponse(errorCode, errorMessage)); } - return policyGroupsList; + responseWrapper.setId(patchDeactivatePolicyGroupId); + responseWrapper.setVersion(VERSION); + return responseWrapper; } } diff --git a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/util/PolicyUtil.java b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/util/PolicyUtil.java index d3114f6b1e..1412e93d11 100644 --- a/partner/policy-management-service/src/main/java/io/mosip/pms/policy/util/PolicyUtil.java +++ b/partner/policy-management-service/src/main/java/io/mosip/pms/policy/util/PolicyUtil.java @@ -1,6 +1,20 @@ package io.mosip.pms.policy.util; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.pms.common.constant.CommonConstant; +import io.mosip.pms.common.request.dto.ErrorResponse; +import io.mosip.pms.common.util.PMSLogger; +import io.mosip.pms.policy.errorMessages.ErrorMessages; +import io.mosip.pms.policy.errorMessages.PolicyManagementServiceException; +import io.mosip.pms.policy.errorMessages.ServiceError; +import org.springframework.data.domain.Sort; + +import java.security.Policy; import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * @@ -8,9 +22,73 @@ * */ public class PolicyUtil { + + private static final Logger LOGGER = PMSLogger.getLogger(PolicyUtil.class); + public static final Map aliasToColumnMap = new HashMap<>(); + static { + aliasToColumnMap.put("policyId", "id"); + aliasToColumnMap.put("policyName", "name"); + aliasToColumnMap.put("policyDescription", "descr"); + aliasToColumnMap.put("policyGroupId", "pg.id"); + aliasToColumnMap.put("policyGroupName", "pg.name"); + aliasToColumnMap.put("status", "isActive"); + aliasToColumnMap.put("createdDateTime", "crDtimes"); + } public static String generateId() { SecureRandom random = new SecureRandom(); return random.nextInt(100000) + ""; } + + public static List setErrorResponse(String errorCode, String errorMessage) { + List errorResponseList = new ArrayList<>(); + ErrorResponse errorResponse = new ErrorResponse(); + errorResponse.setErrorCode(errorCode); + errorResponse.setMessage(errorMessage); + errorResponseList.add(errorResponse); + return errorResponseList; + } + + public static Sort getSortingRequest (String fieldName, String sortType) { + Sort sortingRequest = null; + if (sortType.equalsIgnoreCase(CommonConstant.ASC)) { + sortingRequest = Sort.by(fieldName).ascending(); + } + if (sortType.equalsIgnoreCase(CommonConstant.DESC)) { + sortingRequest = Sort.by(fieldName).descending(); + } + return sortingRequest; + } + + public static void validateGetAllPoliciesRequestParameters(String sortFieldName, String sortType, int pageNo, int pageSize) { + // Validate sortFieldName + if (sortFieldName != null && !aliasToColumnMap.containsKey(sortFieldName)) { + LOGGER.error("Invalid sort field name: " + sortFieldName); + throw new PolicyManagementServiceException(ErrorMessages.INVALID_SORT_FIELD.getErrorCode(), + String.format(ErrorMessages.INVALID_SORT_FIELD.getErrorMessage(), sortFieldName)); + } + + // Validate sortType + if (sortType != null && + !sortType.equalsIgnoreCase(CommonConstant.ASC) && + !sortType.equalsIgnoreCase(CommonConstant.DESC)) { + LOGGER.error("Invalid sort type: " + sortType); + throw new PolicyManagementServiceException(ErrorMessages.INVALID_SORT_TYPE.getErrorCode(), + String.format(ErrorMessages.INVALID_SORT_TYPE.getErrorMessage(), sortType)); + } + + // Validate pageNo + if (pageNo < 0) { + LOGGER.error("Invalid page no: " + pageNo); + throw new PolicyManagementServiceException(ErrorMessages.INVALID_PAGE_NO.getErrorCode(), + ErrorMessages.INVALID_PAGE_NO.getErrorMessage()); + } + + // Validate pageSize + if (pageSize <= 0) { + LOGGER.error("Invalid page size: " + pageSize); + throw new PolicyManagementServiceException(ErrorMessages.INVALID_PAGE_SIZE.getErrorCode(), + ErrorMessages.INVALID_PAGE_SIZE.getErrorMessage()); + } + } } diff --git a/partner/policy-management-service/src/main/resources/application-dev.properties b/partner/policy-management-service/src/main/resources/application-dev.properties index c434a2874e..a92acd6d56 100644 --- a/partner/policy-management-service/src/main/resources/application-dev.properties +++ b/partner/policy-management-service/src/main/resources/application-dev.properties @@ -34,8 +34,8 @@ pmp.misp.policy.schema = ${mosip.kernel.xsdstorage-uri}misp-policy-schema.json policy.allowed.kyc.attributes = {"fullName": "Full Name","middleName": "Middle Name","lastName": "Last Name","dateOfBirth": "DateOfBirth","gender": "Gender","phone": "phone"} mosip.auth.adapter.impl.basepackage=io.mosip.kernel.auth.defaultadapter -websub.publish.url=${mosip.api.internal.url}/websub/publish -mosip.kernel.masterdata.audit-url=${mosip.api.internal.url}/v1/auditmanager/audits= +websub.publish.url=${mosip.api.internal.url}/hub/ +mosip.kernel.masterdata.audit-url=${mosip.api.internal.url}/v1/auditmanager/audits master.search.maximum.rows =100 diff --git a/partner/policy-management-service/src/main/resources/bootstrap.properties b/partner/policy-management-service/src/main/resources/bootstrap.properties index e0ea0bc1a9..752e8e3c76 100644 --- a/partner/policy-management-service/src/main/resources/bootstrap.properties +++ b/partner/policy-management-service/src/main/resources/bootstrap.properties @@ -7,7 +7,7 @@ # Application name - the name appended at starting of file name to differentiate # between different property files for different microservices spring.application.name=partner-management - + #Active Profile - will relate to development properties file in the server. #If this property is absent then default profile will be activated which is #the property file without any environment name at the end. @@ -16,12 +16,12 @@ spring.profiles.active=local # defining current branch in which we are working as label spring.cloud.config.label=master - + # url where spring cloud config server is running spring.cloud.config.uri=localhost - + #management.security.enabled=false #exposing refresh endpoint so that whenevr configuration changes in git, @@ -61,7 +61,14 @@ mosipbox.public.url=http://localhost:9107 openapi.policyManagementService.servers[0].url=${mosipbox.public.url}/v1/policymanager openapi.policyManagementService.servers[0].description= Policy Manager Service -##START properties are for PMS Revamp DP1 release -mosip.role.pms.getallpolicygroups=AUTH_PARTNER,CREDENTIAL_PARTNER,ONLINE_VERIFICATION_PARTNER,ABIS_PARTNER,MANUAL_ADJUDICATION,PARTNER_ADMIN,POLICYMANAGER -mosip.pms.api.id.all.policy.groups.get=mosip.pms.all.policy.groups.get -##END properties are for PMS Revamp DP1 release \ No newline at end of file +##START properties are for PMS Revamp release +mosip.role.pms.getpolicygroups=AUTH_PARTNER,CREDENTIAL_PARTNER,ONLINE_VERIFICATION_PARTNER,ABIS_PARTNER,MANUAL_ADJUDICATION,PARTNER_ADMIN,POLICYMANAGER +mosip.role.pms.getallpolicies=PARTNER_ADMIN,POLICYMANAGER +mosip.role.pms.partneradmin=PARTNER_ADMIN +mosip.role.pms.policymanager=POLICYMANAGER +mosip.role.pms.patchdeactivatepolicygroup=PARTNER_ADMIN,POLICYMANAGER +mosip.pms.api.id.policy.groups.get=mosip.pms.policy.groups.get +mosip.pms.api.id.policies.get=mosip.pms.policies.get +mosip.pms.api.id.deactivate.policy.patch=mosip.pms.deactivate.policy.patch +mosip.pms.api.id.deactivate.policy.group.patch=mosip.pms.deactivate.policy.group.patch +##END properties are for PMS Revamp release diff --git a/partner/policy-management-service/src/test/java/io/mosip/pms/policy/test/controller/PolicyManagementControllerTest.java b/partner/policy-management-service/src/test/java/io/mosip/pms/policy/test/controller/PolicyManagementControllerTest.java index 77113157e8..2d985da414 100644 --- a/partner/policy-management-service/src/test/java/io/mosip/pms/policy/test/controller/PolicyManagementControllerTest.java +++ b/partner/policy-management-service/src/test/java/io/mosip/pms/policy/test/controller/PolicyManagementControllerTest.java @@ -18,6 +18,9 @@ import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; +import io.mosip.pms.common.dto.*; +import io.mosip.pms.common.request.dto.RequestWrapperV2; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; import io.mosip.pms.policy.controller.PolicyManagementController; import io.mosip.pms.policy.dto.*; import io.mosip.pms.policy.errorMessages.ServiceError; @@ -43,16 +46,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import io.mosip.pms.common.dto.FilterDto; -import io.mosip.pms.common.dto.FilterValueDto; -import io.mosip.pms.common.dto.PageResponseDto; -import io.mosip.pms.common.dto.Pagination; -import io.mosip.pms.common.dto.PolicyFilterValueDto; -import io.mosip.pms.common.dto.PolicySearchDto; -import io.mosip.pms.common.dto.SearchAuthPolicy; -import io.mosip.pms.common.dto.SearchDto; -import io.mosip.pms.common.dto.SearchFilter; -import io.mosip.pms.common.dto.SearchSort; import io.mosip.pms.common.entity.PolicyGroup; import io.mosip.pms.common.validator.FilterColumnValidator; import io.mosip.pms.policy.errorMessages.PolicyManagementServiceException; @@ -810,4 +803,58 @@ public void testGetPoliciesByGroupName() { assertNotNull(response.getResponse()); assertEquals(mockedResponse, response.getResponse()); } + + @Test + public void getAllPoliciesTest() throws Exception { + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + int pageNo = 0; + int pageSize = 8; + PolicyFilterDto filterDto = new PolicyFilterDto(); + filterDto.setPolicyId("123"); + filterDto.setPolicyType("Auth"); + filterDto.setPolicyName("abc"); + filterDto.setPolicyDescription("desc"); + filterDto.setPolicyGroupName("default"); + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + + Mockito.when(policyManagementService.getAllPolicies(sortFieldName, sortType, pageNo, pageSize, filterDto)) + .thenReturn(responseWrapper); + ResponseWrapperV2> response = policyManagementController.getAllPolicies(sortFieldName, sortType, pageNo, pageSize,"Auth","123", "abc", "desc", "default", "activated"); + } + + @Test + public void deactivatePolicyTest() throws Exception { + RequestWrapperV2 requestWrapper = new RequestWrapperV2<>(); + DeactivateRequestDto requestDto = new DeactivateRequestDto(); + requestDto.setStatus("De-Activate"); + requestWrapper.setRequest(requestDto); + + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + DeactivatePolicyResponseDto deactivatePolicyResponseDto = new DeactivatePolicyResponseDto(); + responseWrapper.setResponse(deactivatePolicyResponseDto); + + Mockito.when(policyManagementService.deactivatePolicy(anyString(), any())) + .thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.patch("/policies/12345").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsString(requestWrapper))).andExpect(status().isOk()); + } + + @Test + public void deactivatePolicyGroupTest() throws Exception { + RequestWrapperV2 requestWrapper = new RequestWrapperV2<>(); + DeactivateRequestDto requestDto = new DeactivateRequestDto(); + requestDto.setStatus("De-Activate"); + requestWrapper.setRequest(requestDto); + + ResponseWrapperV2 responseWrapper = new ResponseWrapperV2<>(); + DeactivatePolicyGroupResponseDto deactivatePolicyGroupResponseDto = new DeactivatePolicyGroupResponseDto(); + responseWrapper.setResponse(deactivatePolicyGroupResponseDto); + + Mockito.when(policyManagementService.deactivatePolicyGroup(anyString(), any())).thenReturn(responseWrapper); + + mockMvc.perform(MockMvcRequestBuilders.patch("/policies/group/12345").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsString(requestWrapper))).andExpect(status().isOk()); + } + } diff --git a/partner/policy-management-service/src/test/java/io/mosip/pms/policy/test/service/PolicyServiceTest.java b/partner/policy-management-service/src/test/java/io/mosip/pms/policy/test/service/PolicyServiceTest.java index a2456cec2a..4a9ed6bb79 100644 --- a/partner/policy-management-service/src/test/java/io/mosip/pms/policy/test/service/PolicyServiceTest.java +++ b/partner/policy-management-service/src/test/java/io/mosip/pms/policy/test/service/PolicyServiceTest.java @@ -1,6 +1,10 @@ package io.mosip.pms.policy.test.service; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import java.io.FileNotFoundException; import java.io.IOException; @@ -12,6 +16,13 @@ import java.util.List; import java.util.Optional; +import io.mosip.kernel.openid.bridge.model.AuthUserDetails; +import io.mosip.kernel.openid.bridge.model.MosipUserDto; +import io.mosip.pms.common.dto.*; +import io.mosip.pms.common.entity.*; +import io.mosip.pms.common.repository.*; +import io.mosip.pms.common.response.dto.ResponseWrapperV2; +import io.mosip.pms.policy.dto.*; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; @@ -24,7 +35,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.util.ReflectionTestUtils; @@ -33,34 +46,11 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import io.mosip.pms.common.dto.FilterData; -import io.mosip.pms.common.dto.FilterDto; -import io.mosip.pms.common.dto.FilterValueDto; -import io.mosip.pms.common.dto.Pagination; -import io.mosip.pms.common.dto.PolicyFilterValueDto; -import io.mosip.pms.common.dto.PolicySearchDto; -import io.mosip.pms.common.dto.SearchDto; -import io.mosip.pms.common.dto.SearchFilter; -import io.mosip.pms.common.dto.SearchSort; -import io.mosip.pms.common.entity.AuthPolicy; -import io.mosip.pms.common.entity.Partner; -import io.mosip.pms.common.entity.PartnerPolicy; -import io.mosip.pms.common.entity.PolicyGroup; import io.mosip.pms.common.helper.FilterHelper; import io.mosip.pms.common.helper.SearchHelper; import io.mosip.pms.common.helper.WebSubPublisher; -import io.mosip.pms.common.repository.AuthPolicyHRepository; -import io.mosip.pms.common.repository.AuthPolicyRepository; -import io.mosip.pms.common.repository.PartnerPolicyRepository; -import io.mosip.pms.common.repository.PolicyGroupRepository; import io.mosip.pms.common.util.PageUtils; import io.mosip.pms.common.validator.FilterColumnValidator; -import io.mosip.pms.policy.dto.PolicyAttributesDto; -import io.mosip.pms.policy.dto.PolicyCreateRequestDto; -import io.mosip.pms.policy.dto.PolicyGroupCreateRequestDto; -import io.mosip.pms.policy.dto.PolicyGroupUpdateRequestDto; -import io.mosip.pms.policy.dto.PolicyStatusUpdateRequestDto; -import io.mosip.pms.policy.dto.PolicyUpdateRequestDto; import io.mosip.pms.policy.errorMessages.ErrorMessages; import io.mosip.pms.policy.errorMessages.PolicyManagementServiceException; import io.mosip.pms.policy.service.PolicyManagementService; @@ -83,7 +73,13 @@ public class PolicyServiceTest { private AuthPolicyHRepository authPolicyHRepository; @Mock - PartnerPolicyRepository partnerPolicyRepository; + PartnerPolicyRepository partnerPolicyRepository; + + @Mock + PartnerPolicyRequestRepository partnerPolicyRequestRepository; + + @Mock + PolicySummaryRepository policySummaryRepository; @Mock private WebSubPublisher webSubPublisher; @@ -1249,4 +1245,268 @@ private JSONObject createWrongAuthPolicyInput() { } return json; } + + @Test + public void getAllPoliciesTest() throws Exception { + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + int pageNo = 0; + int pageSize = 8; + PolicyFilterDto filterDto = new PolicyFilterDto(); + filterDto.setPolicyId("123"); + filterDto.setPolicyType("Auth"); + filterDto.setPolicyName("abc"); + filterDto.setPolicyDescription("desc"); + filterDto.setPolicyGroupName("default"); + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + Page page = null; + when(policySummaryRepository.getSummaryOfAllPolicies(anyString(), anyString(), anyString(), anyString(), anyString(), any(), any())).thenReturn(page); + service.getAllPolicies(sortFieldName, sortType, pageNo, pageSize, filterDto); + } + + @Test + public void getAllPoliciesTestException() throws Exception { + String sortFieldName = "createdDateTime"; + String sortType = "desc"; + int pageNo = 0; + int pageSize = 8; + ResponseWrapperV2> responseWrapper = new ResponseWrapperV2<>(); + Page page = null; + when(policySummaryRepository.getSummaryOfAllPolicies(anyString(), anyString(), anyString(), anyString(), anyString(), any(), any())).thenReturn(page); + service.getAllPolicies(sortFieldName, sortType, pageNo, pageSize, null); + } + + @Test + public void deactivatePolicyTest() throws Exception { + DeactivateRequestDto requestDto = new DeactivateRequestDto(); + requestDto.setStatus("De-Activate"); + + AuthPolicy authPolicy = new AuthPolicy(); + authPolicy.setIsActive(true); + when(authPolicyRepository.findById(anyString())).thenReturn(Optional.of(authPolicy)); + when(partnerPolicyRequestRepository.findByPolicyIdAndStatusCode(anyString(), anyString())).thenReturn(new ArrayList<>()); + authPolicy.setIsActive(false); + when(authPolicyRepository.save(any())).thenReturn(authPolicy); + + service.deactivatePolicy("policy123", requestDto); + } + + @Test + public void deactivatePolicyExceptionTest0() throws Exception { + DeactivateRequestDto requestDto = new DeactivateRequestDto(); + requestDto.setStatus("De-Activate"); + + AuthPolicy authPolicy = new AuthPolicy(); + authPolicy.setIsActive(true); + when(authPolicyRepository.findById(anyString())).thenReturn(Optional.empty()); + service.deactivatePolicy("policy123", requestDto); + } + + @Test + public void deactivatePolicyExceptionTest1() throws Exception { + DeactivateRequestDto requestDto = new DeactivateRequestDto(); + requestDto.setStatus("De-Activate"); + service.deactivatePolicy("", requestDto); + } + + @Test + public void deactivatePolicyExceptionTest2() throws Exception { + DeactivateRequestDto requestDto = new DeactivateRequestDto(); + requestDto.setStatus("De-Activate"); + + AuthPolicy authPolicy = new AuthPolicy(); + authPolicy.setIsActive(true); + when(authPolicyRepository.findById(anyString())).thenReturn(Optional.of(authPolicy)); + List partnerPolicyRequestList = new ArrayList<>(); + PartnerPolicyRequest partnerPolicyRequest = new PartnerPolicyRequest(); + partnerPolicyRequestList.add(partnerPolicyRequest); + when(partnerPolicyRequestRepository.findByPolicyIdAndStatusCode(anyString(), anyString())).thenReturn(partnerPolicyRequestList); + + when(partnerPolicyRequestRepository.findByPolicyIdAndStatusCode(anyString(), anyString())).thenReturn(new ArrayList<>()); + authPolicy.setIsActive(false); + when(authPolicyRepository.save(any())).thenReturn(authPolicy); + + service.deactivatePolicy("policy123", requestDto); + } + + @Test + public void deactivatePolicyGroupTestSuccess() { + DeactivateRequestDto requestDto = new DeactivateRequestDto(); + requestDto.setStatus("De-Activate"); + + String policyGroupId = "group123"; + PolicyGroup mockPolicyGroup = new PolicyGroup(); + mockPolicyGroup.setId(policyGroupId); + mockPolicyGroup.setIsActive(true); + + PolicyCountDto mockPolicyCountDto = new PolicyCountDto(); + mockPolicyCountDto.setActivePoliciesCount(0L); + mockPolicyCountDto.setDraftPoliciesCount(0L); + + when(policyGroupRepository.findById(policyGroupId)).thenReturn(Optional.of(mockPolicyGroup)); + when(authPolicyRepository.findPolicyCountsByPolicyGroupId(policyGroupId)).thenReturn(mockPolicyCountDto); + when(policyGroupRepository.save(any(PolicyGroup.class))).thenReturn(mockPolicyGroup); + + ResponseWrapperV2 response = + service.deactivatePolicyGroup(policyGroupId, requestDto); + + assertNotNull(response); + assertNotNull(response.getResponse()); + assertFalse(response.getResponse().getIsActive()); + assertEquals(policyGroupId, response.getResponse().getPolicyGroupId()); + + verify(policyGroupRepository).save(any(PolicyGroup.class)); + } + + @Test + public void deactivatePolicyGroupTestNullPolicyGroupId() { + DeactivateRequestDto requestDto = new DeactivateRequestDto(); + requestDto.setStatus("De-Activate"); + + ResponseWrapperV2 response = + service.deactivatePolicyGroup(null, requestDto); + + // Assert + assertNotNull(response); + assertNotNull(response.getErrors()); + assertEquals(ErrorMessages.INVALID_INPUT_PARAMETER.getErrorCode(), + response.getErrors().get(0).getErrorCode()); + } + + @Test + public void deactivatePolicyGroupTestEmptyPolicyGroupId() { + DeactivateRequestDto requestDto = new DeactivateRequestDto(); + requestDto.setStatus("De-Activate"); + + ResponseWrapperV2 response = + service.deactivatePolicyGroup("", requestDto); + + // Assert + assertNotNull(response); + assertNotNull(response.getErrors()); + assertEquals(ErrorMessages.INVALID_INPUT_PARAMETER.getErrorCode(), + response.getErrors().get(0).getErrorCode()); + } + + @Test + public void deactivatePolicyGroupTestInvalidPolicyGroup() { + DeactivateRequestDto requestDto = new DeactivateRequestDto(); + requestDto.setStatus("De-Activate"); + + String policyGroupId = "group123"; + when(policyGroupRepository.findById(policyGroupId)).thenReturn(Optional.empty()); + + ResponseWrapperV2 response = + service.deactivatePolicyGroup(policyGroupId, requestDto); + + // Assert + assertNotNull(response); + assertNotNull(response.getErrors()); + assertEquals(ErrorMessages.POLICY_GROUP_DOES_NOT_EXIST.getErrorCode(), + response.getErrors().get(0).getErrorCode()); + } + + @Test + public void deactivatePolicyGroupTest_AlreadyDeactivated() { + DeactivateRequestDto requestDto = new DeactivateRequestDto(); + requestDto.setStatus("De-Activate"); + + String policyGroupId = "group123"; + PolicyGroup mockPolicyGroup = new PolicyGroup(); + mockPolicyGroup.setId(policyGroupId); + mockPolicyGroup.setIsActive(false); + + when(policyGroupRepository.findById(policyGroupId)).thenReturn(Optional.of(mockPolicyGroup)); + + ResponseWrapperV2 response = + service.deactivatePolicyGroup(policyGroupId, requestDto); + + // Assert + assertNotNull(response); + assertNotNull(response.getErrors()); + assertEquals(ErrorMessages.POLICY_GROUP_ALREADY_DEACTIVATED.getErrorCode(), + response.getErrors().get(0).getErrorCode()); + } + + @Test + public void deactivatePolicyGroupTest_ActivePoliciesExist() { + DeactivateRequestDto requestDto = new DeactivateRequestDto(); + requestDto.setStatus("De-Activate"); + + String policyGroupId = "group123"; + PolicyGroup mockPolicyGroup = new PolicyGroup(); + mockPolicyGroup.setId(policyGroupId); + mockPolicyGroup.setIsActive(true); + + PolicyCountDto mockPolicyCountDto = new PolicyCountDto(); + mockPolicyCountDto.setActivePoliciesCount(2L); + mockPolicyCountDto.setDraftPoliciesCount(0L); + + when(policyGroupRepository.findById(policyGroupId)).thenReturn(Optional.of(mockPolicyGroup)); + when(authPolicyRepository.findPolicyCountsByPolicyGroupId(policyGroupId)).thenReturn(mockPolicyCountDto); + + ResponseWrapperV2 response = + service.deactivatePolicyGroup(policyGroupId, requestDto); + + // Assert + assertNotNull(response); + assertNotNull(response.getErrors()); + assertEquals(ErrorMessages.ACTIVE_POLICY_EXISTS_UNDER_POLICY_GROUP.getErrorCode(), + response.getErrors().get(0).getErrorCode()); + } + + @Test + public void deactivatePolicyGroupTest_DraftPoliciesExist() { + DeactivateRequestDto requestDto = new DeactivateRequestDto(); + requestDto.setStatus("De-Activate"); + // Arrange + String policyGroupId = "group123"; + PolicyGroup mockPolicyGroup = new PolicyGroup(); + mockPolicyGroup.setId(policyGroupId); + mockPolicyGroup.setIsActive(true); + + PolicyCountDto mockPolicyCountDto = new PolicyCountDto(); + mockPolicyCountDto.setActivePoliciesCount(0L); + mockPolicyCountDto.setDraftPoliciesCount(3L); + + when(policyGroupRepository.findById(policyGroupId)).thenReturn(Optional.of(mockPolicyGroup)); + when(authPolicyRepository.findPolicyCountsByPolicyGroupId(policyGroupId)).thenReturn(mockPolicyCountDto); + + ResponseWrapperV2 response = + service.deactivatePolicyGroup(policyGroupId, requestDto); + + // Assert + assertNotNull(response); + assertNotNull(response.getErrors()); + assertEquals(ErrorMessages.DRAFT_POLICIES_EXISTS_UNDER_POLICY_GROUP.getErrorCode(), + response.getErrors().get(0).getErrorCode()); + } + + @Test + public void deactivatePolicyGroupTest_ActiveAndDraftPoliciesExist() { + DeactivateRequestDto requestDto = new DeactivateRequestDto(); + requestDto.setStatus("De-Activate"); + + String policyGroupId = "group123"; + PolicyGroup mockPolicyGroup = new PolicyGroup(); + mockPolicyGroup.setId(policyGroupId); + mockPolicyGroup.setIsActive(true); + + PolicyCountDto mockPolicyCountDto = new PolicyCountDto(); + mockPolicyCountDto.setActivePoliciesCount(2L); + mockPolicyCountDto.setDraftPoliciesCount(1L); + + when(policyGroupRepository.findById(policyGroupId)).thenReturn(Optional.of(mockPolicyGroup)); + when(authPolicyRepository.findPolicyCountsByPolicyGroupId(policyGroupId)).thenReturn(mockPolicyCountDto); + + ResponseWrapperV2 response = + service.deactivatePolicyGroup(policyGroupId, requestDto); + + // Assert + assertNotNull(response); + assertNotNull(response.getErrors()); + assertEquals(ErrorMessages.ACTIVE_AND_DRAFT_POLICIES_EXISTS_UNDER_POLICY_GROUP.getErrorCode(), + response.getErrors().get(0).getErrorCode()); + } + } diff --git a/partner/policy-management-service/src/test/resources/application.properties b/partner/policy-management-service/src/test/resources/application.properties index 8e1aa21ee1..7b29b6ae29 100644 --- a/partner/policy-management-service/src/test/resources/application.properties +++ b/partner/policy-management-service/src/test/resources/application.properties @@ -99,5 +99,8 @@ mosip.pms.esignet.oidc-client-update-url=https://api.dev.mosip.net/v1/idp/client mosip.pms.esignet.config-url=https://api.dev.mosip.net/v1/idp/oidc/.well-known/openid-configuration #id for the API -mosip.pms.api.id.all.policy.groups.get=mosip.pms.all.policy.groups.get +mosip.pms.api.id.policy.groups.get=mosip.pms.policy.groups.get +mosip.pms.api.id.policies.get=mosip.pms.policies.get +mosip.pms.api.id.deactivate.policy.patch=mosip.pms.deactivate.policy.patch +mosip.pms.api.id.deactivate.policy.group.patch=mosip.pms.deactivate.policy.group.patch diff --git a/partner/policy-validator/pom.xml b/partner/policy-validator/pom.xml index 00a7e5f469..ef83ab3ce3 100644 --- a/partner/policy-validator/pom.xml +++ b/partner/policy-validator/pom.xml @@ -6,10 +6,10 @@ io.mosip.pms pms-parent - 1.3.0-dp.1 + 1.3.0-beta1 policy-validator - 1.3.0-dp.1 + 1.3.0-beta1 policy-validator UTF-8 diff --git a/partner/policy-validator/src/main/java/io/mosip/pms/policy/validator/constants/PolicyValidatorErrorConstant.java b/partner/policy-validator/src/main/java/io/mosip/pms/policy/validator/constants/PolicyValidatorErrorConstant.java index 1811515f6a..b90fc0035f 100644 --- a/partner/policy-validator/src/main/java/io/mosip/pms/policy/validator/constants/PolicyValidatorErrorConstant.java +++ b/partner/policy-validator/src/main/java/io/mosip/pms/policy/validator/constants/PolicyValidatorErrorConstant.java @@ -11,7 +11,13 @@ public enum PolicyValidatorErrorConstant { INVALID_INPUT_PARAMETER("PMS_PV_005", "Invalid input parameter - %s in policy data"), - MISSING_INPUT_PARAMETER("PMS_PV_006", "Missing input parameter - %s in policy data"); + MISSING_INPUT_PARAMETER("PMS_PV_006", "Missing input parameter - %s in policy data"), + + EXPECTED_INPUT_PARAMETER("PMS_PV_007", "Format Error: Expected format is %s."), + + EMPTY_ARRAY_INPUT_PARAMETER("PMS_PV_008", "Empty array is not allowed in %s."), + + EMPTY_STRING_INPUT_PARAMETER("PMS_PV_009", "Empty string is not allowed in %s."); private final String errorCode; diff --git a/partner/policy-validator/src/main/java/io/mosip/pms/policy/validator/impl/PolicySchemaValidator.java b/partner/policy-validator/src/main/java/io/mosip/pms/policy/validator/impl/PolicySchemaValidator.java index 091eaf7b08..433187fd1c 100644 --- a/partner/policy-validator/src/main/java/io/mosip/pms/policy/validator/impl/PolicySchemaValidator.java +++ b/partner/policy-validator/src/main/java/io/mosip/pms/policy/validator/impl/PolicySchemaValidator.java @@ -44,7 +44,10 @@ public class PolicySchemaValidator implements PolicyValidator{ public static final String PATH_SEPERATOR = "/"; private static final String MISSING = "missing"; private static final String UNWANTED = "unwanted"; - + public static final String EXPECTED = "expected"; + public static final String MIN_ITEMS = "minItems"; + public static final String MIN_LENGTH = "minLength"; + /** * */ @@ -123,6 +126,15 @@ private List getErrorsList(ProcessingReport report) { if (processingMessageAsJson.hasNonNull(KEYWORD) && processingMessageAsJson.get(KEYWORD).asText().contentEquals(ENUM)) { buildErrorMessages(errorList, processingMessageAsJson, PolicyValidatorErrorConstant.INVALID_INPUT_PARAMETER, KEYWORD); } + if (processingMessageAsJson.hasNonNull(EXPECTED)) { + buildErrorMessages(errorList, processingMessageAsJson, PolicyValidatorErrorConstant.EXPECTED_INPUT_PARAMETER, EXPECTED); + } + if (processingMessageAsJson.hasNonNull(KEYWORD) && processingMessageAsJson.get(KEYWORD).asText().contentEquals(MIN_ITEMS)) { + buildErrorMessages(errorList, processingMessageAsJson, PolicyValidatorErrorConstant.EMPTY_ARRAY_INPUT_PARAMETER, KEYWORD); + } + if (processingMessageAsJson.hasNonNull(KEYWORD) && processingMessageAsJson.get(KEYWORD).asText().contentEquals(MIN_LENGTH)) { + buildErrorMessages(errorList, processingMessageAsJson, PolicyValidatorErrorConstant.EMPTY_STRING_INPUT_PARAMETER, KEYWORD); + } } } } diff --git a/partner/pom.xml b/partner/pom.xml index ac12d2f592..7bb9970342 100644 --- a/partner/pom.xml +++ b/partner/pom.xml @@ -5,7 +5,7 @@ io.mosip.pms pms-parent pom - 1.3.0-dp.1 + 1.3.0-beta1 partner-management-services Parent project of MOSIP partner-management-services @@ -71,6 +71,7 @@ 1.2.0.1 1.2.0.1 1.2.0.1 + 1.2.0.1 3.0.2 3.1.0 11 @@ -183,6 +184,9 @@ ${argLine} --add-opens java.xml/jdk.xml.internal=ALL-UNNAMED --illegal-access=permit + + io.mosip.kernel:kernel-auth-adapter +