From dc6a004365d00447727baf25fd47486a60e5958f Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Mon, 26 Jun 2023 22:44:52 +0200 Subject: [PATCH] RED-6686 Extract Tenant and user-management code into a separate service. --- .../keycloak-commons/pom.xml | 121 ---- .../DefaultKeyCloakCommonsConfiguration.java | 24 - .../commons/KeyCloakAdminClientService.java | 41 -- .../keycloak/commons/KeyCloakSettings.java | 21 - .../keycloak/commons/KeycloakSecurity.java | 56 -- .../commons/KeycloakSecurityService.java | 18 - .../red/keycloak/commons/RealmService.java | 21 - .../keycloak/commons/UserListingService.java | 101 --- .../commons/roles/ApplicationRoles.java | 259 -------- .../RedBearerTokenRequestAuthenticator.java | 91 --- ...eryParameterTokenRequestAuthenticator.java | 91 --- .../commons/security/RedTokenVerifier.java | 87 --- .../SecuredKeyCloakConfiguration.java | 150 ----- .../red/keycloak/commons/IdentityTest.java | 16 - .../pom.xml | 4 - ...stenceServiceExternalApiConfiguration.java | 16 - .../ApplicationConfigurationController.java | 6 +- .../api/impl/controller/AuditController.java | 4 +- .../CustomPermissionMappingController.java | 2 +- .../impl/controller/DictionaryController.java | 4 +- .../DigitalSignatureController.java | 6 +- .../DossierAttributesController.java | 12 +- .../impl/controller/DossierController.java | 18 +- .../controller/DossierStatsController.java | 2 +- .../controller/DossierStatusController.java | 6 +- .../controller/DossierTemplateController.java | 38 +- .../DossierTemplateStatsController.java | 2 +- .../impl/controller/DownloadController.java | 8 +- .../controller/ExternalControllerAdvice.java | 4 +- .../controller/FileAttributesController.java | 8 +- .../controller/FileManagementController.java | 10 +- .../controller/GeneralSettingsController.java | 40 -- .../impl/controller/HighlightsController.java | 10 +- .../LegalBasisMappingController.java | 8 +- .../impl/controller/LicenseController.java | 6 +- .../controller/LicenseReportController.java | 4 +- .../controller/ManualRedactionController.java | 10 +- .../controller/NotificationController.java | 6 +- .../NotificationPreferencesController.java | 6 +- .../api/impl/controller/RSSController.java | 4 +- .../impl/controller/ReanalysisController.java | 4 +- .../controller/RedactionLogController.java | 4 +- .../controller/ReportTemplateController.java | 12 +- .../api/impl/controller/RulesController.java | 6 +- .../SMTPConfigurationController.java | 100 --- .../api/impl/controller/SearchController.java | 2 +- .../api/impl/controller/StatusController.java | 10 +- .../controller/StatusReportController.java | 2 +- .../impl/controller/TenantsController.java | 63 -- .../api/impl/controller/UploadController.java | 2 +- .../api/impl/controller/UserController.java | 147 ----- .../controller/UserPreferenceController.java | 78 --- .../impl/controller/VersionsController.java | 2 +- .../controller/ViewedPagesController.java | 4 +- .../impl/controller/WatermarkController.java | 6 +- .../DownloadTempFileInterceptor.java | 5 +- .../HeaderBasedKeycloakRealmResolver.java | 101 --- .../swagger/SwaggerAutoConfiguration.java | 129 ---- .../swagger/SwaggerCustomDocsController.java | 53 -- .../impl/swagger/SwaggerHomeController.java | 31 - .../api/impl/swagger/SwaggerProperties.java | 19 - .../swagger/SwaggerTenantMvcConfigurer.java | 47 -- .../pom.xml | 6 - .../ApplicationConfigurationResource.java | 2 +- .../resource/GeneralSettingsResource.java | 36 -- .../resource/SMTPConfigurationResource.java | 53 -- .../external/resource/TenantsResource.java | 51 -- .../resource/UserPreferenceResource.java | 49 -- .../api/external/resource/UserResource.java | 125 ---- .../controller/DossierInternalController.java | 2 +- .../LegalBasisMappingInternalController.java | 2 +- .../controller/TenantsInternalController.java | 56 -- .../internal/resources/TenantsResource.java | 40 -- .../persistence-service-processor-v1/pom.xml | 40 +- ...sistenceServiceProcessorConfiguration.java | 10 +- .../custom/api/ICustomPermissionService.java | 13 +- ...sObjectDossierObjectPermissionService.java | 9 +- ...wObjectDossierObjectPermissionService.java | 7 +- .../custom/initializer/ACLInitializer.java | 3 - ...ustomDossierPermissionsACLInitializer.java | 2 - .../UsersClient.java | 24 + ...CleanupDownloadSchedulerConfiguration.java | 30 - .../TenantMessagingConfiguration.java | 50 ++ .../UserMessagingConfiguration.java | 149 +++++ .../annotations/AnnotationEntityId.java | 4 +- .../entity/annotations/CommentEntity.java | 15 +- .../entity/annotations/IdRemovalEntity.java | 16 +- .../ManualForceRedactionEntity.java | 14 +- .../ManualImageRecategorizationEntity.java | 14 +- .../ManualLegalBasisChangeEntity.java | 14 +- .../ManualRedactionEntryEntity.java | 18 +- .../ManualResizeRedactionEntity.java | 18 +- .../entity/annotations/RectangleEntity.java | 2 +- .../entity/annotations/ViewedPageEntity.java | 16 +- .../processor/entity/audit/AuditEntity.java | 19 +- .../ApplicationConfigurationEntity.java | 8 +- .../entity/configuration/ColorsEntity.java | 12 +- .../configuration/DictionaryEntryEntity.java | 12 +- .../DictionaryFalsePositiveEntryEntity.java | 12 +- ...tionaryFalseRecommendationEntryEntity.java | 12 +- .../configuration/DigitalSignatureEntity.java | 10 +- .../DigitalSignatureKmsEntity.java | 13 +- .../DigitalSignatureTypeEntity.java | 12 +- ...eAttributesGeneralConfigurationEntity.java | 12 +- .../configuration/LegalBasisEntity.java | 4 +- .../LegalBasisMappingEntity.java | 10 +- .../entity/configuration/RuleSetEntity.java | 10 +- .../SMTPConfigurationEntity.java | 56 -- .../entity/configuration/TypeEntity.java | 14 +- .../entity/configuration/WatermarkEntity.java | 22 +- .../dossier/DossierAttributeConfigEntity.java | 14 +- .../dossier/DossierAttributeEntity.java | 10 +- .../entity/dossier/DossierEntity.java | 26 +- .../entity/dossier/DossierStatusEntity.java | 16 +- .../entity/dossier/DossierTemplateEntity.java | 14 +- .../dossier/FileAttributeConfigEntity.java | 14 +- .../entity/dossier/FileAttributeEntity.java | 10 +- .../processor/entity/dossier/FileEntity.java | 22 +- .../entity/dossier/ReportTemplateEntity.java | 14 +- .../entity/download/DownloadStatusEntity.java | 20 +- .../entity/index/IndexInformationEntity.java | 8 +- .../entity/migration/MigrationEntity.java | 13 +- .../notification/NotificationEntity.java | 20 +- .../NotificationPreferencesEntity.java | 12 +- .../permissions/CustomPermissionEntity.java | 10 +- .../jobs/CustomQuartzConfiguration.java | 177 ------ .../HibernateStatisticsInterceptor.java | 38 -- .../metrics/MetricsConfiguration.java | 32 - .../metrics/PersistenceMetricsAspect.java | 97 --- .../migration/MigrationStarterService.java | 14 +- .../EncryptSMTPPasswordsMigration11.java | 42 -- .../ReduceTextFileSizeMigration10.java | 2 +- .../migrations/SimplifiedTextMigration12.java | 2 +- .../reducetext/AbstractTextContainer.java | 3 - .../migrations/model/reducetext/Image.java | 2 - .../model/reducetext/RedRectangle2D.java | 4 - .../model/reducetext/RedTextPosition.java | 2 - .../model/reducetext/SectionText.java | 2 - .../migrations/model/reducetext/Text.java | 2 - .../model/reducetext/TextBlock.java | 4 - .../reducetext/TextPositionSequence.java | 7 - .../migrations/model/simplifiedtext/Text.java | 2 - .../processor/multitenancy/AsyncConfig.java | 27 - .../ForwardTenantInterceptor.java | 19 - .../MultiTenancyMessagingConfiguration.java | 50 -- .../MultiTenancyWebConfiguration.java | 29 - .../StorageConnectionProviderImpl.java | 47 -- .../TenantAwareTaskDecorator.java | 25 - .../multitenancy/TenantInterceptor.java | 47 -- .../entity/AzureStorageConnectionEntity.java | 23 - .../entity/DatabaseConnectionEntity.java | 45 -- .../entity/S3StorageConnectionEntity.java | 31 - .../entity/SearchConnectionEntity.java | 40 -- .../multitenancy/entity/TenantEntity.java | 41 -- .../persistence/MasterPersistenceConfig.java | 111 ---- .../persistence/TenantPersistenceConfig.java | 23 +- .../TenantSpringLiquibaseExecutor.java | 23 +- .../v1/processor}/roles/ActionRoles.java | 2 +- .../v1/processor/roles/ApplicationRoles.java | 257 ++++++++ .../service/AccessControlService.java | 2 +- .../service/CvAnalysisMessageReceiver.java | 4 +- .../service/DeploymentKeyService.java | 35 - .../service/DictionaryManagementService.java | 2 +- .../processor/service/DictionaryService.java | 22 +- .../service/DigitalSignatureKmsService.java | 8 +- .../service/DigitalSignatureService.java | 3 +- .../service/DossierManagementService.java | 2 +- .../v1/processor/service/DossierService.java | 2 +- .../service/DossierTemplateCloneService.java | 4 +- .../service/DossierTemplateImportService.java | 2 +- .../v1/processor/service/DownloadService.java | 6 +- .../v1/processor/service/EmailService.java | 14 +- .../service/EncryptionDecryptionService.java | 108 ---- .../FileAttributesManagementService.java | 2 +- .../service/FileManagementStorageService.java | 2 +- .../v1/processor/service/FileService.java | 2 +- .../FileStatusProcessingUpdateService.java | 2 +- .../processor/service/FileStatusService.java | 138 ++-- .../service/GeneralConfigurationService.java | 89 --- .../service/ImageMessageReceiver.java | 4 +- .../v1/processor/service/IndexingService.java | 35 +- .../KeyCloakRoleManagerApplicationRunner.java | 29 - .../service/KeyCloakRoleManagerService.java | 134 ---- .../KeyCloakUserSyncService.java | 22 +- .../service/ManualRedactionService.java | 12 +- .../processor/service/NerMessageReceiver.java | 4 +- .../service/OCRProcessingMessageReceiver.java | 4 +- .../service/ReportTemplateService.java | 2 +- .../v1/processor/service/StopwordService.java | 2 +- .../service/TenantManagementService.java | 446 ------------- .../v1/processor/service/UploadService.java | 8 +- .../processor/service/UserCacheBuilder.java | 27 - .../v1/processor/service/UserService.java | 597 ------------------ .../processor/service/WatermarkService.java | 2 +- .../download/DownloadDLQMessageReceiver.java | 9 +- .../download/DownloadPreparationService.java | 6 +- .../download/DownloadProcessorService.java | 14 +- .../download/RedactionDlqMessageReceiver.java | 7 +- .../export/DossierTemplateExportService.java | 14 +- .../export/ExportDownloadMessageReceiver.java | 4 +- .../service/job/AutomaticAnalysisJob.java | 10 +- .../service/job/DeletedFilesCleanupJob.java | 8 +- .../service/job/DownloadCleanupJob.java | 10 +- .../service/job/KeyCloakUserSyncJob.java | 3 +- .../service/job/SendNotificationEmailJob.java | 8 +- .../service/job/SyncUserPermissionsJob.java | 10 +- .../persistence/AuditPersistenceService.java | 2 +- .../DictionaryPersistenceService.java | 2 +- ...sierAttributeConfigPersistenceService.java | 2 +- .../DossierAttributePersistenceService.java | 2 +- .../DossierStatusPersistenceService.java | 2 +- .../DossierTemplatePersistenceService.java | 2 +- .../DownloadStatusPersistenceService.java | 2 +- .../persistence/EntryPersistenceService.java | 2 +- ...FileAttributeConfigPersistenceService.java | 2 +- .../FileStatusPersistenceService.java | 2 +- .../LegalBasisMappingPersistenceService.java | 2 +- .../NotificationPersistenceService.java | 2 +- ...ficationPreferencesPersistenceService.java | 2 +- .../ReportTemplatePersistenceService.java | 2 +- .../persistence/RulesPersistenceService.java | 2 +- .../persistence/SMTPConfigurationService.java | 119 ---- .../ViewedPagesPersistenceService.java | 2 +- .../CommentPersistenceService.java | 2 +- .../CurrentTenantIdentifierResolverImpl.java | 4 +- .../mulitenancy/DevDataProvider.java | 92 +++ ...rceBasedMultiTenantConnectionProvider.java | 17 +- .../mulitenancy/MultiTenantDataSource.java | 18 +- .../MultiTenantDataSourceHealthIndicator.java | 29 + .../{repository => }/SchemaConnection.java | 7 +- .../mulitenancy/TenantManagementService.java | 182 ++++++ .../repository/TenantRepository.java | 16 - .../repository/FileRepository.java | 4 +- .../repository/SMTPRepository.java | 9 - .../repository/TypeRepository.java | 2 +- .../dictionaryentry/EntryRepository.java | 2 +- .../FalsePositiveEntryRepository.java | 2 +- .../FalseRecommendationEntryRepository.java | 2 +- .../dictionaryentry/QueryExecutor.java | 6 +- .../processor/service/users/UserService.java | 255 ++++++++ .../users/events/TenantCreatedEvent.java | 14 + .../users/events/UserCreatedEvent.java | 18 + .../users/events/UserRemovedEvent.java | 18 + .../users/events/UserRolesUpdatedEvent.java | 21 + .../users/events/UserStatusToggleEvent.java | 18 + .../users/events/UserUpdatedEvent.java | 18 + .../events/UserUpdatedOwnProfileEvent.java | 17 + .../processor/service/users}/model/User.java | 2 +- .../utils/JSONDownloadFileTypeConverter.java | 4 +- .../utils/JSONIntegerSetConverter.java | 4 +- .../v1/processor/utils/JSONMapConverter.java | 4 +- .../JSONStoredFileInformationConverter.java | 4 +- .../utils/JSONStringSetConverter.java | 4 +- .../v1/processor/utils/MagicConverter.java | 2 +- .../v1/processor/utils/jdbc/JDBCUtils.java | 32 +- .../processor/utils/jdbc/JDBCWriteUtils.java | 6 +- .../utils/multitenancy/TenantContext.java | 29 - .../db/changelog/db.changelog-master.yaml | 9 - .../db/changelog/db.changelog-tenant.yaml | 2 + .../master/1-initial-schema.changelog.yaml | 30 - .../changelog/master/2-quartz.changelog.yaml | 536 ---------------- .../3-detailed-db-connection.changelog.yaml | 82 --- ...d-unique-constraint-for-tenants-table.yaml | 17 - .../13-file-manual-change-date.changelog.yaml | 5 +- ...ossier-remove-dossier-state.changelog.yaml | 2 +- ...-reports-information-column.changelog.yaml | 2 +- ...e-old-dossier-status-column.changelog.yaml | 2 +- ...big-int-to-serial-for-remaining-tables.sql | 13 + .../src/test/resources/application.yml | 8 + .../persistence-service-server-v1/pom.xml | 32 +- .../peristence/v1/server/Application.java | 31 +- .../v1/server/DevConfiguration.java | 202 ------ .../src/main/resources/application-dev.yaml | 37 ++ .../src/main/resources/application-dev.yml | 79 --- .../{application.yml => application.yaml} | 105 ++- .../server/integration/client/SMTPClient.java | 10 - .../integration/client/TenantsClient.java | 10 - .../service/DossierTesterAndProvider.java | 2 +- .../integration/service/UserProvider.java | 17 +- .../tests/CustomPermissionTest.java | 2 +- .../integration/tests/DeploymentKeyTest.java | 24 - .../integration/tests/DictionaryTest.java | 4 +- .../tests/DigitalSignatureTest.java | 8 + .../integration/tests/DossierStatsTest.java | 2 +- .../tests/DossierTemplateImportTest.java | 2 +- .../tests/DossierTemplateStatsTest.java | 22 +- .../tests/DossierTemplateTest.java | 41 +- .../tests/DownloadPreparationTest.java | 2 +- .../integration/tests/DownloadTest.java | 2 +- .../EncryptSMTPPasswordsMigrationTest.java | 40 -- .../tests/ManualRedactionTest.java | 5 +- .../NotificationPreferencesServiceTest.java | 2 +- .../integration/tests/NotificationTest.java | 4 +- .../integration/tests/ReanalysisTest.java | 2 +- .../tests/ReduceFileSizeMigrationTest.java | 2 +- .../v1/server/integration/tests/SMTPTest.java | 53 -- .../server/integration/tests/TenantsTest.java | 207 ------ .../performance/EntityPerformanceTest.java | 2 +- .../performance/FilePerformanceTest.java | 24 +- .../performance/PerformanceTestService.java | 2 +- .../AbstractPersistenceServerServiceTest.java | 282 +++++---- .../utils/FeignRequestInterceptor.java | 5 +- .../utils/KeyCloakTestContainer.java | 67 -- .../utils/KneconRedisTestContainer.java | 26 + .../KneconSpringPostgreSQLTestContainer.java | 132 ++++ .../integration/utils/TokenService.java | 51 +- .../{application.yml => application.yaml} | 64 +- .../persistence-service-shared-api-v1/pom.xml | 31 - .../v1/api/shared/model/AuditResponse.java | 2 + .../v1/api/shared/model/CreateTypeValue.java | 4 +- .../PrepareDownloadWithOptionRequest.java | 3 +- .../shared/model/UpdateMyProfileRequest.java | 4 +- .../configuration/ApplicationConfig.java | 2 +- .../multitenancy/AzureStorageConnection.java | 17 - .../multitenancy/DatabaseConnection.java | 28 - .../shared/model/multitenancy/RedUser.java | 22 - .../multitenancy/S3StorageConnection.java | 21 - .../model/multitenancy/SearchConnection.java | 24 - .../multitenancy/SimpleTenantResponse.java | 18 - .../model/multitenancy/TenantRequest.java | 33 - .../model/multitenancy/TenantResponse.java | 23 - persistence-service-v1/pom.xml | 14 +- 322 files changed, 2390 insertions(+), 7854 deletions(-) delete mode 100644 persistence-service-v1/keycloak-commons/pom.xml delete mode 100644 persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/DefaultKeyCloakCommonsConfiguration.java delete mode 100644 persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeyCloakAdminClientService.java delete mode 100644 persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeyCloakSettings.java delete mode 100644 persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeycloakSecurity.java delete mode 100644 persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeycloakSecurityService.java delete mode 100644 persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/RealmService.java delete mode 100644 persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/UserListingService.java delete mode 100644 persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/roles/ApplicationRoles.java delete mode 100644 persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedBearerTokenRequestAuthenticator.java delete mode 100644 persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedQueryParameterTokenRequestAuthenticator.java delete mode 100644 persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedTokenVerifier.java delete mode 100644 persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/SecuredKeyCloakConfiguration.java delete mode 100644 persistence-service-v1/keycloak-commons/src/test/java/com/iqser/red/keycloak/commons/IdentityTest.java delete mode 100644 persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/GeneralSettingsController.java delete mode 100644 persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/SMTPConfigurationController.java delete mode 100644 persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/TenantsController.java delete mode 100644 persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserController.java delete mode 100644 persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserPreferenceController.java delete mode 100644 persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/multitenacy/HeaderBasedKeycloakRealmResolver.java delete mode 100644 persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerAutoConfiguration.java delete mode 100644 persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerCustomDocsController.java delete mode 100644 persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerHomeController.java delete mode 100644 persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerProperties.java delete mode 100644 persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerTenantMvcConfigurer.java delete mode 100644 persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/GeneralSettingsResource.java delete mode 100644 persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/SMTPConfigurationResource.java delete mode 100644 persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/TenantsResource.java delete mode 100644 persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserPreferenceResource.java delete mode 100644 persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserResource.java delete mode 100644 persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/TenantsInternalController.java delete mode 100644 persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/TenantsResource.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/tenantusermanagementservice/UsersClient.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/CleanupDownloadSchedulerConfiguration.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/TenantMessagingConfiguration.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/UserMessagingConfiguration.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/SMTPConfigurationEntity.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/jobs/CustomQuartzConfiguration.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/HibernateStatisticsInterceptor.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/MetricsConfiguration.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/PersistenceMetricsAspect.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/EncryptSMTPPasswordsMigration11.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/AsyncConfig.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/ForwardTenantInterceptor.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/MultiTenancyMessagingConfiguration.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/MultiTenancyWebConfiguration.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/StorageConnectionProviderImpl.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/TenantAwareTaskDecorator.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/TenantInterceptor.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/AzureStorageConnectionEntity.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/DatabaseConnectionEntity.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/S3StorageConnectionEntity.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/SearchConnectionEntity.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/TenantEntity.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/MasterPersistenceConfig.java rename persistence-service-v1/{keycloak-commons/src/main/java/com/iqser/red/keycloak/commons => persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor}/roles/ActionRoles.java (99%) create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ApplicationRoles.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DeploymentKeyService.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EncryptionDecryptionService.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/GeneralConfigurationService.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/KeyCloakRoleManagerApplicationRunner.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/KeyCloakRoleManagerService.java rename persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/{job => service}/KeyCloakUserSyncService.java (77%) delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/TenantManagementService.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UserCacheBuilder.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UserService.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/SMTPConfigurationService.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/DevDataProvider.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/MultiTenantDataSourceHealthIndicator.java rename persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/{repository => }/SchemaConnection.java (62%) create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/TenantManagementService.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/repository/TenantRepository.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/SMTPRepository.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/UserService.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/TenantCreatedEvent.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserCreatedEvent.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserRemovedEvent.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserRolesUpdatedEvent.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserStatusToggleEvent.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserUpdatedEvent.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserUpdatedOwnProfileEvent.java rename persistence-service-v1/{keycloak-commons/src/main/java/com/iqser/red/keycloak/commons => persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users}/model/User.java (86%) delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/multitenancy/TenantContext.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-master.yaml delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/1-initial-schema.changelog.yaml delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/2-quartz.changelog.yaml delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/3-detailed-db-connection.changelog.yaml delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/4-add-unique-constraint-for-tenants-table.yaml create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/204-big-int-to-serial-for-remaining-tables.sql delete mode 100644 persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/DevConfiguration.java create mode 100644 persistence-service-v1/persistence-service-server-v1/src/main/resources/application-dev.yaml delete mode 100644 persistence-service-v1/persistence-service-server-v1/src/main/resources/application-dev.yml rename persistence-service-v1/persistence-service-server-v1/src/main/resources/{application.yml => application.yaml} (57%) delete mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/SMTPClient.java delete mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/TenantsClient.java delete mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DeploymentKeyTest.java delete mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EncryptSMTPPasswordsMigrationTest.java delete mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/SMTPTest.java delete mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/TenantsTest.java delete mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/KeyCloakTestContainer.java create mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/KneconRedisTestContainer.java create mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/KneconSpringPostgreSQLTestContainer.java rename persistence-service-v1/persistence-service-server-v1/src/test/resources/{application.yml => application.yaml} (63%) delete mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/AzureStorageConnection.java delete mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/DatabaseConnection.java delete mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/RedUser.java delete mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/S3StorageConnection.java delete mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/SearchConnection.java delete mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/SimpleTenantResponse.java delete mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/TenantRequest.java delete mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/TenantResponse.java diff --git a/persistence-service-v1/keycloak-commons/pom.xml b/persistence-service-v1/keycloak-commons/pom.xml deleted file mode 100644 index c1180d44a..000000000 --- a/persistence-service-v1/keycloak-commons/pom.xml +++ /dev/null @@ -1,121 +0,0 @@ - - - - - persistence-service-v1 - com.iqser.red.service - 2.0-SNAPSHOT - - - 4.0.0 - - keycloak-commons - - - - - com.iqser.red.commons - spring-commons - - - com.iqser.red.commons - logging-commons - - - org.apache.commons - commons-lang3 - 3.9 - - - org.apache.commons - commons-compress - 1.21 - - - org.apache.commons - commons-collections4 - 4.4 - - - - com.iqser.red.commons - metric-commons - - - - org.keycloak - keycloak-spring-boot-adapter-core - ${keycloak.version} - - - - org.keycloak - keycloak-spring-security-adapter - ${keycloak.version} - - - - org.keycloak - keycloak-admin-client - ${keycloak.version} - - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - 2.13.4 - - - - com.google.guava - guava - - - - - io.github.openfeign - feign-core - provided - - - - org.springframework - spring-web - provided - - - - org.springframework.boot - spring-boot-starter-security - - - - org.springframework.boot - spring-boot-starter-validation - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - com.iqser.red.commons - jackson-commons - - - - - com.iqser.red.commons - test-commons - test - - - org.springframework.retry - spring-retry - - - - diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/DefaultKeyCloakCommonsConfiguration.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/DefaultKeyCloakCommonsConfiguration.java deleted file mode 100644 index 4abdbf0fd..000000000 --- a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/DefaultKeyCloakCommonsConfiguration.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.iqser.red.keycloak.commons; - -import java.time.Duration; - -import org.springframework.boot.autoconfigure.cache.RedisCacheManagerBuilderCustomizer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.cache.RedisCacheConfiguration; - -@Configuration -@ComponentScan -public class DefaultKeyCloakCommonsConfiguration { - - public static final String USERS_CACHE = "users"; - - - @Bean - public RedisCacheManagerBuilderCustomizer redisUserCacheManagerBuilderCustomizer() { - - return (builder) -> builder.withCacheConfiguration(USERS_CACHE, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(10))); - } - -} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeyCloakAdminClientService.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeyCloakAdminClientService.java deleted file mode 100644 index cbc5768c4..000000000 --- a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeyCloakAdminClientService.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.iqser.red.keycloak.commons; - -import java.util.concurrent.TimeUnit; - -import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; -import org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl; -import org.keycloak.OAuth2Constants; -import org.keycloak.admin.client.Keycloak; -import org.keycloak.admin.client.KeycloakBuilder; -import org.springframework.stereotype.Service; - -@Service -public class KeyCloakAdminClientService { - - private final Keycloak adminClient; - - - public KeyCloakAdminClientService(KeyCloakSettings settings) { - - adminClient = KeycloakBuilder.builder() - .serverUrl(settings.getServerUrl()) - .realm(settings.getRealm()) - .clientId(settings.getClientId()) - .clientSecret(settings.getClientSecret()) - .grantType(OAuth2Constants.CLIENT_CREDENTIALS) - .resteasyClient(new ResteasyClientBuilderImpl().connectionTTL(2, TimeUnit.SECONDS) - .hostnameVerification(ResteasyClientBuilder.HostnameVerificationPolicy.ANY) - .connectionPoolSize(settings.getConnectionPoolSize()) - .disableTrustManager() - .build()) - .build(); - - } - - - public Keycloak getAdminClient() { - - return adminClient; - } - -} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeyCloakSettings.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeyCloakSettings.java deleted file mode 100644 index 241a9cd3c..000000000 --- a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeyCloakSettings.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.iqser.red.keycloak.commons; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -import lombok.Data; - -@Data -@ConfigurationProperties("commons.keycloak") -public class KeyCloakSettings { - - private String serverUrl; - private String realm; - private String applicationClientId; - private String clientId; - private String clientSecret; - private String issuer; - private String rolePrefix = "RED_"; - private int connectionPoolSize = 10; - private boolean scmEnabled; - -} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeycloakSecurity.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeycloakSecurity.java deleted file mode 100644 index c82653400..000000000 --- a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeycloakSecurity.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.iqser.red.keycloak.commons; - -import java.util.Optional; -import java.util.function.Function; - -import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; -import org.keycloak.representations.AccessToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; - -import lombok.experimental.UtilityClass; -import lombok.extern.slf4j.Slf4j; - -/** - * Collection of helpful functions to easily access information about an authenticated user. - */ -@Slf4j -@UtilityClass -public class KeycloakSecurity { - - /** - * Determines the unique identifier for the currently logged in user. - * - * @return The unique user identifier. Never {@code null}. - */ - public String getUserId() { - - Authentication auth = SecurityContextHolder.getContext().getAuthentication(); - if (auth == null) { - return "anonymousUser"; - } - return auth.getName(); - } - - - public Optional getRealm(){ - return getToken(t -> { - String issuer = t.getIssuer(); - String realm = issuer.substring(issuer.lastIndexOf('/') + 1); - log.info(realm); - return realm; - }); - } - - - public Optional getToken(Function function) { - Authentication auth = SecurityContextHolder.getContext().getAuthentication(); - if (!(auth instanceof KeycloakAuthenticationToken)) { - return Optional.empty(); - } - - KeycloakAuthenticationToken keycloakAuth = (KeycloakAuthenticationToken) auth; - return Optional.ofNullable(function.apply(keycloakAuth.getAccount().getKeycloakSecurityContext().getToken())); - } - -} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeycloakSecurityService.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeycloakSecurityService.java deleted file mode 100644 index 17580dc7e..000000000 --- a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeycloakSecurityService.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.iqser.red.keycloak.commons; - -import org.springframework.stereotype.Service; - -@Service -public class KeycloakSecurityService { - - /** - * Determines the unique identifier for the currently logged in user. - * - * @return The unique user identifier. Never {@code null}. - */ - public String getUserId() { - - return KeycloakSecurity.getUserId(); - } - -} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/RealmService.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/RealmService.java deleted file mode 100644 index b00d46c63..000000000 --- a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/RealmService.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.iqser.red.keycloak.commons; - -import org.keycloak.admin.client.resource.RealmResource; -import org.springframework.stereotype.Service; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@RequiredArgsConstructor -@Slf4j -public class RealmService { - - private final KeyCloakAdminClientService keycloak; - - public RealmResource realm(String tenantId) { - - return keycloak.getAdminClient().realm(tenantId); - } - -} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/UserListingService.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/UserListingService.java deleted file mode 100644 index 7cfa830ce..000000000 --- a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/UserListingService.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.iqser.red.keycloak.commons; - -import static com.iqser.red.keycloak.commons.DefaultKeyCloakCommonsConfiguration.USERS_CACHE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_ADMIN_ROLE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_MANAGER_ROLE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_USER_ADMIN_ROLE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_USER_ROLE; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import org.keycloak.representations.idm.UserRepresentation; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.retry.support.RetryTemplate; -import org.springframework.stereotype.Service; - -import com.iqser.red.keycloak.commons.model.User; -import com.iqser.red.keycloak.commons.roles.ApplicationRoles; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -@RequiredArgsConstructor -public class UserListingService { - - private final RealmService realmService; - private final RetryTemplate retryTemplate = RetryTemplate.builder().maxAttempts(3).exponentialBackoff(1000, 2, 5000).build(); - - - @Cacheable(value = USERS_CACHE, key = "#tenantId") - public List getAllUsers(String tenantId) { - - return retryTemplate.execute(context -> { - - var realm = realmService.realm(tenantId); - List allUsers = realm.users().search(null, 0, 500); - - Map> usersByRole = new HashMap<>(); - if(!allUsers.isEmpty()) { - var realmRoles = realm.roles().list().stream().map(r -> r.getName().toUpperCase()).collect(Collectors.toSet()); - for (var role : ApplicationRoles.ROLE_DATA.keySet()) { - if(realmRoles.contains(role)) { - Set users = realm.roles().get(role).getRoleUserMembers(0, 500); - usersByRole.put(role, users.stream().map(UserRepresentation::getId).collect(Collectors.toSet())); - } - } - } - - return compactUsers(allUsers, usersByRole); - - }); - - } - - - private List compactUsers(List allUsers, Map> usersByRole) { - - List users = new ArrayList<>(); - - for (var userRepresentation : allUsers) { - var user = convertBasicUser(userRepresentation); - for (var entry : usersByRole.entrySet()) { - if (entry.getValue().contains(user.getUserId())) { - user.getRoles().add(entry.getKey()); - } - } - users.add(user); - } - - users.forEach(user -> { - if (user.getRoles().contains(RED_MANAGER_ROLE)) { - user.getRoles().add(RED_USER_ROLE); - } - if (user.getRoles().contains(RED_ADMIN_ROLE)) { - user.getRoles().add(RED_USER_ADMIN_ROLE); - } - }); - - return users; - } - - - public User convertBasicUser(UserRepresentation userRepresentation) { - - return User.builder() - .email(userRepresentation.getEmail()) - .username(userRepresentation.getUsername()) - .firstName(userRepresentation.getFirstName()) - .lastName(userRepresentation.getLastName()) - .userId(userRepresentation.getId()) - .isActive(userRepresentation.isEnabled()) - .build(); - } - -} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/roles/ApplicationRoles.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/roles/ApplicationRoles.java deleted file mode 100644 index e07164db5..000000000 --- a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/roles/ApplicationRoles.java +++ /dev/null @@ -1,259 +0,0 @@ -package com.iqser.red.keycloak.commons.roles; - -import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_COMMENT; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_DICTIONARY_ENTRY; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_DOSSIER_DICTIONARY_ENTRY; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_UPDATE_DICTIONARY_TYPE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_UPDATE_DOSSIER; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_UPDATE_DOSSIER_DICTIONARY_TYPE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.ARCHIVE_DOSSIER; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.CONVERT_HIGHLIGHTS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.CREATE_TENANT; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_COMMENT; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DICTIONARY_ENTRY; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DICTIONARY_TYPE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DOSSIER; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DOSSIER_DICTIONARY_ENTRY; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DOSSIER_DICTIONARY_TYPE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_FILE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_HIGHLIGHTS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_IMPORTED_REDACTIONS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_MANUAL_REDACTION; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_REPORT_TEMPLATE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DEPLOYMENT_INFO; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DOWNLOAD_ANNOTATED_FILE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DOWNLOAD_ORIGINAL_FILE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DOWNLOAD_REDACTED_FILE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DOWNLOAD_REDACTION_PREVIEW_FILE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DOWNLOAD_REPORT_TEMPLATE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DO_MANUAL_REDACTION; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.EXCLUDE_INCLUDE_FILE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.EXCLUDE_INCLUDE_PAGES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.GET_HIGHLIGHTS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.GET_REPORT_TEMPLATES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.GET_RSS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.GET_TENANTS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.MANAGE_ACL_PERMISSIONS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.MANAGE_USER_PREFERENCES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.MANAGE_VIEWED_PAGES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.PROCESS_DOWNLOAD; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.PROCESS_MANUAL_REDACTION_REQUEST; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.PROCESS_TEXT_HIGHLIGHTS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_ALL_USERS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_APP_CONFIG; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_COLORS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DICTIONARY_TYPES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DIGITAL_SIGNATURE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_ATTRIBUTES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_ATTRIBUTES_CONFIG; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_STATUS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_TEMPLATES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOWNLOAD_STATUS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_FILE_ATTRIBUTES_CONFIG; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_FILE_STATUS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_GENERAL_CONFIGURATION; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_LEGAL_BASIS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_LICENSE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_LICENSE_REPORT; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_MANUAL_REDACTIONS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_NOTIFICATIONS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_REDACTION_LOG; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_RULES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_SMTP_CONFIGURATION; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_USERS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_VERSIONS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_WATERMARK; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.REANALYZE_DOSSIER; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.REANALYZE_FILE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.REINDEX; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.REQUEST_MANUAL_REDACTION; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.ROTATE_PAGE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.SEARCH; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.SEARCH_AUDIT_LOG; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.SET_REVIEWER; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.SET_STATUS_APPROVED; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.SET_STATUS_UNDER_APPROVAL; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.UNARCHIVE_DOSSIER; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPDATE_LICENSE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPDATE_MY_PROFILE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPDATE_NOTIFICATIONS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPLOAD_FILE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPLOAD_REPORT_TEMPLATE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_APP_CONFIG; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_COLORS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DIGITAL_SIGNATURE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DOSSIER_ATTRIBUTES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DOSSIER_ATTRIBUTES_CONFIG; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DOSSIER_STATUS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DOSSIER_TEMPLATES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_FILE_ATTRIBUTES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_FILE_ATTRIBUTES_CONFIG; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_GENERAL_CONFIGURATION; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_LEGAL_BASIS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_RULES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_SMTP_CONFIGURATION; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_USERS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_WATERMARK; - -import java.util.Collection; -import java.util.Map; -import java.util.Set; - -import com.google.common.collect.Sets; - -public final class ApplicationRoles { - - public static final String RED_USER_ROLE = "RED_USER"; - public static final String RED_MANAGER_ROLE = "RED_MANAGER"; - public static final String RED_ADMIN_ROLE = "RED_ADMIN"; - public static final String RED_USER_ADMIN_ROLE = "RED_USER_ADMIN"; - - public static final Set RED_ROLES = Sets.newHashSet(RED_USER_ROLE, RED_MANAGER_ROLE, RED_ADMIN_ROLE, RED_USER_ADMIN_ROLE); - - public static final Set UNMAPPED_ACTION_ROLES = Sets.newHashSet(UNARCHIVE_DOSSIER, UPDATE_LICENSE, GET_RSS); - - public static final Set RED_USER_ACTION_ROLES = Sets.newHashSet(ADD_COMMENT, - READ_LICENSE, - READ_APP_CONFIG, - READ_DOSSIER_STATUS, - ADD_DOSSIER_DICTIONARY_ENTRY, - DO_MANUAL_REDACTION, - ADD_UPDATE_DOSSIER_DICTIONARY_TYPE, - DELETE_COMMENT, - DELETE_DOSSIER_DICTIONARY_ENTRY, - DELETE_DOSSIER_DICTIONARY_TYPE, - DELETE_FILE, - DELETE_MANUAL_REDACTION, - DOWNLOAD_ANNOTATED_FILE, - DOWNLOAD_ORIGINAL_FILE, - DOWNLOAD_REDACTED_FILE, - DOWNLOAD_REDACTION_PREVIEW_FILE, - DOWNLOAD_REPORT_TEMPLATE, - EXCLUDE_INCLUDE_FILE, - EXCLUDE_INCLUDE_PAGES, - GET_REPORT_TEMPLATES, - MANAGE_USER_PREFERENCES, - MANAGE_VIEWED_PAGES, - PROCESS_DOWNLOAD, - PROCESS_MANUAL_REDACTION_REQUEST, - READ_COLORS, - READ_DICTIONARY_TYPES, - READ_DIGITAL_SIGNATURE, - READ_DOSSIER, - READ_DOSSIER_ATTRIBUTES, - READ_DOSSIER_ATTRIBUTES_CONFIG, - READ_DOSSIER_TEMPLATES, - READ_DOWNLOAD_STATUS, - READ_FILE_ATTRIBUTES_CONFIG, - READ_FILE_STATUS, - READ_GENERAL_CONFIGURATION, - READ_LEGAL_BASIS, - READ_MANUAL_REDACTIONS, - READ_NOTIFICATIONS, - READ_REDACTION_LOG, - READ_RULES, - READ_USERS, - READ_VERSIONS, - READ_WATERMARK, - REANALYZE_DOSSIER, - REANALYZE_FILE, - REQUEST_MANUAL_REDACTION, - ROTATE_PAGE, - SEARCH, - SEARCH_AUDIT_LOG, - SET_REVIEWER, - SET_STATUS_APPROVED, - SET_STATUS_UNDER_APPROVAL, - UPDATE_MY_PROFILE, - UPDATE_NOTIFICATIONS, - UPLOAD_FILE, - WRITE_FILE_ATTRIBUTES, - PROCESS_TEXT_HIGHLIGHTS, - GET_HIGHLIGHTS, - CONVERT_HIGHLIGHTS, - DELETE_HIGHLIGHTS, - DELETE_IMPORTED_REDACTIONS); - - public static final Set RED_ADMIN_ACTION_ROLES = Sets.newHashSet(ADD_DICTIONARY_ENTRY, - ADD_UPDATE_DICTIONARY_TYPE, - WRITE_DOSSIER_STATUS, - READ_DOSSIER_STATUS, - DELETE_DICTIONARY_ENTRY, - DELETE_DICTIONARY_TYPE, - DELETE_REPORT_TEMPLATE, - DOWNLOAD_REPORT_TEMPLATE, - GET_REPORT_TEMPLATES, - MANAGE_USER_PREFERENCES, - READ_COLORS, - READ_DICTIONARY_TYPES, - READ_DIGITAL_SIGNATURE, - READ_DOSSIER_ATTRIBUTES, - READ_DOSSIER_ATTRIBUTES_CONFIG, - READ_DOSSIER_TEMPLATES, - READ_FILE_ATTRIBUTES_CONFIG, - READ_LEGAL_BASIS, - READ_LICENSE_REPORT, - READ_NOTIFICATIONS, - READ_RULES, - READ_SMTP_CONFIGURATION, - READ_VERSIONS, - READ_WATERMARK, - REINDEX, - SEARCH_AUDIT_LOG, - UPDATE_NOTIFICATIONS, - UPLOAD_REPORT_TEMPLATE, - WRITE_COLORS, - WRITE_DIGITAL_SIGNATURE, - WRITE_DOSSIER_ATTRIBUTES_CONFIG, - WRITE_DOSSIER_TEMPLATES, - WRITE_FILE_ATTRIBUTES_CONFIG, - WRITE_GENERAL_CONFIGURATION, - WRITE_LEGAL_BASIS, - WRITE_RULES, - WRITE_SMTP_CONFIGURATION, - WRITE_WATERMARK, - WRITE_APP_CONFIG, - MANAGE_ACL_PERMISSIONS, - CREATE_TENANT, - GET_TENANTS, - DEPLOYMENT_INFO); - - public static final Set RED_MANAGER_ACTION_ROLES = Sets.newHashSet(ADD_UPDATE_DOSSIER, ARCHIVE_DOSSIER, DELETE_DOSSIER, WRITE_DOSSIER_ATTRIBUTES); - - public static final Set RED_USER_ADMIN_ACTION_ROLES = Sets.newHashSet(MANAGE_USER_PREFERENCES, - READ_ALL_USERS, - READ_DOSSIER, - READ_APP_CONFIG, - READ_GENERAL_CONFIGURATION, - READ_GENERAL_CONFIGURATION, - READ_NOTIFICATIONS, - READ_USERS, - UPDATE_MY_PROFILE, - UPDATE_NOTIFICATIONS, - WRITE_USERS, - READ_LICENSE); - - public static final Map> ROLE_DATA = Map.of(RED_USER_ROLE, - RED_USER_ACTION_ROLES, - RED_MANAGER_ROLE, - RED_MANAGER_ACTION_ROLES, - RED_ADMIN_ROLE, - RED_ADMIN_ACTION_ROLES, - RED_USER_ADMIN_ROLE, - RED_USER_ADMIN_ACTION_ROLES); - - - private ApplicationRoles() {} - - - public static void validateRoles(Collection roles) { - - for (String role : roles) { - if (!ROLE_DATA.containsKey(role)) { - throw new IllegalArgumentException("Invalid Role: " + role); - } - } - } - -} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedBearerTokenRequestAuthenticator.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedBearerTokenRequestAuthenticator.java deleted file mode 100644 index d233efc12..000000000 --- a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedBearerTokenRequestAuthenticator.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.iqser.red.keycloak.commons.security; - -import javax.security.cert.X509Certificate; - -import org.keycloak.adapters.BearerTokenRequestAuthenticator; -import org.keycloak.adapters.KeycloakDeployment; -import org.keycloak.adapters.OIDCAuthenticationError; -import org.keycloak.adapters.spi.AuthOutcome; -import org.keycloak.adapters.spi.HttpFacade; -import org.keycloak.common.VerificationException; -import org.keycloak.jose.jws.JWSInput; -import org.keycloak.jose.jws.JWSInputException; - -public class RedBearerTokenRequestAuthenticator extends BearerTokenRequestAuthenticator { - - private final String issuerUrl; - - - public RedBearerTokenRequestAuthenticator(KeycloakDeployment deployment, String issuerUrl) { - - super(deployment); - this.issuerUrl = issuerUrl; - } - - - // This is the exact method copied from BearerTokenRequestAuthenticator but with a custom Token Verifier. - @Override - protected AuthOutcome authenticateToken(HttpFacade exchange, String tokenString) { - - this.log.debug("Verifying access_token"); - if (this.log.isTraceEnabled()) { - try { - JWSInput jwsInput = new JWSInput(tokenString); - String wireString = jwsInput.getWireString(); - this.log.tracef("\taccess_token: %s", wireString.substring(0, wireString.lastIndexOf(".")) + ".signature"); - } catch (JWSInputException var8) { - this.log.debugf(var8, "Failed to parse access_token: %s", tokenString); - } - } - - try { - this.token = RedTokenVerifier.verifyToken(tokenString, this.deployment, issuerUrl); - } catch (VerificationException var7) { - this.log.debug("Failed to verify token"); - this.challenge = this.challengeResponse(exchange, OIDCAuthenticationError.Reason.INVALID_TOKEN, "invalid_token", var7.getMessage()); - return AuthOutcome.FAILED; - } - - if (this.token.getIssuedAt() < this.deployment.getNotBefore()) { - this.log.debug("Stale token"); - this.challenge = this.challengeResponse(exchange, OIDCAuthenticationError.Reason.STALE_TOKEN, "invalid_token", "Stale token"); - return AuthOutcome.FAILED; - } else { - boolean verifyCaller = false; - if (this.deployment.isUseResourceRoleMappings()) { - verifyCaller = this.token.isVerifyCaller(this.deployment.getResourceName()); - } else { - verifyCaller = this.token.isVerifyCaller(); - } - - this.surrogate = null; - if (verifyCaller) { - if (this.token.getTrustedCertificates() == null || this.token.getTrustedCertificates().isEmpty()) { - this.log.warn("No trusted certificates in token"); - this.challenge = this.clientCertChallenge(); - return AuthOutcome.FAILED; - } - - X509Certificate[] chain = new X509Certificate[0]; - - try { - chain = exchange.getCertificateChain(); - } catch (Exception var6) { - log.debug(var6); - } - - if (chain == null || chain.length == 0) { - this.log.warn("No certificates provided by undertow to verify the caller"); - this.challenge = this.clientCertChallenge(); - return AuthOutcome.FAILED; - } - - this.surrogate = chain[0].getSubjectDN().getName(); - } - - this.log.debug("successful authorized"); - return AuthOutcome.AUTHENTICATED; - } - } - -} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedQueryParameterTokenRequestAuthenticator.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedQueryParameterTokenRequestAuthenticator.java deleted file mode 100644 index cc5c37e27..000000000 --- a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedQueryParameterTokenRequestAuthenticator.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.iqser.red.keycloak.commons.security; - -import javax.security.cert.X509Certificate; - -import org.keycloak.adapters.KeycloakDeployment; -import org.keycloak.adapters.OIDCAuthenticationError; -import org.keycloak.adapters.QueryParameterTokenRequestAuthenticator; -import org.keycloak.adapters.spi.AuthOutcome; -import org.keycloak.adapters.spi.HttpFacade; -import org.keycloak.common.VerificationException; -import org.keycloak.jose.jws.JWSInput; -import org.keycloak.jose.jws.JWSInputException; - -public class RedQueryParameterTokenRequestAuthenticator extends QueryParameterTokenRequestAuthenticator { - - private final String issuerUrl; - - - public RedQueryParameterTokenRequestAuthenticator(KeycloakDeployment deployment, String issuerUrl) { - - super(deployment); - this.issuerUrl = issuerUrl; - } - - - // This is the exact method copied from BearerTokenRequestAuthenticator but with a custom Token Verifier. - @Override - protected AuthOutcome authenticateToken(HttpFacade exchange, String tokenString) { - - this.log.debug("Verifying access_token"); - if (this.log.isTraceEnabled()) { - try { - JWSInput jwsInput = new JWSInput(tokenString); - String wireString = jwsInput.getWireString(); - this.log.tracef("\taccess_token: %s", wireString.substring(0, wireString.lastIndexOf(".")) + ".signature"); - } catch (JWSInputException var8) { - this.log.debugf(var8, "Failed to parse access_token: %s", tokenString); - } - } - - try { - this.token = RedTokenVerifier.verifyToken(tokenString, this.deployment, issuerUrl); - } catch (VerificationException var7) { - this.log.debug("Failed to verify token"); - this.challenge = this.challengeResponse(exchange, OIDCAuthenticationError.Reason.INVALID_TOKEN, "invalid_token", var7.getMessage()); - return AuthOutcome.FAILED; - } - - if (this.token.getIssuedAt() < this.deployment.getNotBefore()) { - this.log.debug("Stale token"); - this.challenge = this.challengeResponse(exchange, OIDCAuthenticationError.Reason.STALE_TOKEN, "invalid_token", "Stale token"); - return AuthOutcome.FAILED; - } else { - boolean verifyCaller = false; - if (this.deployment.isUseResourceRoleMappings()) { - verifyCaller = this.token.isVerifyCaller(this.deployment.getResourceName()); - } else { - verifyCaller = this.token.isVerifyCaller(); - } - - this.surrogate = null; - if (verifyCaller) { - if (this.token.getTrustedCertificates() == null || this.token.getTrustedCertificates().isEmpty()) { - this.log.warn("No trusted certificates in token"); - this.challenge = this.clientCertChallenge(); - return AuthOutcome.FAILED; - } - - X509Certificate[] chain = new X509Certificate[0]; - - try { - chain = exchange.getCertificateChain(); - } catch (Exception var6) { - log.debug(var6); - } - - if (chain == null || chain.length == 0) { - this.log.warn("No certificates provided by undertow to verify the caller"); - this.challenge = this.clientCertChallenge(); - return AuthOutcome.FAILED; - } - - this.surrogate = chain[0].getSubjectDN().getName(); - } - - this.log.debug("successful authorized"); - return AuthOutcome.AUTHENTICATED; - } - } - -} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedTokenVerifier.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedTokenVerifier.java deleted file mode 100644 index 4c8697306..000000000 --- a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedTokenVerifier.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.iqser.red.keycloak.commons.security; - -import static org.keycloak.TokenVerifier.IS_ACTIVE; -import static org.keycloak.TokenVerifier.SUBJECT_EXISTS_CHECK; - -import java.security.PublicKey; - -import org.apache.commons.lang3.StringUtils; -import org.keycloak.TokenVerifier; -import org.keycloak.adapters.KeycloakDeployment; -import org.keycloak.adapters.rotation.PublicKeyLocator; -import org.keycloak.common.VerificationException; -import org.keycloak.representations.AccessToken; - -import lombok.experimental.UtilityClass; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@UtilityClass -public class RedTokenVerifier { - - public AccessToken verifyToken(String tokenString, KeycloakDeployment deployment, String issuerUrl) throws VerificationException { - - TokenVerifier tokenVerifier = createVerifier(tokenString, deployment, issuerUrl); - if (deployment.isVerifyTokenAudience()) { - tokenVerifier.audience(deployment.getResourceName()); - } - - return tokenVerifier.verify().getToken(); - } - - - private TokenVerifier createVerifier(String tokenString, KeycloakDeployment deployment, String issuerUrl) throws VerificationException { - - TokenVerifier tokenVerifier = TokenVerifier.create(tokenString, AccessToken.class) - .withChecks(SUBJECT_EXISTS_CHECK, IS_ACTIVE, new TokenVerifier.TokenTypeCheck("bearer"), new IssuerCheck(issuerUrl)); - - String kid = tokenVerifier.getHeader().getKeyId(); - PublicKey publicKey = getPublicKey(kid, deployment); - tokenVerifier.publicKey(publicKey); - return tokenVerifier; - } - - - private PublicKey getPublicKey(String kid, KeycloakDeployment deployment) throws VerificationException { - - PublicKeyLocator pkLocator = deployment.getPublicKeyLocator(); - PublicKey publicKey = pkLocator.getPublicKey(kid, deployment); - if (publicKey == null) { - log.debug("Didn't find publicKey for kid: {}", kid); - throw new VerificationException("Didn't find publicKey for specified kid"); - } else { - return publicKey; - } - } - - - @Slf4j - public static class IssuerCheck implements TokenVerifier.Predicate { - - private final String issuerUrl; - - - public IssuerCheck(String issuerUrl) { - - this.issuerUrl = issuerUrl; - } - - - public boolean test(AccessToken t) throws VerificationException { - - if (StringUtils.isEmpty(this.issuerUrl)) { - log.debug("Issuer Not Set, skipping verification"); - return true; - } else if (!this.issuerUrl.equalsIgnoreCase(t.getIssuer())) { - var message = "Invalid token issuer. Expected '" + this.issuerUrl + "', but was '" + t.getIssuer() + "'"; - log.debug(message); - throw new VerificationException(message); - } else { - log.debug("Issuer Verification Successful"); - return true; - } - } - - } - -} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/SecuredKeyCloakConfiguration.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/SecuredKeyCloakConfiguration.java deleted file mode 100644 index de5dd6133..000000000 --- a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/SecuredKeyCloakConfiguration.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.iqser.red.keycloak.commons.security; - -import javax.servlet.http.HttpServletRequest; - -import org.keycloak.adapters.AdapterTokenStore; -import org.keycloak.adapters.BearerTokenRequestAuthenticator; -import org.keycloak.adapters.KeycloakDeployment; -import org.keycloak.adapters.QueryParameterTokenRequestAuthenticator; -import org.keycloak.adapters.RequestAuthenticator; -import org.keycloak.adapters.spi.HttpFacade; -import org.keycloak.adapters.springboot.KeycloakBaseSpringBootConfiguration; -import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver; -import org.keycloak.adapters.springsecurity.KeycloakConfiguration; -import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider; -import org.keycloak.adapters.springsecurity.authentication.SpringSecurityRequestAuthenticator; -import org.keycloak.adapters.springsecurity.authentication.SpringSecurityRequestAuthenticatorFactory; -import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter; -import org.keycloak.adapters.springsecurity.filter.KeycloakAuthenticationProcessingFilter; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.builders.WebSecurity; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper; -import org.springframework.security.web.authentication.HttpStatusEntryPoint; -import org.springframework.security.web.authentication.session.NullAuthenticatedSessionStrategy; -import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy; - -import com.iqser.red.keycloak.commons.KeyCloakSettings; - -import lombok.RequiredArgsConstructor; - -@ConditionalOnProperty(value = "keycloak.enabled", havingValue = "true") -@RequiredArgsConstructor -@KeycloakConfiguration -@EnableConfigurationProperties(KeyCloakSettings.class) -@Import(KeycloakSpringBootConfigResolver.class) -public class SecuredKeyCloakConfiguration extends KeycloakWebSecurityConfigurerAdapter { - - private final KeyCloakSettings keyCloakSettings; - - - @Bean - public KeycloakBaseSpringBootConfiguration keycloakBaseSpringBootConfiguration() { - - return new KeycloakBaseSpringBootConfiguration(); - } - - - // Submits the KeycloakAuthenticationProvider to the AuthenticationManager - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) { - - KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider(); - SimpleAuthorityMapper simpleAuthorityMapper = new SimpleAuthorityMapper(); - simpleAuthorityMapper.setPrefix(""); - keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(simpleAuthorityMapper); - auth.authenticationProvider(keycloakAuthenticationProvider); - } - - - @Override - public void configure(WebSecurity web) { - - web.ignoring() - .antMatchers("/actuator/health/**", - "/redaction-gateway-v1/async/download/with-ott/**", - "/redaction-gateway-v1/docs/**", - "/redaction-gateway-v1/docs", - "/redaction-gateway-v1/tenants/simple", - "/redaction-gateway-v1", - "/internal-api/**"); - - web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**"); - } - - - @Bean - @Primary - @Override - protected KeycloakAuthenticationProcessingFilter keycloakAuthenticationProcessingFilter() throws Exception { - - KeycloakAuthenticationProcessingFilter filter = new KeycloakAuthenticationProcessingFilter(authenticationManagerBean()); - - filter.setSessionAuthenticationStrategy(sessionAuthenticationStrategy()); - filter.setRequestAuthenticatorFactory(new SpringSecurityRequestAuthenticatorFactory() { - - @Override - public RequestAuthenticator createRequestAuthenticator(HttpFacade facade, - HttpServletRequest request, - KeycloakDeployment deployment, - AdapterTokenStore tokenStore, - int sslRedirectPort) { - - return new SpringSecurityRequestAuthenticator(facade, request, deployment, tokenStore, sslRedirectPort) { - - @Override - protected BearerTokenRequestAuthenticator createBearerTokenAuthenticator() { - - return new RedBearerTokenRequestAuthenticator(deployment, keyCloakSettings.getIssuer()); - } - - - @Override - protected QueryParameterTokenRequestAuthenticator createQueryParameterTokenRequestAuthenticator() { - - return new RedQueryParameterTokenRequestAuthenticator(deployment, keyCloakSettings.getIssuer()); - } - }; - } - }); - - return filter; - } - - - // Specifies the session authentication strategy - @Bean - @Override - protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { - - return new NullAuthenticatedSessionStrategy(); - } - - - @Override - protected void configure(HttpSecurity http) throws Exception { - - super.configure(http); - - http.anonymous().disable(); - - http.authorizeRequests().anyRequest().authenticated(); - - http.csrf().disable(); - - http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); - - http.exceptionHandling().authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED)); - - } - -} diff --git a/persistence-service-v1/keycloak-commons/src/test/java/com/iqser/red/keycloak/commons/IdentityTest.java b/persistence-service-v1/keycloak-commons/src/test/java/com/iqser/red/keycloak/commons/IdentityTest.java deleted file mode 100644 index fbb8a0d17..000000000 --- a/persistence-service-v1/keycloak-commons/src/test/java/com/iqser/red/keycloak/commons/IdentityTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.iqser.red.keycloak.commons; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.jupiter.api.Test; - -public class IdentityTest { - - @Test - public void mockTest() { - - int i = 1; - assertThat(i).isEqualTo(1); - } - -} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/pom.xml b/persistence-service-v1/persistence-service-external-api-impl-v1/pom.xml index 1b35b5eed..9ee0c3019 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/pom.xml +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/pom.xml @@ -24,10 +24,6 @@ ${project.version} - - org.springdoc - springdoc-openapi-ui - diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/PersistenceServiceExternalApiConfiguration.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/PersistenceServiceExternalApiConfiguration.java index f95d1fd57..b766c71fb 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/PersistenceServiceExternalApiConfiguration.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/PersistenceServiceExternalApiConfiguration.java @@ -1,27 +1,11 @@ package com.iqser.red.persistence.service.v1.external.api.impl; -import org.keycloak.adapters.KeycloakConfigResolver; -import org.keycloak.adapters.springboot.KeycloakSpringBootProperties; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.persistence.service.v1.external.api.impl.multitenacy.HeaderBasedKeycloakRealmResolver; @Configuration @ComponentScan public class PersistenceServiceExternalApiConfiguration { - @Bean - public KeycloakConfigResolver keycloakConfigResolver(ObjectMapper objectMapper) { - return new HeaderBasedKeycloakRealmResolver(objectMapper); - } - - @Autowired - public void setKeycloakSpringBootProperties(final KeycloakSpringBootProperties keycloakProperties) { - HeaderBasedKeycloakRealmResolver.setAdapterConfig(keycloakProperties); - } - } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ApplicationConfigurationController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ApplicationConfigurationController.java index 5fa62e395..46fa872cc 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ApplicationConfigurationController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ApplicationConfigurationController.java @@ -1,9 +1,8 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_APP_CONFIG; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_APP_CONFIG; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_APP_CONFIG; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_APP_CONFIG; -import javax.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.RequestBody; @@ -15,6 +14,7 @@ import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConv import com.iqser.red.service.persistence.service.v1.api.external.resource.ApplicationConfigurationResource; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.ApplicationConfig; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/AuditController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/AuditController.java index b1674e124..fc5c4148b 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/AuditController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/AuditController.java @@ -1,6 +1,6 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.SEARCH_AUDIT_LOG; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.SEARCH_AUDIT_LOG; import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; import java.util.List; @@ -9,7 +9,7 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.service.v1.api.external.resource.AuditResource; import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/CustomPermissionMappingController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/CustomPermissionMappingController.java index e136ef769..7501e0732 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/CustomPermissionMappingController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/CustomPermissionMappingController.java @@ -1,6 +1,6 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.MANAGE_ACL_PERMISSIONS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.MANAGE_ACL_PERMISSIONS; import java.util.List; import java.util.Set; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DictionaryController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DictionaryController.java index 9bfbb9a1e..7726f2c90 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DictionaryController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DictionaryController.java @@ -10,7 +10,6 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import javax.validation.Valid; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpHeaders; @@ -24,7 +23,7 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.service.DictionaryService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; @@ -44,6 +43,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import feign.FeignException; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DigitalSignatureController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DigitalSignatureController.java index 305b628da..69fdf691b 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DigitalSignatureController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DigitalSignatureController.java @@ -1,7 +1,7 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DIGITAL_SIGNATURE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DIGITAL_SIGNATURE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DIGITAL_SIGNATURE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_DIGITAL_SIGNATURE; import java.nio.charset.StandardCharsets; @@ -10,7 +10,7 @@ import org.springframework.util.Base64Utils; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DigitalSignatureEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DigitalSignatureKmsEntity; import com.iqser.red.service.persistence.management.v1.processor.service.DigitalSignatureKmsService; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierAttributesController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierAttributesController.java index db854f671..fbe041996 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierAttributesController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierAttributesController.java @@ -1,10 +1,10 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_ATTRIBUTES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_ATTRIBUTES_CONFIG; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DOSSIER_ATTRIBUTES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DOSSIER_ATTRIBUTES_CONFIG; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_FILE_ATTRIBUTES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER_ATTRIBUTES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER_ATTRIBUTES_CONFIG; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_DOSSIER_ATTRIBUTES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_DOSSIER_ATTRIBUTES_CONFIG; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_FILE_ATTRIBUTES; import java.util.List; import java.util.Map; @@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierAttributeConfigEntity; import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; import com.iqser.red.service.persistence.management.v1.processor.service.DossierAttributesManagementService; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierController.java index 1769a0cab..f3d31656c 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierController.java @@ -1,10 +1,10 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_UPDATE_DOSSIER; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.ARCHIVE_DOSSIER; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DOSSIER; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.UNARCHIVE_DOSSIER; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ADD_UPDATE_DOSSIER; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ARCHIVE_DOSSIER; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_DOSSIER; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.UNARCHIVE_DOSSIER; import java.time.OffsetDateTime; import java.util.ArrayList; @@ -33,15 +33,15 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.google.common.collect.Lists; -import com.iqser.red.keycloak.commons.KeycloakSecurity; -import com.iqser.red.keycloak.commons.model.User; -import com.iqser.red.keycloak.commons.roles.ApplicationRoles; +import com.iqser.red.service.persistence.management.v1.processor.service.users.model.User; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles; import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.UserService; +import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierResource; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierStatsController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierStatsController.java index cad6c04b0..6ec2b86af 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierStatsController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierStatsController.java @@ -1,6 +1,6 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER; import java.util.List; import java.util.Set; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierStatusController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierStatusController.java index 412904122..ebab0a2ad 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierStatusController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierStatusController.java @@ -1,12 +1,12 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_STATUS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DOSSIER_STATUS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER_STATUS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_DOSSIER_STATUS; import java.util.List; import java.util.stream.Collectors; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PathVariable; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateController.java index 566225450..2858db5f3 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateController.java @@ -1,9 +1,7 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_TEMPLATES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DOSSIER_TEMPLATES; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_MANAGER_ROLE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_USER_ROLE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER_TEMPLATES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_DOSSIER_TEMPLATES; import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; import java.io.IOException; @@ -14,10 +12,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import javax.annotation.PostConstruct; - import org.apache.commons.lang3.StringUtils; -import org.keycloak.representations.idm.RoleRepresentation; import org.springframework.beans.BeanUtils; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PathVariable; @@ -27,15 +22,14 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import com.iqser.red.keycloak.commons.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateManagementService; import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateStatsService; -import com.iqser.red.service.persistence.management.v1.processor.service.UserService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierTemplateResource; import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; @@ -49,6 +43,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ExportDownloadRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import feign.FeignException; import io.micrometer.core.annotation.Timed; @@ -115,26 +110,23 @@ public class DossierTemplateController implements DossierTemplateResource { @Override - @PreAuthorize("hasAuthority('" + READ_DOSSIER_TEMPLATES + "')") + @PreAuthorize("hasAuthority('" + WRITE_DOSSIER_TEMPLATES + "')") public void deleteDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { String userId = KeycloakSecurity.getUserId(); - if (!userService.checkUserHasAdminRole(userId)) { - throw new BadRequestException("Only admin user can delete the dossier template"); - } List dossiers = dossierManagementService.getAllDossiers(true, false); - if (dossiers != null && dossiers.stream().anyMatch(dossier -> dossier.getDossierTemplateId().equals(dossierTemplateId))) { - throw new ConflictException("Can not delete dossier template because there are dossiers based on it"); - } + if (dossiers != null && dossiers.stream().anyMatch(dossier -> dossier.getDossierTemplateId().equals(dossierTemplateId))) { + throw new ConflictException("Can not delete dossier template because there are dossiers based on it"); + } - dossierTemplateManagementService.deleteDossierTemplate(dossierTemplateId, userId); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Dossier Template has been deleted") - .build()); + dossierTemplateManagementService.deleteDossierTemplate(dossierTemplateId, userId); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Dossier Template has been deleted") + .build()); } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateStatsController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateStatsController.java index c7f9c886f..05b1cfa18 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateStatsController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateStatsController.java @@ -1,6 +1,6 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_TEMPLATES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER_TEMPLATES; import java.util.List; import java.util.Set; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DownloadController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DownloadController.java index 2b071854b..0a43bea64 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DownloadController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DownloadController.java @@ -1,7 +1,7 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.PROCESS_DOWNLOAD; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOWNLOAD_STATUS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.PROCESS_DOWNLOAD; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOWNLOAD_STATUS; import static com.iqser.red.service.persistence.management.v1.processor.utils.DownloadBufferUtils.fileProxyStreamForDownload; import java.util.List; @@ -24,7 +24,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.iqser.red.persistence.service.v1.external.api.impl.service.OneTimeTokenService; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; @@ -34,7 +34,6 @@ import com.iqser.red.service.persistence.management.v1.processor.service.Downloa import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.external.resource.DownloadResource; import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; import com.iqser.red.service.persistence.service.v1.api.shared.model.DownloadResponse; @@ -51,6 +50,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.download.Do import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatus; import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadWithOptionRequest; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ExternalControllerAdvice.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ExternalControllerAdvice.java index ad1a2ab9f..c3de89a09 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ExternalControllerAdvice.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ExternalControllerAdvice.java @@ -30,9 +30,7 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.BadRe import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; -import com.iqser.red.service.persistence.management.v1.processor.service.job.AutomaticAnalysisJob; -import com.iqser.red.service.persistence.management.v1.processor.service.job.SyncUserPermissionsJob; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileAttributesController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileAttributesController.java index 08d977a65..f19db25c9 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileAttributesController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileAttributesController.java @@ -1,8 +1,8 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_FILE_ATTRIBUTES_CONFIG; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_FILE_ATTRIBUTES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_FILE_ATTRIBUTES_CONFIG; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_FILE_ATTRIBUTES_CONFIG; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_FILE_ATTRIBUTES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_FILE_ATTRIBUTES_CONFIG; import java.util.List; import java.util.Map; @@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileManagementController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileManagementController.java index 37ab4ef81..93c599b97 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileManagementController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileManagementController.java @@ -1,8 +1,8 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_FILE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DOWNLOAD_ORIGINAL_FILE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.ROTATE_PAGE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_FILE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DOWNLOAD_ORIGINAL_FILE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ROTATE_PAGE; import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; import static com.iqser.red.service.persistence.management.v1.processor.utils.DownloadBufferUtils.fileProxyStreamForDownload; @@ -24,7 +24,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.google.common.collect.Sets; -import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.client.pdftronredactionservice.PDFTronClient; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException; @@ -35,7 +35,6 @@ import com.iqser.red.service.persistence.management.v1.processor.service.Reanaly import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.external.resource.FileManagementResource; import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; import com.iqser.red.service.persistence.service.v1.api.shared.model.RotatePagesRequest; @@ -43,6 +42,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.Audit import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; import feign.FeignException; import io.micrometer.core.annotation.Timed; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/GeneralSettingsController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/GeneralSettingsController.java deleted file mode 100644 index 3005f1920..000000000 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/GeneralSettingsController.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.iqser.red.persistence.service.v1.external.api.impl.controller; - -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_GENERAL_CONFIGURATION; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_GENERAL_CONFIGURATION; - -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.persistence.management.v1.processor.service.GeneralConfigurationService; -import com.iqser.red.service.persistence.service.v1.api.external.resource.GeneralSettingsResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.GeneralConfigurationModel; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@RestController -@RequiredArgsConstructor -public class GeneralSettingsController implements GeneralSettingsResource { - - private final GeneralConfigurationService generalConfigurationService; - - - @Override - @PreAuthorize("hasAuthority('" + READ_GENERAL_CONFIGURATION + "')") - public GeneralConfigurationModel getGeneralConfigurations() { - - return generalConfigurationService.getGeneralConfigurations(); - } - - - @Override - @PreAuthorize("hasAuthority('" + WRITE_GENERAL_CONFIGURATION + "')") - public void updateGeneralConfigurations(@RequestBody GeneralConfigurationModel generalConfigurationModel) { - - generalConfigurationService.updateGeneralConfigurations(generalConfigurationModel); - } - -} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/HighlightsController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/HighlightsController.java index aeeca3c3e..0344eb89e 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/HighlightsController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/HighlightsController.java @@ -1,9 +1,9 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.CONVERT_HIGHLIGHTS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_HIGHLIGHTS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_IMPORTED_REDACTIONS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.GET_HIGHLIGHTS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.CONVERT_HIGHLIGHTS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_HIGHLIGHTS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_IMPORTED_REDACTIONS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.GET_HIGHLIGHTS; import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; import static com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils.getStorageId; @@ -19,12 +19,12 @@ import com.iqser.red.service.pdftron.redaction.v1.api.model.highlights.TextHighl import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; import com.iqser.red.service.persistence.management.v1.processor.service.ReanalysisService; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.external.resource.HighlightsResource; import com.iqser.red.service.persistence.service.v1.api.shared.model.AnnotationIds; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.DeleteImportedRedactionsRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; import feign.FeignException; import lombok.RequiredArgsConstructor; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LegalBasisMappingController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LegalBasisMappingController.java index 69c9cc4aa..be114b3d8 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LegalBasisMappingController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LegalBasisMappingController.java @@ -1,18 +1,18 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_LEGAL_BASIS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_LEGAL_BASIS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_LEGAL_BASIS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_LEGAL_BASIS; import java.util.List; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.LegalBasisMappingPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseController.java index 186e31416..b284cc556 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseController.java @@ -1,7 +1,7 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_LICENSE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPDATE_LICENSE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_LICENSE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.UPDATE_LICENSE; import java.time.OffsetDateTime; import java.time.temporal.ChronoUnit; @@ -11,13 +11,13 @@ import org.springframework.core.env.Environment; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.external.resource.LicenseResource; import com.iqser.red.service.persistence.service.v1.api.shared.model.license.Feature; import com.iqser.red.service.persistence.service.v1.api.shared.model.license.FeatureType; import com.iqser.red.service.persistence.service.v1.api.shared.model.license.License; import com.iqser.red.service.persistence.service.v1.api.shared.model.license.RedactionLicenseModel; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseReportController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseReportController.java index d55efcd2c..12ff2536f 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseReportController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseReportController.java @@ -1,12 +1,12 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_LICENSE_REPORT; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_LICENSE_REPORT; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.service.LicenseReportService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.service.v1.api.external.resource.LicenseReportResource; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java index 792a507fd..800681b31 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java @@ -1,12 +1,6 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_COMMENT; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_COMMENT; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_MANUAL_REDACTION; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DO_MANUAL_REDACTION; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.PROCESS_MANUAL_REDACTION_REQUEST; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_MANUAL_REDACTIONS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.REQUEST_MANUAL_REDACTION; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.*; import static com.iqser.red.service.persistence.management.v1.processor.utils.TypeIdUtils.toTypeId; import java.util.ArrayList; @@ -22,7 +16,6 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.keycloak.commons.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; @@ -51,6 +44,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.Lega import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ManualRedactionWrapper; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RemoveRedactionRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ResizeRedactionRequest; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/NotificationController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/NotificationController.java index 444fb4547..7dce245d0 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/NotificationController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/NotificationController.java @@ -1,7 +1,7 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_NOTIFICATIONS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPDATE_NOTIFICATIONS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_NOTIFICATIONS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.UPDATE_NOTIFICATIONS; import java.time.OffsetDateTime; import java.util.List; @@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; import com.iqser.red.service.persistence.service.v1.api.external.resource.NotificationResource; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/NotificationPreferencesController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/NotificationPreferencesController.java index 4cb20a8fa..4eaa9c0cd 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/NotificationPreferencesController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/NotificationPreferencesController.java @@ -1,7 +1,7 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_NOTIFICATIONS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPDATE_NOTIFICATIONS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_NOTIFICATIONS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.UPDATE_NOTIFICATIONS; import org.springframework.security.access.prepost.PreAuthorize; @@ -9,7 +9,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPreferencesPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; import com.iqser.red.service.persistence.service.v1.api.external.resource.NotificationPreferencesResource; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RSSController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RSSController.java index 6c525ed3c..46167cafe 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RSSController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RSSController.java @@ -1,6 +1,6 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.GET_RSS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.GET_RSS; import java.util.Map; import java.util.stream.Collectors; @@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice.RssReportClient; import com.iqser.red.service.persistence.management.v1.processor.service.ComponentOverrideService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReanalysisController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReanalysisController.java index 1fb50fa56..ef8afeb59 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReanalysisController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReanalysisController.java @@ -1,6 +1,6 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.*; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.*; import java.util.ArrayList; import java.util.HashSet; @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.google.common.collect.Sets; -import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RedactionLogController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RedactionLogController.java index 60cf7abe9..f7c2fc52a 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RedactionLogController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RedactionLogController.java @@ -1,6 +1,6 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_REDACTION_LOG; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_REDACTION_LOG; import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; import java.io.ByteArrayOutputStream; @@ -22,7 +22,6 @@ import org.springframework.web.bind.annotation.RestController; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; import com.iqser.red.service.persistence.management.v1.processor.service.RedactionLogService; import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.external.resource.RedactionLogResource; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.FilteredRedactionLogRequest; @@ -30,6 +29,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlo import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; import feign.FeignException; import lombok.RequiredArgsConstructor; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReportTemplateController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReportTemplateController.java index 9fe322eb2..aab701f12 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReportTemplateController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReportTemplateController.java @@ -1,9 +1,9 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_REPORT_TEMPLATE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DOWNLOAD_REPORT_TEMPLATE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.GET_REPORT_TEMPLATES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPLOAD_REPORT_TEMPLATE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_REPORT_TEMPLATE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DOWNLOAD_REPORT_TEMPLATE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.GET_REPORT_TEMPLATES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.UPLOAD_REPORT_TEMPLATE; import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; import java.io.ByteArrayInputStream; @@ -27,7 +27,7 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice.PlaceholderClient; import com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice.ReportTemplatePlaceholderClient; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; @@ -39,7 +39,6 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.external.resource.ReportTemplateResource; import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; import com.iqser.red.service.persistence.service.v1.api.shared.model.PlaceholdersResponse; @@ -50,6 +49,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplateUploadRequest; import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; import feign.FeignException; import lombok.RequiredArgsConstructor; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java index 1088f8a77..4911f0fd3 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java @@ -1,7 +1,7 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_RULES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_RULES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_RULES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_RULES; import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; import java.io.ByteArrayInputStream; @@ -21,7 +21,6 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import com.iqser.red.keycloak.commons.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.RedactionClient; import com.iqser.red.service.persistence.management.v1.processor.exception.FileUploadException; import com.iqser.red.service.persistence.management.v1.processor.exception.InvalidRulesException; @@ -31,6 +30,7 @@ import com.iqser.red.service.persistence.service.v1.api.external.resource.RulesR import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; import com.iqser.red.service.persistence.service.v1.api.shared.model.Rules; import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import feign.FeignException; import lombok.RequiredArgsConstructor; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/SMTPConfigurationController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/SMTPConfigurationController.java deleted file mode 100644 index a86de7098..000000000 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/SMTPConfigurationController.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.iqser.red.persistence.service.v1.external.api.impl.controller; - -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_SMTP_CONFIGURATION; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_SMTP_CONFIGURATION; - -import java.util.HashMap; -import java.util.Map; - -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.keycloak.commons.KeycloakSecurity; -import com.iqser.red.keycloak.commons.RealmService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.SMTPConfigurationService; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; -import com.iqser.red.service.persistence.service.v1.api.external.resource.SMTPConfigurationResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.SMTPConfiguration; - -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@RestController -@RequiredArgsConstructor -public class SMTPConfigurationController implements SMTPConfigurationResource { - - private final RealmService realmService; - - private final SMTPConfigurationService smtpConfigurationService; - - private final ObjectMapper objectMapper; - - - @Override - @PreAuthorize("hasAuthority('" + READ_SMTP_CONFIGURATION + "')") - public SMTPConfiguration getCurrentSMTPConfiguration() { - - return smtpConfigurationService.getCurrentSMTPConfiguration(true); - - } - - - @Override - @PreAuthorize("hasAuthority('" + WRITE_SMTP_CONFIGURATION + "')") - public void updateSMTPConfiguration(@RequestBody SMTPConfiguration smtpConfigurationModel) { - - smtpConfigurationService.updateSMTPConfiguration(smtpConfigurationModel); - - // also update in KC - var realmRepresentation = realmService.realm(TenantContext.getTenantId()).toRepresentation(); - var propertiesMap = convertSMTPConfigurationModelToMap(smtpConfigurationModel); - realmRepresentation.setSmtpServer(propertiesMap); - realmService.realm(TenantContext.getTenantId()).update(realmRepresentation); - - } - - - private Map convertSMTPConfigurationModelToMap(SMTPConfiguration smtpConfigurationModel) { - - Map propertiesMap = objectMapper.convertValue(smtpConfigurationModel, Map.class); - Map stringPropertiesMap = new HashMap<>(); - propertiesMap.forEach((key, value) -> { - if (value != null) { - stringPropertiesMap.put(key, value.toString()); - } else { - stringPropertiesMap.put(key, ""); - } - }); - return stringPropertiesMap; - } - - - @SneakyThrows - @Override - @PreAuthorize("hasAuthority('" + WRITE_SMTP_CONFIGURATION + "')") - public void testSMTPConfiguration(@RequestBody SMTPConfiguration smtpConfigurationModel) { - - var currentUserEmail = realmService.realm(TenantContext.getTenantId()).users().get(KeycloakSecurity.getUserId()).toRepresentation().getEmail(); - - smtpConfigurationService.testSMTPConfiguration(currentUserEmail, smtpConfigurationModel); - } - - - @Override - @PreAuthorize("hasAuthority('" + WRITE_SMTP_CONFIGURATION + "')") - public void clearSMTPConfiguration() { - - smtpConfigurationService.deleteConfiguration(); - - // also update in KC - var realmRepresentation = realmService.realm(TenantContext.getTenantId()).toRepresentation(); - realmRepresentation.setSmtpServer(new HashMap<>()); - realmService.realm(TenantContext.getTenantId()).update(realmRepresentation); - - } - -} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/SearchController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/SearchController.java index fbc8590ea..6072699d5 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/SearchController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/SearchController.java @@ -1,6 +1,6 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.SEARCH; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.SEARCH; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.RequestBody; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusController.java index 4d14dcced..9d1bac410 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusController.java @@ -1,6 +1,6 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.*; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.*; import java.time.OffsetDateTime; import java.util.ArrayList; @@ -11,7 +11,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.access.prepost.PreAuthorize; @@ -20,15 +20,14 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.keycloak.commons.KeycloakSecurity; -import com.iqser.red.keycloak.commons.roles.ApplicationRoles; +import com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles; import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException; import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.UserService; +import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; import com.iqser.red.service.persistence.service.v1.api.external.resource.StatusResource; @@ -42,6 +41,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationType; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusReportController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusReportController.java index 14be2625e..547832cdb 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusReportController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusReportController.java @@ -1,7 +1,7 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER; import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; import java.io.ByteArrayInputStream; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/TenantsController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/TenantsController.java deleted file mode 100644 index d28a3efdc..000000000 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/TenantsController.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.iqser.red.persistence.service.v1.external.api.impl.controller; - -import static com.iqser.red.keycloak.commons.roles.ActionRoles.*; - -import java.util.List; - -import javax.validation.Valid; - -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.management.v1.processor.service.DeploymentKeyService; -import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; -import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; -import com.iqser.red.service.persistence.service.v1.api.external.resource.TenantsResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.SimpleTenantResponse; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantResponse; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class TenantsController implements TenantsResource { - - private final TenantManagementService tenantManagementService; - private final DeploymentKeyService deploymentKeyService; - - - @PreAuthorize("hasAuthority('" + CREATE_TENANT + "')") - public void createTenant(@Valid @RequestBody TenantRequest tenantRequest) { - - try { - tenantManagementService.createTenant(tenantRequest); - } catch (IllegalArgumentException e) { - throw new BadRequestException(e.getMessage(), e); - } - } - - - @PreAuthorize("hasAuthority('" + GET_TENANTS + "')") - public List getTenants() { - - return tenantManagementService.getTenants(); - } - - - @PreAuthorize("hasAuthority('" + DEPLOYMENT_INFO + "')") - public JSONPrimitive getDeploymentKey(@PathVariable(TENANT_ID_PARAM) String tenantId) { - - return JSONPrimitive.of(deploymentKeyService.getDeploymentKey(tenantId)); - } - - - public List getSimpleTenants() { - return MagicConverter.convert(tenantManagementService.getTenants(), SimpleTenantResponse.class); - } - -} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UploadController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UploadController.java index e0af8b37d..e61dac23d 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UploadController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UploadController.java @@ -21,7 +21,7 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.iqser.red.service.pdftron.redaction.v1.api.model.ByteContentDocument; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserController.java deleted file mode 100644 index 7ee004aa7..000000000 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserController.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.iqser.red.persistence.service.v1.external.api.impl.controller; - -import static com.iqser.red.keycloak.commons.roles.ActionRoles.*; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.validation.Valid; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.keycloak.commons.KeyCloakSettings; -import com.iqser.red.keycloak.commons.model.User; -import com.iqser.red.service.persistence.management.v1.processor.exception.AuthenticationFailedException; -import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; -import com.iqser.red.service.persistence.management.v1.processor.service.UserService; -import com.iqser.red.service.persistence.service.v1.api.external.resource.UserResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateUserRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.ResetPasswordRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateMyProfileRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateProfileRequest; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@RestController -@RequiredArgsConstructor -public class UserController implements UserResource { - - private final UserService userService; - private final KeyCloakSettings keyCloakSettings; - - - @Override - @PreAuthorize("hasAuthority('" + READ_USERS + "')") - public List getAllRedUsers(@RequestParam(name = REFRESH_CACHE_PARAM, defaultValue = "false", required = false) boolean bypassCache) { - - if (bypassCache) { - userService.evictUserCache(); - } - - return userService.getAllUsers() - .stream() - .filter(user -> user.getRoles().stream().anyMatch(r -> r.startsWith(keyCloakSettings.getRolePrefix()))) - .collect(Collectors.toList()); - } - - - @Override - @PreAuthorize("hasAuthority('" + READ_ALL_USERS + "')") - public List getAllUsers(@RequestParam(name = REFRESH_CACHE_PARAM, defaultValue = "false", required = false) boolean bypassCache) { - - if (bypassCache) { - userService.evictUserCache(); - } - - return userService.getAllUsers(); - } - - - @Override - @PreAuthorize("hasAuthority('" + WRITE_USERS + "')") - public void updateProfile(@PathVariable(USER_ID) String userId, @RequestBody UpdateProfileRequest updateProfileRequest) { - - this.userService.updateProfile(userId, updateProfileRequest); - } - - - @Override - @PreAuthorize("hasAuthority('" + UPDATE_MY_PROFILE + "')") - public void updateMyProfile(@Valid @RequestBody UpdateMyProfileRequest updateProfileRequest) { - - try { - this.userService.updateMyProfile(updateProfileRequest); - } catch (AuthenticationFailedException e) { - throw new BadRequestException(e.getMessage(), e); - } - } - - - @Override - @PreAuthorize("hasAuthority('" + WRITE_USERS + "')") - public void deleteUsers(@RequestParam(USER_ID) List userIds) { - - userIds.forEach(this::deleteUser); - } - - - @Override - @PreAuthorize("hasAuthority('" + WRITE_USERS + "')") - public void deleteUser(@PathVariable(USER_ID) String userId) { - - userService.deleteUser(userId); - } - - - @Override - @PreAuthorize("hasAuthority('" + WRITE_USERS + "')") - public User createUser(@RequestBody CreateUserRequest user) { - - return this.userService.createUser(user); - } - - - @Override - @PreAuthorize("hasAuthority('" + READ_USERS + "')") - public User getUserById(@PathVariable(USER_ID) String userId) { - - if (StringUtils.isEmpty(userId)) { - throw new BadRequestException("The userId should not be empty."); - } - return userService.getUserById(userId).orElseThrow(() -> new NotFoundException("User not found")); - } - - - @Override - @PreAuthorize("hasAuthority('" + WRITE_USERS + "')") - public void setRoles(@PathVariable(USER_ID) String userId, @RequestBody List roles) { - - userService.setRoles(userId, roles); - } - - - @Override - @PreAuthorize("hasAuthority('" + WRITE_USERS + "')") - public void resetPassword(@PathVariable(USER_ID) String userId, @RequestBody ResetPasswordRequest resetPasswordRequest) { - - this.userService.resetPassword(userId, resetPasswordRequest); - } - - - @Override - @PreAuthorize("hasAuthority('" + WRITE_USERS + "')") - public User activateProfile(@PathVariable(USER_ID) String userId, @RequestParam(IS_ACTIVE_PARAM) boolean isActive) { - - return this.userService.activateProfile(userId, isActive); - - } - -} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserPreferenceController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserPreferenceController.java deleted file mode 100644 index ea90a1fdf..000000000 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserPreferenceController.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.iqser.red.persistence.service.v1.external.api.impl.controller; - -import static com.iqser.red.keycloak.commons.roles.ActionRoles.MANAGE_USER_PREFERENCES; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.keycloak.commons.KeycloakSecurity; -import com.iqser.red.service.persistence.management.v1.processor.service.UserService; -import com.iqser.red.service.persistence.service.v1.api.external.resource.UserPreferenceResource; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class UserPreferenceController implements UserPreferenceResource { - - private final UserService userService; - - - @Override - @PreAuthorize("hasAuthority('" + MANAGE_USER_PREFERENCES + "')") - public Map> getAllUserAttributes() { - - String userId = KeycloakSecurity.getUserId(); - - var userResource = userService.getUserResource(userId); - var userRepresentation = userResource.toRepresentation(); - - var attributes = userRepresentation.getAttributes(); - - return attributes != null ? attributes : new HashMap<>(); - } - - - @Override - @PreAuthorize("hasAuthority('" + MANAGE_USER_PREFERENCES + "')") - public void setAttribute(@PathVariable(KEY_PARAMETER_NAME) String key, List values) { - - String userId = KeycloakSecurity.getUserId(); - - var userResource = userService.getUserResource(userId); - var userRepresentation = userResource.toRepresentation(); - - var attributes = userRepresentation.getAttributes(); - if (attributes == null) { - attributes = new HashMap<>(); - } - attributes.put(key, values); - userRepresentation.setAttributes(attributes); - - userResource.update(userRepresentation); - - } - - - @Override - @PreAuthorize("hasAuthority('" + MANAGE_USER_PREFERENCES + "')") - public void deleteAttribute(@PathVariable(KEY_PARAMETER_NAME) String key) { - - String userId = KeycloakSecurity.getUserId(); - - var userResource = userService.getUserResource(userId); - var userRepresentation = userResource.toRepresentation(); - if (userRepresentation.getAttributes() != null) { - userRepresentation.getAttributes().remove(key); - } - - userResource.update(userRepresentation); - - } - -} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/VersionsController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/VersionsController.java index c3426cec8..293c542f7 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/VersionsController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/VersionsController.java @@ -1,6 +1,6 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_VERSIONS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_VERSIONS; import java.util.HashMap; import java.util.List; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ViewedPagesController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ViewedPagesController.java index c1df7d4cc..630cddc41 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ViewedPagesController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ViewedPagesController.java @@ -1,6 +1,6 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.MANAGE_VIEWED_PAGES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.MANAGE_VIEWED_PAGES; import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; import java.util.HashSet; @@ -10,7 +10,6 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.keycloak.commons.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; import com.iqser.red.service.persistence.management.v1.processor.service.AnalysisFlagsCalculationService; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; @@ -20,6 +19,7 @@ import com.iqser.red.service.persistence.service.v1.api.external.resource.Viewed import com.iqser.red.service.persistence.service.v1.api.shared.model.ViewedPages; import com.iqser.red.service.persistence.service.v1.api.shared.model.ViewedPagesRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ViewedPage; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import feign.FeignException; import lombok.RequiredArgsConstructor; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/WatermarkController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/WatermarkController.java index 8e08410ff..5f436f8e1 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/WatermarkController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/WatermarkController.java @@ -1,7 +1,7 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_WATERMARK; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_WATERMARK; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_WATERMARK; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_WATERMARK; import java.util.List; @@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/interceptors/DownloadTempFileInterceptor.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/interceptors/DownloadTempFileInterceptor.java index 5446970b2..36a8736c3 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/interceptors/DownloadTempFileInterceptor.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/interceptors/DownloadTempFileInterceptor.java @@ -4,12 +4,11 @@ import static com.iqser.red.service.persistence.management.v1.processor.utils.Do import java.io.File; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; @Component diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/multitenacy/HeaderBasedKeycloakRealmResolver.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/multitenacy/HeaderBasedKeycloakRealmResolver.java deleted file mode 100644 index 2df18be82..000000000 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/multitenacy/HeaderBasedKeycloakRealmResolver.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.iqser.red.persistence.service.v1.external.api.impl.multitenacy; - -import static com.iqser.red.service.persistence.management.v1.processor.multitenancy.TenantInterceptor.TENANT_HEADER_NAME; - -import java.util.Base64; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.keycloak.adapters.KeycloakConfigResolver; -import org.keycloak.adapters.KeycloakDeployment; -import org.keycloak.adapters.KeycloakDeploymentBuilder; -import org.keycloak.adapters.OIDCHttpFacade; -import org.keycloak.adapters.spi.HttpFacade; -import org.keycloak.representations.adapters.config.AdapterConfig; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; - -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@RequiredArgsConstructor -public class HeaderBasedKeycloakRealmResolver implements KeycloakConfigResolver { - - private final Map cache = new ConcurrentHashMap<>(); - - @Setter - private static AdapterConfig adapterConfig; - - private KeycloakDeployment defaultDeployment; - private final ObjectMapper objectMapper; - - - @Override - public KeycloakDeployment resolve(OIDCHttpFacade.Request request) { - - String tenant = getHeader(request, TENANT_HEADER_NAME); - - if (tenant == null) { - // TODO always send as header and remove this. - tenant = getTenantFromBearerToken(request); - } - - if (tenant == null) { - if (defaultDeployment == null) { - defaultDeployment = KeycloakDeploymentBuilder.build(adapterConfig); - } - return defaultDeployment; - } - - return cache.computeIfAbsent(tenant, this::createKeyCloakDeployment); - } - - - // PMD marks this as unused, although it is clearly used. - // This seems to be a bug in PMD. - @SuppressWarnings("PMD.UnusedPrivateMethod") - @SneakyThrows - private String getTenantFromBearerToken(HttpFacade.Request request) { - - String authHeader = request.getHeader("Authorization"); - if (authHeader == null) { - return null; - } - String[] chunks = authHeader.split(" ")[1].split("\\."); - Base64.Decoder decoder = Base64.getUrlDecoder(); - - String payload = new String(decoder.decode(chunks[1])); - JsonNode actualObj = objectMapper.readTree(payload); - String issuer = actualObj.get("iss").asText(); - return issuer.substring(issuer.lastIndexOf('/') + 1); - } - - - private KeycloakDeployment createKeyCloakDeployment(String tenant) { - - var config = MagicConverter.convert(adapterConfig, AdapterConfig.class); - config.setRealm(tenant); - - return KeycloakDeploymentBuilder.build(config); - } - - - // PMD marks this as unused, although it is clearly used. - // This seems to be a bug in PMD. - @SuppressWarnings("PMD.UnusedPrivateMethod") - private String getHeader(HttpFacade.Request request, String headerName) { - - List values = request.getHeaders(headerName); - if (values == null || values.isEmpty()) { - return null; - } - return values.get(values.size() - 1); - } - -} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerAutoConfiguration.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerAutoConfiguration.java deleted file mode 100644 index 6cd3db109..000000000 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerAutoConfiguration.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.iqser.red.persistence.service.v1.external.api.impl.swagger; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties; -import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties; -import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType; -import org.springframework.boot.actuate.endpoint.ExposableEndpoint; -import org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver; -import org.springframework.boot.actuate.endpoint.web.EndpointMapping; -import org.springframework.boot.actuate.endpoint.web.EndpointMediaTypes; -import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint; -import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier; -import org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpointsSupplier; -import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier; -import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; -import org.springframework.util.StringUtils; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.CorsConfigurationSource; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; - -import io.swagger.v3.oas.annotations.OpenAPIDefinition; -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.security.OAuthFlow; -import io.swagger.v3.oas.models.security.OAuthFlows; -import io.swagger.v3.oas.models.security.SecurityRequirement; -import io.swagger.v3.oas.models.security.SecurityScheme; - -@OpenAPIDefinition -@Configuration -@EnableWebMvc -@EnableConfigurationProperties(SwaggerProperties.class) -@ConditionalOnProperty(value = "swagger.enabled", havingValue = "true") -public class SwaggerAutoConfiguration { - - private static final String TITLE = "API Documentation for Redaction Gateway"; - private static final String DESCRIPTION = "Description for redaction"; - private static final String VERSION = "1.0"; - private static final String OAUTH_NAME = "RED-OAUTH"; - private static final String PROTOCOL_URL_FORMAT = "/auth/realms//protocol/openid-connect"; - - - @Bean - public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier, - ServletEndpointsSupplier servletEndpointsSupplier, - ControllerEndpointsSupplier controllerEndpointsSupplier, - EndpointMediaTypes endpointMediaTypes, - CorsEndpointProperties corsProperties, - WebEndpointProperties webEndpointProperties, - Environment environment) { - - List> allEndpoints = new ArrayList<>(); - Collection webEndpoints = webEndpointsSupplier.getEndpoints(); - allEndpoints.addAll(webEndpoints); - allEndpoints.addAll(servletEndpointsSupplier.getEndpoints()); - allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints()); - String basePath = webEndpointProperties.getBasePath(); - EndpointMapping endpointMapping = new EndpointMapping(basePath); - boolean shouldRegisterLinksMapping = this.shouldRegisterLinksMapping(webEndpointProperties, environment, basePath); - return new WebMvcEndpointHandlerMapping(endpointMapping, - webEndpoints, - endpointMediaTypes, - corsProperties.toCorsConfiguration(), - new EndpointLinksResolver(allEndpoints, basePath), - shouldRegisterLinksMapping, - null); - } - - - private boolean shouldRegisterLinksMapping(WebEndpointProperties webEndpointProperties, Environment environment, String basePath) { - - return webEndpointProperties.getDiscovery().isEnabled() && (StringUtils.hasText(basePath) || ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT)); - } - - - @Bean - public CorsConfigurationSource corsConfigurationSource() { - - CorsConfiguration configuration = new CorsConfiguration(); - configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "HEAD")); - configuration.applyPermitDefaultValues(); - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - source.registerCorsConfiguration("/**", configuration); - return source; - } - - - @Bean - public OpenAPI customOpenApi() { - - return new OpenAPI().info(new Info().title(TITLE).version(VERSION).description(DESCRIPTION)) - .components(new Components().addSecuritySchemes(OAUTH_NAME, createOAuthScheme())) - .addSecurityItem(new SecurityRequirement().addList(OAUTH_NAME)); - } - - - private SecurityScheme createOAuthScheme() { - - OAuthFlows flows = createOAuthFlows(); - - return new SecurityScheme().type(SecurityScheme.Type.OAUTH2).flows(flows); - } - - - private OAuthFlows createOAuthFlows() { - - OAuthFlow flow = createAuthorizationCodeFlow(); - - return new OAuthFlows().authorizationCode(flow); - } - - - private OAuthFlow createAuthorizationCodeFlow() { - - return new OAuthFlow().authorizationUrl(PROTOCOL_URL_FORMAT + "/auth").tokenUrl(PROTOCOL_URL_FORMAT + "/token"); - } - -} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerCustomDocsController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerCustomDocsController.java deleted file mode 100644 index 62bd10bfc..000000000 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerCustomDocsController.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.iqser.red.persistence.service.v1.external.api.impl.swagger; - -import java.util.Locale; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; - -import org.springdoc.webmvc.api.OpenApiWebMvcResource; -import org.springdoc.webmvc.ui.SwaggerConfigResource; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.persistence.service.v1.api.external.resource.ExternalApi; - -import io.swagger.v3.oas.annotations.Operation; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; - -@RestController -@RequiredArgsConstructor -public class SwaggerCustomDocsController { - - private final OpenApiWebMvcResource openApiWebMvcResource; - - private final SwaggerConfigResource swaggerConfigResource; - - @Value("${springdoc.api-docs.path:#{T(org.springdoc.core.Constants).DEFAULT_API_DOCS_URL}}") - private String apiDocsUrl; - - - @SneakyThrows - @Operation(hidden = true) - @GetMapping(ExternalApi.BASE_PATH + "/docs/tenant") - public String getDocs(HttpServletRequest request, @RequestParam(value = "tenantId", required = false, defaultValue = "redaction") String tenantId) { - var response = openApiWebMvcResource.openapiJson(request, ExternalApi.BASE_PATH + "/docs/tenant", Locale.getDefault()); - return response.replace("", tenantId); - - } - - - @Operation(hidden = true) - @GetMapping(value = "/redaction-gateway-v1/docs/swagger-config", produces = MediaType.APPLICATION_JSON_VALUE) - public Map getSwaggerUiConfig(HttpServletRequest request) { - - var map = swaggerConfigResource.openapiJson(request); - map.put("url", apiDocsUrl); - return map; - } - -} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerHomeController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerHomeController.java deleted file mode 100644 index d863c0d7c..000000000 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerHomeController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.iqser.red.persistence.service.v1.external.api.impl.swagger; - -import java.io.IOException; - -import javax.annotation.PostConstruct; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Controller -@ConditionalOnProperty(value = "swagger.enabled", havingValue = "true") -public class SwaggerHomeController { - - @Value("${server.servlet.context-path:}") - private String contextPath; - - - @GetMapping({"/redaction-gateway-v1", "/","redaction-gateway-v1/docs"}) - public void home(HttpServletRequest request, HttpServletResponse response) throws IOException { - - response.sendRedirect(contextPath + "/redaction-gateway-v1/docs/swagger-ui"); - } - -} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerProperties.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerProperties.java deleted file mode 100644 index ec420e631..000000000 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerProperties.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.iqser.red.persistence.service.v1.external.api.impl.swagger; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import lombok.Data; - -@Data -@ConfigurationProperties("swagger") -public class SwaggerProperties { - - @JsonProperty("auth-server-url") - protected String authServerUrl = ""; - private boolean enabled; - private boolean securityEnabled; - private String defaultClientId; - -} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerTenantMvcConfigurer.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerTenantMvcConfigurer.java deleted file mode 100644 index 0a39a7aba..000000000 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerTenantMvcConfigurer.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.iqser.red.persistence.service.v1.external.api.impl.swagger; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.HandlerInterceptor; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -import com.iqser.red.service.persistence.service.v1.api.external.resource.ExternalApi; - -@Configuration -@EnableWebMvc -public class SwaggerTenantMvcConfigurer implements WebMvcConfigurer { - - @Value("${springdoc.api-docs.path:#{T(org.springdoc.core.Constants).DEFAULT_API_DOCS_URL}}") - private String path; - - - @Override - public void addInterceptors(InterceptorRegistry registry) { - - var cleanedUpPath = path.contains("?") ? path.substring(0, path.indexOf("?")) : path; - registry.addInterceptor(new DocsInterceptor()).addPathPatterns(cleanedUpPath); - } - - - public static class DocsInterceptor implements HandlerInterceptor { - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - - var query = ""; - if (!StringUtils.isBlank(request.getQueryString())) { - query = "?" + request.getQueryString(); - } - response.sendRedirect(ExternalApi.BASE_PATH + "/docs/tenant" + query); - return false; - } - - } - -} diff --git a/persistence-service-v1/persistence-service-external-api-v1/pom.xml b/persistence-service-v1/persistence-service-external-api-v1/pom.xml index 54aa3ed57..a2605d023 100644 --- a/persistence-service-v1/persistence-service-external-api-v1/pom.xml +++ b/persistence-service-v1/persistence-service-external-api-v1/pom.xml @@ -136,12 +136,6 @@ ${project.version} compile - - com.iqser.red.service - keycloak-commons - ${project.version} - compile - diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ApplicationConfigurationResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ApplicationConfigurationResource.java index a2b516b1e..152009c44 100644 --- a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ApplicationConfigurationResource.java +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ApplicationConfigurationResource.java @@ -1,6 +1,5 @@ package com.iqser.red.service.persistence.service.v1.api.external.resource; -import javax.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -15,6 +14,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; +import jakarta.validation.Valid; public interface ApplicationConfigurationResource { diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/GeneralSettingsResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/GeneralSettingsResource.java deleted file mode 100644 index 24f944806..000000000 --- a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/GeneralSettingsResource.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.external.resource; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.GeneralConfigurationModel; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; - -public interface GeneralSettingsResource { - - String SMTP_PATH = ExternalApi.BASE_PATH + "/configuration/general"; - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = SMTP_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Returns the current general Configuration.") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK.")}) - GeneralConfigurationModel getGeneralConfigurations(); - - - @ResponseStatus(value = HttpStatus.NO_CONTENT) - @PostMapping(value = SMTP_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Write General Configurations to KeyCloak") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "General Configuration updated successful."), @ApiResponse(responseCode = "400", description = "General Configuration update failed.")}) - void updateGeneralConfigurations(@RequestBody GeneralConfigurationModel generalConfigurationModel); - -} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/SMTPConfigurationResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/SMTPConfigurationResource.java deleted file mode 100644 index 2da24ed22..000000000 --- a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/SMTPConfigurationResource.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.external.resource; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.SMTPConfiguration; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; - -public interface SMTPConfigurationResource { - - String SMTP_PATH = ExternalApi.BASE_PATH + "/configuration/smtp"; - - String TEST_PATH = "/test"; - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = SMTP_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Returns the current SMTP Configuration.") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK."), @ApiResponse(responseCode = "404", description = "SMTP not configured.")}) - SMTPConfiguration getCurrentSMTPConfiguration(); - - - @ResponseStatus(value = HttpStatus.NO_CONTENT) - @PostMapping(value = SMTP_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Write SMTP Settings to KeyCloak") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "SMTP Configuration updated successful."), @ApiResponse(responseCode = "400", description = "SMTP update failed.")}) - void updateSMTPConfiguration(@RequestBody SMTPConfiguration smtpConfigurationModel); - - - @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = SMTP_PATH + TEST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Test SMTP Settings to KeyCloak") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "SMTP Configuration is valid."), @ApiResponse(responseCode = "400", description = "SMTP test failed.")}) - void testSMTPConfiguration(@RequestBody SMTPConfiguration smtpConfigurationModel); - - - @ResponseStatus(value = HttpStatus.NO_CONTENT) - @DeleteMapping(value = SMTP_PATH) - @Operation(summary = "Clear SMTP Settings to KeyCloak") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "SMTP Configuration has been cleared."), @ApiResponse(responseCode = "400", description = "Failed to clear SMTP Configuration.")}) - void clearSMTPConfiguration(); - -} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/TenantsResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/TenantsResource.java deleted file mode 100644 index 35de894da..000000000 --- a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/TenantsResource.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.external.resource; - -import java.util.List; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.SimpleTenantResponse; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantResponse; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; - -@ResponseStatus(value = HttpStatus.OK) -public interface TenantsResource { - - String TENANT_ID_PARAM = "tenantId"; - String TENANT_ID_PATH_PARAM = "/{" + TENANT_ID_PARAM + "}"; - - - @PostMapping(value = ExternalApi.BASE_PATH + "/tenants", consumes = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Creates a new Tenant", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) - void createTenant(@RequestBody TenantRequest tenant); - - - @GetMapping(value = ExternalApi.BASE_PATH + "/tenants", produces = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Gets all existing tenant", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) - List getTenants(); - - @GetMapping(value = ExternalApi.BASE_PATH + "/tenants/simple", produces = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Gets all existing tenant in a simplified format", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) - List getSimpleTenants(); - - - @GetMapping(value = ExternalApi.BASE_PATH + "/deploymentKey" + TENANT_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Returns the deployment key for a tenant", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) - JSONPrimitive getDeploymentKey(@PathVariable(TENANT_ID_PARAM) String tenantId); - -} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserPreferenceResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserPreferenceResource.java deleted file mode 100644 index de6dd61ab..000000000 --- a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserPreferenceResource.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.external.resource; - -import java.util.List; -import java.util.Map; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; - -public interface UserPreferenceResource { - - String PREFERENCES_PATH = ExternalApi.BASE_PATH + "/attributes"; - String KEY_PARAMETER_NAME = "key"; - String KEY_PATH_VARIABLE = "/{" + KEY_PARAMETER_NAME + "}"; - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = PREFERENCES_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Get User Attributes.", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) - Map> getAllUserAttributes(); - - - @ResponseStatus(HttpStatus.NO_CONTENT) - @PutMapping(value = PREFERENCES_PATH + KEY_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Store User Attribute by key.", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) - void setAttribute(@PathVariable(KEY_PARAMETER_NAME) String key, @RequestBody List values); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.NO_CONTENT) - @DeleteMapping(value = PREFERENCES_PATH + KEY_PATH_VARIABLE) - @Operation(summary = "Delete User Preferences by key.", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) - void deleteAttribute(@PathVariable(KEY_PARAMETER_NAME) String key); - -} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserResource.java deleted file mode 100644 index 218b6d80d..000000000 --- a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserResource.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.external.resource; - -import java.util.List; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.keycloak.commons.model.User; -import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateUserRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.ResetPasswordRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateMyProfileRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateProfileRequest; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; - -@ResponseStatus(value = HttpStatus.OK) -public interface UserResource { - - String USER_REST_PATH = ExternalApi.BASE_PATH + "/user"; - String RED_USER_REST_PATH = USER_REST_PATH + "/red"; - String UPDATE_USER_PROFILE_PATH = USER_REST_PATH + "/profile"; - String ACTIVATE_USER_PROFILE_PATH = UPDATE_USER_PROFILE_PATH + "/activate"; - String UPDATE_MY_USER_PROFILE_PATH = USER_REST_PATH + "/my-profile"; - String USER_ID = "userId"; - String USER_ID_PATH_VARIABLE = "/{" + USER_ID + "}"; - - String USER_ROLE_REST_PATH = USER_REST_PATH + USER_ID_PATH_VARIABLE + "/role"; - - String RESET_PASSWORD_PATH = USER_REST_PATH + USER_ID_PATH_VARIABLE + "/reset-password"; - - String REFRESH_CACHE_PARAM = "refreshCache"; - String IS_ACTIVE_PARAM = "isActive"; - - - @ResponseBody - @Operation(summary = "Gets the users who contain redaction roles.", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Invalid " + "offset or limit specified.")}) - @GetMapping(value = RED_USER_REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - List getAllRedUsers(@RequestParam(name = REFRESH_CACHE_PARAM, defaultValue = "false", required = false) boolean bypassCache); - - - @ResponseBody - @Operation(summary = "Gets all the users in realm with information of roles.", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Invalid " + "offset or limit specified.")}) - @GetMapping(value = USER_REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - List getAllUsers(@RequestParam(name = REFRESH_CACHE_PARAM, defaultValue = "false", required = false) boolean bypassCache); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.NO_CONTENT) - @Operation(summary = "Update your own user-profile.", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "400", description = "Failed to update profile, e-mail cannot be empty")}) - @PostMapping(value = UPDATE_USER_PROFILE_PATH + USER_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void updateProfile(@PathVariable(USER_ID) String userId, @RequestBody UpdateProfileRequest updateProfileRequest); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.NO_CONTENT) - @Operation(summary = "Update your own user-profile.", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "400", description = "Failed to update profile, e-mail cannot be empty")}) - @PostMapping(value = UPDATE_MY_USER_PROFILE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) - void updateMyProfile(@RequestBody UpdateMyProfileRequest updateProfileRequest); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.NO_CONTENT) - @Operation(summary = "Deletes given user", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "405", description = "Operation is not allowed."), @ApiResponse(responseCode = "409", description = "Conflict while deleting user.")}) - @DeleteMapping(value = USER_REST_PATH + USER_ID_PATH_VARIABLE) - void deleteUser(@PathVariable(USER_ID) String userId); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.NO_CONTENT) - @Operation(summary = "Deletes given users", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "405", description = "Operation is not allowed."), @ApiResponse(responseCode = "409", description = "Conflict while deleting user.")}) - @DeleteMapping(value = USER_REST_PATH) - void deleteUsers(@RequestParam(USER_ID) List userIds); - - - @ResponseBody - @Operation(summary = "Create a new user.", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Invalid Data."), @ApiResponse(responseCode = "409", description = "User already exists.")}) - @PostMapping(value = USER_REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - User createUser(@RequestBody CreateUserRequest user); - - - @ResponseBody - @Operation(summary = "Gets the user in realm with information of roles.", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "The " + "userId can not be found."), @ApiResponse(responseCode = "400", description = "The provided user id is empty or " + "null.")}) - @GetMapping(value = USER_REST_PATH + USER_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - User getUserById(@PathVariable(USER_ID) String userId); - - - @ResponseStatus(value = HttpStatus.NO_CONTENT) - @Operation(summary = "Add a role to users", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "No Content"), @ApiResponse(responseCode = "404", description = "The provided userId can not be found."), @ApiResponse(responseCode = "400", description = "One ore more roles are not valid.")}) - @PostMapping(value = USER_ROLE_REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) - void setRoles(@PathVariable(USER_ID) String userId, @RequestBody List roles); - - - @ResponseStatus(value = HttpStatus.NO_CONTENT) - @Operation(summary = "Reset a user's password", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "No Content"), @ApiResponse(responseCode = "404", description = "The provided userId can not be found.")}) - @PostMapping(value = RESET_PASSWORD_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) - void resetPassword(@PathVariable(USER_ID) String userId, @RequestBody ResetPasswordRequest resetPasswordRequest); - - - @ResponseBody - @Operation(summary = "Activate/ deactivate a user-profile.", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Failed to activate/deactivate profile")}) - @PostMapping(value = ACTIVATE_USER_PROFILE_PATH + USER_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - User activateProfile(@PathVariable(USER_ID) String userId, @RequestParam(IS_ACTIVE_PARAM) boolean isActive); - -} diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DossierInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DossierInternalController.java index 1788dba2d..686b4eae8 100644 --- a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DossierInternalController.java +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DossierInternalController.java @@ -2,7 +2,7 @@ package com.iqser.red.service.persistence.v1.internal.api.controller; import java.util.List; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/LegalBasisMappingInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/LegalBasisMappingInternalController.java index 0d0b43cf2..c6ea5a75f 100644 --- a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/LegalBasisMappingInternalController.java +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/LegalBasisMappingInternalController.java @@ -4,7 +4,7 @@ import static com.iqser.red.service.persistence.management.v1.processor.utils.Ma import java.util.List; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/TenantsInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/TenantsInternalController.java deleted file mode 100644 index ec78bf150..000000000 --- a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/TenantsInternalController.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.iqser.red.service.persistence.v1.internal.api.controller; - -import java.util.List; - -import javax.validation.Valid; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.management.v1.processor.service.DeploymentKeyService; -import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; -import com.iqser.red.service.persistence.service.v1.api.internal.resources.TenantsResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantResponse; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class TenantsInternalController implements TenantsResource { - - private final TenantManagementService tenantManagementService; - private final DeploymentKeyService deploymentKeyService; - - - public void createTenant(@Valid @RequestBody TenantRequest tenantRequest) { - - try { - tenantManagementService.createTenant(tenantRequest); - } catch (IllegalArgumentException e) { - throw new BadRequestException(e.getMessage(), e); - } - } - - - public List getTenants() { - - return tenantManagementService.getTenants(); - } - - - public TenantResponse getTenant(@PathVariable(TENANT_ID_PARAM) String tenantId) { - - return tenantManagementService.getTenant(tenantId); - } - - - public JSONPrimitive getDeploymentKey(@PathVariable(TENANT_ID_PARAM) String tenantId) { - - return JSONPrimitive.of(deploymentKeyService.getDeploymentKey(tenantId)); - } - -} diff --git a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/TenantsResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/TenantsResource.java deleted file mode 100644 index 158f862a2..000000000 --- a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/TenantsResource.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.internal.resources; - -import java.util.List; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantResponse; - -@ResponseStatus(value = HttpStatus.OK) -public interface TenantsResource { - - String TENANT_PATH = "/tenants"; - String TENANT_ID_PARAM = "tenantId"; - String TENANT_ID_PATH_PARAM = "/{" + TENANT_ID_PARAM + "}"; - - - @PostMapping(value = InternalApi.BASE_PATH + TENANT_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) - void createTenant(@RequestBody TenantRequest tenantRequest); - - - @GetMapping(value = InternalApi.BASE_PATH + TENANT_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - List getTenants(); - - - @GetMapping(value = InternalApi.BASE_PATH + TENANT_PATH + TENANT_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) - TenantResponse getTenant(@PathVariable(TENANT_ID_PARAM) String tenantId); - - - @GetMapping(value = InternalApi.BASE_PATH + "/deploymentKey" + TENANT_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) - JSONPrimitive getDeploymentKey(@PathVariable(TENANT_ID_PARAM) String tenantId); - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/pom.xml b/persistence-service-v1/persistence-service-processor-v1/pom.xml index 31bfe8fa0..938627ea9 100644 --- a/persistence-service-v1/persistence-service-processor-v1/pom.xml +++ b/persistence-service-v1/persistence-service-processor-v1/pom.xml @@ -16,12 +16,30 @@ 6.4.1 0.4.0 + 0.5.0 + 0.14.0 + 0.6.0 - - - + + com.knecon.fforesight + jobs-commons + ${jobs-commons.version} + + + + com.knecon.fforesight + keycloak-commons + ${keycloak-commons.version} + + + + com.knecon.fforesight + swagger-commons + ${swagger-commons.version} + + com.iqser.red.service pdftron-redaction-service-api-v1 @@ -146,11 +164,6 @@ org.springframework.boot spring-boot-starter-data-redis - - com.iqser.red.service - keycloak-commons - ${project.version} - com.iqser.red.commons @@ -216,11 +229,6 @@ spring-cloud-starter-openfeign - - org.springframework.boot - spring-boot-starter-quartz - - org.springframework.boot spring-boot-starter-amqp @@ -249,11 +257,6 @@ log4j-slf4j-impl test - - org.liquibase - liquibase-core - 4.3.1 - com.yannbriancon spring-hibernate-query-utils @@ -283,7 +286,6 @@ lombok.launch.AnnotationProcessorHider$AnnotationProcessor - com.dslplatform.json.processor.CompiledJsonAnnotationProcessor diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/PersistenceServiceProcessorConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/PersistenceServiceProcessorConfiguration.java index 580b42302..8b21d111d 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/PersistenceServiceProcessorConfiguration.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/PersistenceServiceProcessorConfiguration.java @@ -2,7 +2,9 @@ package com.iqser.red.service.persistence.management.v1.processor; import javax.sql.DataSource; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.support.PageJacksonModule; import org.springframework.cloud.openfeign.support.SortJacksonModule; @@ -11,6 +13,7 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.DependsOn; import org.springframework.context.annotation.Primary; +import org.springframework.core.env.Environment; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.retry.backoff.ExponentialBackOffPolicy; import org.springframework.retry.policy.SimpleRetryPolicy; @@ -20,11 +23,16 @@ import com.iqser.red.service.persistence.management.v1.processor.client.pdftronr import com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice.StatusReportClient; import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.RedactionClient; import com.iqser.red.service.persistence.management.v1.processor.client.searchservice.SearchClient; +import com.iqser.red.service.persistence.management.v1.processor.client.tenantusermanagementservice.UsersClient; import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; +import jakarta.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; + +@Slf4j @Configuration @ComponentScan -@EnableFeignClients(basePackageClasses = {PDFTronClient.class, StatusReportClient.class, SearchClient.class, RedactionClient.class}) +@EnableFeignClients(basePackageClasses = {PDFTronClient.class, StatusReportClient.class, SearchClient.class, RedactionClient.class, UsersClient.class}) public class PersistenceServiceProcessorConfiguration { public static final String TENANT_DATA_SOURCE_QUALIFIER = "multiTenantDataSource"; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/api/ICustomPermissionService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/api/ICustomPermissionService.java index 1a7c31e9a..7e27a0b2c 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/api/ICustomPermissionService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/api/ICustomPermissionService.java @@ -14,23 +14,22 @@ import org.springframework.security.acls.model.MutableAcl; import org.springframework.security.acls.model.MutableAclService; import org.springframework.transaction.annotation.Transactional; -import com.iqser.red.keycloak.commons.UserListingService; -import com.iqser.red.keycloak.commons.model.User; import com.iqser.red.service.persistence.management.v1.processor.acl.AbstractACLService; import com.iqser.red.service.persistence.management.v1.processor.acl.RedPermission; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.management.v1.processor.client.tenantusermanagementservice.UsersClient; +import com.iqser.red.service.persistence.management.v1.processor.service.users.model.User; import com.iqser.red.service.persistence.service.v1.api.shared.model.permission.CustomPermissionMappingModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.permission.CustomPermissionModel; public abstract class ICustomPermissionService extends AbstractACLService { - protected final UserListingService userListingService; + protected final UsersClient usersClient; - protected ICustomPermissionService(UserListingService userListingService, MutableAclService mutableAclService) { + protected ICustomPermissionService(UsersClient usersClient, MutableAclService mutableAclService) { super(mutableAclService); - this.userListingService = userListingService; + this.usersClient = usersClient; } @@ -109,7 +108,7 @@ public abstract class ICustomPermissionService exten private Set getUserIds() { - return userListingService.getAllUsers(TenantContext.getTenantId()).stream().map(User::getUserId).collect(Collectors.toSet()); + return usersClient.getAllUsers(true).stream().map(User::getUserId).collect(Collectors.toSet()); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/AccessObjectDossierObjectPermissionService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/AccessObjectDossierObjectPermissionService.java index b7c2058e8..26d09550a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/AccessObjectDossierObjectPermissionService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/AccessObjectDossierObjectPermissionService.java @@ -1,18 +1,15 @@ package com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier; -import java.util.ArrayList; import java.util.Collection; import java.util.Set; import java.util.stream.Collectors; import org.springframework.security.acls.model.MutableAclService; import org.springframework.stereotype.Service; - -import com.iqser.red.keycloak.commons.UserListingService; import com.iqser.red.service.persistence.management.v1.processor.acl.RedPermission; import com.iqser.red.service.persistence.management.v1.processor.acl.custom.api.ICustomPermissionService; +import com.iqser.red.service.persistence.management.v1.processor.client.tenantusermanagementservice.UsersClient; import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; @Service @@ -20,11 +17,11 @@ public class AccessObjectDossierObjectPermissionService extends ICustomPermissio private final DossierManagementService dossierManagementService; - public AccessObjectDossierObjectPermissionService(UserListingService userService, + public AccessObjectDossierObjectPermissionService(UsersClient usersClient, MutableAclService mutableAclService, DossierManagementService dossierManagementService) { - super(userService, mutableAclService); + super(usersClient, mutableAclService); this.dossierManagementService = dossierManagementService; } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/ViewObjectDossierObjectPermissionService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/ViewObjectDossierObjectPermissionService.java index dddb54669..d0a72864a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/ViewObjectDossierObjectPermissionService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/ViewObjectDossierObjectPermissionService.java @@ -8,11 +8,10 @@ import java.util.stream.Collectors; import org.springframework.security.acls.model.MutableAclService; import org.springframework.stereotype.Service; -import com.iqser.red.keycloak.commons.UserListingService; import com.iqser.red.service.persistence.management.v1.processor.acl.RedPermission; import com.iqser.red.service.persistence.management.v1.processor.acl.custom.api.ICustomPermissionService; +import com.iqser.red.service.persistence.management.v1.processor.client.tenantusermanagementservice.UsersClient; import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; @Service @@ -21,9 +20,9 @@ public class ViewObjectDossierObjectPermissionService extends ICustomPermissionS private final DossierManagementService dossierManagementService; - public ViewObjectDossierObjectPermissionService(UserListingService userService, MutableAclService mutableAclService, DossierManagementService dossierManagementService) { + public ViewObjectDossierObjectPermissionService(UsersClient usersClient, MutableAclService mutableAclService, DossierManagementService dossierManagementService) { - super(userService, mutableAclService); + super(usersClient, mutableAclService); this.dossierManagementService = dossierManagementService; } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/initializer/ACLInitializer.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/initializer/ACLInitializer.java index 552f03d4e..ff7360deb 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/initializer/ACLInitializer.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/initializer/ACLInitializer.java @@ -3,11 +3,8 @@ package com.iqser.red.service.persistence.management.v1.processor.acl.custom.ini import java.util.Comparator; import java.util.List; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Service; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import lombok.RequiredArgsConstructor; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/initializer/CustomDossierPermissionsACLInitializer.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/initializer/CustomDossierPermissionsACLInitializer.java index 110c3d57f..3f59a3248 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/initializer/CustomDossierPermissionsACLInitializer.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/initializer/CustomDossierPermissionsACLInitializer.java @@ -9,8 +9,6 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.acl.RedPermission; import com.iqser.red.service.persistence.management.v1.processor.acl.custom.service.CustomPermissionService; -import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.permission.CustomPermissionMappingModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.permission.CustomPermissionModel; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/tenantusermanagementservice/UsersClient.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/tenantusermanagementservice/UsersClient.java new file mode 100644 index 000000000..4f1276eeb --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/tenantusermanagementservice/UsersClient.java @@ -0,0 +1,24 @@ +package com.iqser.red.service.persistence.management.v1.processor.client.tenantusermanagementservice; + +import java.util.List; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.iqser.red.service.persistence.management.v1.processor.service.users.model.User; + +@FeignClient(name = "UsersClient", url = "${tenant-user-management-service.url}") +public interface UsersClient { + + String REFRESH_CACHE_PARAM = "refreshCache"; + String USER_REST_PATH = "/user"; + + + @ResponseBody + @GetMapping(value = USER_REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + List getAllUsers(@RequestParam(name = REFRESH_CACHE_PARAM, defaultValue = "false", required = false) boolean bypassCache); + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/CleanupDownloadSchedulerConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/CleanupDownloadSchedulerConfiguration.java deleted file mode 100644 index 9a9f5e26d..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/CleanupDownloadSchedulerConfiguration.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.configuration; - -import java.util.concurrent.Executor; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Configuration -@EnableScheduling -@RequiredArgsConstructor -public class CleanupDownloadSchedulerConfiguration { - - @Bean - public Executor taskExecutor() { - - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setCorePoolSize(1); - executor.setMaxPoolSize(1); - executor.setThreadNamePrefix("CleanupDownloadScheduler-"); - executor.initialize(); - return executor; - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/TenantMessagingConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/TenantMessagingConfiguration.java new file mode 100644 index 000000000..6c8eef759 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/TenantMessagingConfiguration.java @@ -0,0 +1,50 @@ +package com.iqser.red.service.persistence.management.v1.processor.configuration; + + +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.FanoutExchange; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.core.QueueBuilder; +import org.springframework.amqp.core.TopicExchange; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import lombok.RequiredArgsConstructor; + +@Configuration +@RequiredArgsConstructor +public class TenantMessagingConfiguration { + + public static final String PERSISTENCE_SERVICE_TENANT_EVENTS_DQL = "persistence-service-tenant-events-dql"; + public static final String PERSISTENCE_SERVICE_TENANT_CREATED_QUEUE = "persistence-service-tenant-created-queue"; + + + @Bean("persistenceServiceTenantCreatedQueue") + public Queue persistenceServiceTenantCreatedQueue() { + return QueueBuilder.durable(PERSISTENCE_SERVICE_TENANT_CREATED_QUEUE) + .withArgument("x-dead-letter-exchange", "").withArgument("x-dead-letter-routing-key", PERSISTENCE_SERVICE_TENANT_EVENTS_DQL).build(); + } + + @Bean + public Queue persistenceServiceTenantDLQ() { + + return QueueBuilder.durable(PERSISTENCE_SERVICE_TENANT_EVENTS_DQL).build(); + } + + + @Bean + public Binding tenantExchangeBinding(@Qualifier("persistenceServiceTenantCreatedQueue") Queue persistenceServiceTenantCreatedQueue, + @Qualifier("tenantExchange") TopicExchange tenantExchange) { + return BindingBuilder.bind(persistenceServiceTenantCreatedQueue).to(tenantExchange).with("tenant.created"); + } + + @Bean(name = "tenantExchange") + TopicExchange tenantExchange(@Value("${fforesight.tenant-exchange.name}") String tenantExchangeName) { + + return new TopicExchange(tenantExchangeName); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/UserMessagingConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/UserMessagingConfiguration.java new file mode 100644 index 000000000..a92085370 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/UserMessagingConfiguration.java @@ -0,0 +1,149 @@ +package com.iqser.red.service.persistence.management.v1.processor.configuration; + +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.core.QueueBuilder; +import org.springframework.amqp.core.TopicExchange; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import lombok.RequiredArgsConstructor; + +@Configuration +@RequiredArgsConstructor +public class UserMessagingConfiguration { + + public static final String PERSISTENCE_SERVICE_USER_CREATED_QUEUE = "persistence-service-user-created-queue"; + public static final String PERSISTENCE_SERVICE_USER_DELETED_QUEUE = "persistence-service-user-deleted-queue"; + public static final String PERSISTENCE_SERVICE_USER_UPDATED_QUEUE = "persistence-service-user-updated-queue"; + public static final String PERSISTENCE_SERVICE_USER_STATUS_CHANGED_QUEUE = "persistence-service-user-status-changed-queue"; + public static final String PERSISTENCE_SERVICE_USER_ROLES_UPDATED_QUEUE = "persistence-service-user-roles-updated-queue"; + public static final String PERSISTENCE_SERVICE_USER_OWN_PROFILE_UPDATED_QUEUE = "persistence-service-user-own-profile-updated-queue"; + public static final String PERSISTENCE_SERVICE_USER_EVENTS_DQL = "persistence-service-user-events-dql"; + + + @Bean("persistenceServiceUserRolesUpdatedQueue") + public Queue persistenceServiceUserRolesUpdatedQueue() { + + return QueueBuilder.durable(PERSISTENCE_SERVICE_USER_ROLES_UPDATED_QUEUE) + .withArgument("x-dead-letter-exchange", "") + .withArgument("x-dead-letter-routing-key", PERSISTENCE_SERVICE_USER_EVENTS_DQL) + .build(); + } + + + @Bean + public Binding userRolesUpdatedBinding(@Qualifier("persistenceServiceUserRolesUpdatedQueue") Queue persistenceServiceUserRolesUpdatedQueue, + @Qualifier("userExchange") TopicExchange userExchange) { + + return BindingBuilder.bind(persistenceServiceUserRolesUpdatedQueue).to(userExchange).with("user.rolesUpdated"); + } + + + @Bean("persistenceServiceUserStatusChangedQueue") + public Queue persistenceServiceUserStatusChangedQueue() { + + return QueueBuilder.durable(PERSISTENCE_SERVICE_USER_STATUS_CHANGED_QUEUE) + .withArgument("x-dead-letter-exchange", "") + .withArgument("x-dead-letter-routing-key", PERSISTENCE_SERVICE_USER_EVENTS_DQL) + .build(); + } + + + @Bean + public Binding userStatusChangedBinding(@Qualifier("persistenceServiceUserStatusChangedQueue") Queue persistenceServiceUserStatusChangedQueue, + @Qualifier("userExchange") TopicExchange userExchange) { + + return BindingBuilder.bind(persistenceServiceUserStatusChangedQueue).to(userExchange).with("user.statusChanged"); + } + + + @Bean("persistenceServiceUserUpdatedQueue") + public Queue persistenceServiceUserUpdatedQueue() { + + return QueueBuilder.durable(PERSISTENCE_SERVICE_USER_UPDATED_QUEUE) + .withArgument("x-dead-letter-exchange", "") + .withArgument("x-dead-letter-routing-key", PERSISTENCE_SERVICE_USER_EVENTS_DQL) + .build(); + } + + + @Bean + public Binding userUpdatedBinding(@Qualifier("persistenceServiceUserUpdatedQueue") Queue persistenceServiceUserUpdatedQueue, + @Qualifier("userExchange") TopicExchange userExchange) { + + return BindingBuilder.bind(persistenceServiceUserUpdatedQueue).to(userExchange).with("user.updated"); + } + + + @Bean("persistenceServiceUserDeletedQueue") + public Queue persistenceServiceUserDeletedQueue() { + + return QueueBuilder.durable(PERSISTENCE_SERVICE_USER_DELETED_QUEUE) + .withArgument("x-dead-letter-exchange", "") + .withArgument("x-dead-letter-routing-key", PERSISTENCE_SERVICE_USER_EVENTS_DQL) + .build(); + } + + + @Bean + public Binding userDeletedBinding(@Qualifier("persistenceServiceUserDeletedQueue") Queue persistenceServiceUserDeletedQueue, + @Qualifier("userExchange") TopicExchange userExchange) { + + return BindingBuilder.bind(persistenceServiceUserDeletedQueue).to(userExchange).with("user.deleted"); + } + + + @Bean("persistenceServiceUserOwnProfileUpdatedQueue") + public Queue persistenceServiceUserOwnProfileUpdatedQueue() { + + return QueueBuilder.durable(PERSISTENCE_SERVICE_USER_OWN_PROFILE_UPDATED_QUEUE) + .withArgument("x-dead-letter-exchange", "") + .withArgument("x-dead-letter-routing-key", PERSISTENCE_SERVICE_USER_EVENTS_DQL) + .build(); + } + + + @Bean + public Binding userProfileUpdatedBinding(@Qualifier("persistenceServiceUserOwnProfileUpdatedQueue") Queue persistenceServiceUserOwnProfileUpdatedQueue, + @Qualifier("userExchange") TopicExchange userExchange) { + + return BindingBuilder.bind(persistenceServiceUserOwnProfileUpdatedQueue).to(userExchange).with("user.ownProfileUpdated"); + } + + + @Bean("persistenceServiceUserCreatedQueue") + public Queue persistenceServiceUserCreatedQueue() { + + return QueueBuilder.durable(PERSISTENCE_SERVICE_USER_CREATED_QUEUE) + .withArgument("x-dead-letter-exchange", "") + .withArgument("x-dead-letter-routing-key", PERSISTENCE_SERVICE_USER_EVENTS_DQL) + .build(); + } + + + @Bean + public Binding userCreatedBinding(@Qualifier("persistenceServiceUserCreatedQueue") Queue persistenceServiceUserCreatedQueue, + @Qualifier("userExchange") TopicExchange userExchange) { + + return BindingBuilder.bind(persistenceServiceUserCreatedQueue).to(userExchange).with("user.created"); + } + + + @Bean + public Queue persistenceServiceUserEventsDLQ() { + + return QueueBuilder.durable(PERSISTENCE_SERVICE_USER_EVENTS_DQL).build(); + } + + + @Bean(name = "userExchange") + TopicExchange tenantExchange(@Value("${fforesight.user-exchange.name}") String userExchange) { + + return new TopicExchange(userExchange); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/AnnotationEntityId.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/AnnotationEntityId.java index beffc1083..bb127624a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/AnnotationEntityId.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/AnnotationEntityId.java @@ -2,8 +2,8 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.annotat import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/CommentEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/CommentEntity.java index 46f710767..739f5bcf8 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/CommentEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/CommentEntity.java @@ -2,12 +2,13 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.annotat import java.time.OffsetDateTime; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; @@ -25,7 +26,7 @@ import lombok.NoArgsConstructor; public class CommentEntity { @Id - @GeneratedValue + @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/IdRemovalEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/IdRemovalEntity.java index a51b61868..2a6288ebd 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/IdRemovalEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/IdRemovalEntity.java @@ -4,14 +4,14 @@ import java.time.OffsetDateTime; import java.util.HashSet; import java.util.Set; -import javax.persistence.Column; -import javax.persistence.ElementCollection; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualForceRedactionEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualForceRedactionEntity.java index c0f20732a..3bcdfdb3f 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualForceRedactionEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualForceRedactionEntity.java @@ -2,13 +2,13 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.annotat import java.time.OffsetDateTime; -import javax.persistence.Column; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualImageRecategorizationEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualImageRecategorizationEntity.java index 2e916373b..0bc4031a3 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualImageRecategorizationEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualImageRecategorizationEntity.java @@ -2,13 +2,13 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.annotat import java.time.OffsetDateTime; -import javax.persistence.Column; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualLegalBasisChangeEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualLegalBasisChangeEntity.java index 45a2ddc40..7df85029e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualLegalBasisChangeEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualLegalBasisChangeEntity.java @@ -2,13 +2,13 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.annotat import java.time.OffsetDateTime; -import javax.persistence.Column; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualRedactionEntryEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualRedactionEntryEntity.java index 20ba0f1d3..2b813a191 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualRedactionEntryEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualRedactionEntryEntity.java @@ -6,15 +6,15 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.persistence.Column; -import javax.persistence.ElementCollection; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualResizeRedactionEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualResizeRedactionEntity.java index 1709ec6c7..01826a240 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualResizeRedactionEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualResizeRedactionEntity.java @@ -4,15 +4,15 @@ import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.List; -import javax.persistence.Column; -import javax.persistence.ElementCollection; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/RectangleEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/RectangleEntity.java index 6ad0ffcf1..1ff69ffe6 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/RectangleEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/RectangleEntity.java @@ -1,6 +1,6 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.annotations; -import javax.persistence.Embeddable; +import jakarta.persistence.Embeddable; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ViewedPageEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ViewedPageEntity.java index be19f82fe..f8286d4d1 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ViewedPageEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ViewedPageEntity.java @@ -3,14 +3,14 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.annotat import java.io.Serializable; import java.time.OffsetDateTime; -import javax.persistence.Column; -import javax.persistence.Embeddable; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.ManyToOne; -import javax.persistence.MapsId; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.MapsId; +import jakarta.persistence.Table; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/audit/AuditEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/audit/AuditEntity.java index 935a2872d..0b2763e7d 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/audit/AuditEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/audit/AuditEntity.java @@ -4,14 +4,15 @@ import java.time.OffsetDateTime; import java.util.HashMap; import java.util.Map; -import javax.persistence.Basic; -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Basic; +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import com.iqser.red.service.persistence.management.v1.processor.utils.JSONMapConverter; @@ -29,7 +30,7 @@ import lombok.NoArgsConstructor; public class AuditEntity { @Id - @GeneratedValue + @GeneratedValue(strategy = GenerationType.IDENTITY) private long recordId; @Column diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/ApplicationConfigurationEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/ApplicationConfigurationEntity.java index 21a7db40f..05fcc900a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/ApplicationConfigurationEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/ApplicationConfigurationEntity.java @@ -1,9 +1,9 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.configuration; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/ColorsEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/ColorsEntity.java index 284a481fa..5557df0de 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/ColorsEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/ColorsEntity.java @@ -1,11 +1,11 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.configuration; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.PrePersist; -import javax.persistence.PreUpdate; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.PrePersist; +import jakarta.persistence.PreUpdate; +import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DictionaryEntryEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DictionaryEntryEntity.java index 0a254059a..69521864f 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DictionaryEntryEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DictionaryEntryEntity.java @@ -1,11 +1,11 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.configuration; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DictionaryFalsePositiveEntryEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DictionaryFalsePositiveEntryEntity.java index 608f0803f..dcb2fea76 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DictionaryFalsePositiveEntryEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DictionaryFalsePositiveEntryEntity.java @@ -1,12 +1,12 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.configuration; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DictionaryFalseRecommendationEntryEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DictionaryFalseRecommendationEntryEntity.java index 122fb842c..a712ac189 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DictionaryFalseRecommendationEntryEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DictionaryFalseRecommendationEntryEntity.java @@ -1,11 +1,11 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.configuration; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureEntity.java index 0d19c49aa..b2bdaf86a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureEntity.java @@ -1,10 +1,10 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.configuration; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Lob; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.Table; import com.iqser.red.service.persistence.service.v1.api.shared.model.utils.SuppressFBWarnings; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureKmsEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureKmsEntity.java index 14e713e23..eb89041e6 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureKmsEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureKmsEntity.java @@ -1,10 +1,12 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.configuration; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Lob; -import javax.persistence.Table; +import jakarta.persistence.Basic; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.Table; import com.iqser.red.service.persistence.service.v1.api.shared.model.utils.SuppressFBWarnings; @@ -40,6 +42,7 @@ public class DigitalSignatureKmsEntity { private String kmsSecretKey; @Column @Lob + @Basic(fetch= FetchType.EAGER) private byte[] certificate; } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureTypeEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureTypeEntity.java index 0e18e3e9b..acd7e1a2a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureTypeEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureTypeEntity.java @@ -1,11 +1,11 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.configuration; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignatureType; import com.iqser.red.service.persistence.service.v1.api.shared.model.utils.SuppressFBWarnings; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/FileAttributesGeneralConfigurationEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/FileAttributesGeneralConfigurationEntity.java index 325c976da..d03bf6c98 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/FileAttributesGeneralConfigurationEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/FileAttributesGeneralConfigurationEntity.java @@ -1,11 +1,11 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.configuration; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.MapsId; -import javax.persistence.OneToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.MapsId; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; import com.fasterxml.jackson.annotation.JsonIgnore; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/LegalBasisEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/LegalBasisEntity.java index 171ddc270..59309f109 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/LegalBasisEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/LegalBasisEntity.java @@ -1,7 +1,7 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.configuration; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/LegalBasisMappingEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/LegalBasisMappingEntity.java index 27b17760b..cf88548a8 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/LegalBasisMappingEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/LegalBasisMappingEntity.java @@ -3,11 +3,11 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.configu import java.util.ArrayList; import java.util.List; -import javax.persistence.Column; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/RuleSetEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/RuleSetEntity.java index cf95ce0e8..ca9c9f938 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/RuleSetEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/RuleSetEntity.java @@ -1,10 +1,10 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.configuration; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Lob; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/SMTPConfigurationEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/SMTPConfigurationEntity.java deleted file mode 100644 index 6628b7044..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/SMTPConfigurationEntity.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.entity.configuration; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.utils.SuppressFBWarnings; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Entity -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Table(name = "smtp_configuration") -@SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE") -public class SMTPConfigurationEntity { - - public static final String ID = "CONFIG_ID"; - - @Id - private final String id = SMTPConfigurationEntity.ID; - - @Column(name = "from_email") - private String from; - @Column - private String fromDisplayName; - @Column - private String envelopeFrom; - @Column - private String host; - @Column - private Integer port; - @Column - private String replyTo; - @Column - private String replyToDisplayName; - @Column - private boolean ssl; - @Column - private boolean starttls; - - // if AUTH is true, following must also be set - @Column - private boolean auth; - @Column(name = "username") - private String user; - @Column - private String password; - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/TypeEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/TypeEntity.java index 40756b5f1..b72dbbae3 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/TypeEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/TypeEntity.java @@ -2,13 +2,13 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.configu import java.time.OffsetDateTime; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/WatermarkEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/WatermarkEntity.java index a68aa1624..32072f0b4 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/WatermarkEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/WatermarkEntity.java @@ -2,17 +2,17 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.configu import java.time.OffsetDateTime; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.HorizontalTextAlignment; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeConfigEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeConfigEntity.java index fa5fc0955..68f6c7e11 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeConfigEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeConfigEntity.java @@ -1,12 +1,12 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.dossier; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.Id; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttributeType; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeEntity.java index 26e8a2700..f2e1ea0fd 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeEntity.java @@ -2,11 +2,11 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.dossier import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Embeddable; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java index 126193a57..feeb1226b 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java @@ -6,19 +6,19 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierStatusEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierStatusEntity.java index cbc9a710e..8b6529b1b 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierStatusEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierStatusEntity.java @@ -3,14 +3,14 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.dossier import java.util.ArrayList; import java.util.List; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierTemplateEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierTemplateEntity.java index 82ab163a4..cccddd75f 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierTemplateEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierTemplateEntity.java @@ -6,13 +6,13 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeConfigEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeConfigEntity.java index b0bb6a1e5..21830d49d 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeConfigEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeConfigEntity.java @@ -1,12 +1,12 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.dossier; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.Id; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import com.fasterxml.jackson.annotation.JsonIgnore; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeType; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeEntity.java index eaa0880e7..add81d9e4 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeEntity.java @@ -2,11 +2,11 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.dossier import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Embeddable; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileEntity.java index b207efa52..5b9e71035 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileEntity.java @@ -6,17 +6,17 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/ReportTemplateEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/ReportTemplateEntity.java index 487fb0cc0..2d3e69bfa 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/ReportTemplateEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/ReportTemplateEntity.java @@ -4,13 +4,13 @@ import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.List; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/download/DownloadStatusEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/download/DownloadStatusEntity.java index ad6852b22..e73b651db 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/download/DownloadStatusEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/download/DownloadStatusEntity.java @@ -6,16 +6,16 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/index/IndexInformationEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/index/IndexInformationEntity.java index 64e49c17a..e1e33db3e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/index/IndexInformationEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/index/IndexInformationEntity.java @@ -2,10 +2,10 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.index; import java.time.OffsetDateTime; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import com.iqser.red.service.persistence.service.v1.api.shared.model.utils.SuppressFBWarnings; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/migration/MigrationEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/migration/MigrationEntity.java index 94669aff2..08a214d4c 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/migration/MigrationEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/migration/MigrationEntity.java @@ -1,10 +1,11 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.migration; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; @@ -20,7 +21,7 @@ import lombok.NoArgsConstructor; public class MigrationEntity { @Id - @GeneratedValue + @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationEntity.java index 8ff18f92b..3602548d7 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationEntity.java @@ -4,14 +4,16 @@ import java.time.OffsetDateTime; import java.util.HashMap; import java.util.Map; -import javax.persistence.Basic; -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Basic; +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; import com.iqser.red.service.persistence.management.v1.processor.utils.JSONMapConverter; @@ -29,7 +31,7 @@ import lombok.NoArgsConstructor; public class NotificationEntity { @Id - @GeneratedValue + @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationPreferencesEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationPreferencesEntity.java index 921089116..c5ba59d42 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationPreferencesEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationPreferencesEntity.java @@ -3,12 +3,12 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.notific import java.util.ArrayList; import java.util.List; -import javax.persistence.Column; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/permissions/CustomPermissionEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/permissions/CustomPermissionEntity.java index 4cad37374..b41e3dab1 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/permissions/CustomPermissionEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/permissions/CustomPermissionEntity.java @@ -2,11 +2,11 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.permiss import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.IdClass; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.IdClass; +import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/jobs/CustomQuartzConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/jobs/CustomQuartzConfiguration.java deleted file mode 100644 index 209b3c185..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/jobs/CustomQuartzConfiguration.java +++ /dev/null @@ -1,177 +0,0 @@ -// -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by FernFlower decompiler) -// - -package com.iqser.red.service.persistence.management.v1.processor.jobs; - -import java.util.Map; -import java.util.Properties; - -import javax.sql.DataSource; - -import org.quartz.Calendar; -import org.quartz.JobDetail; -import org.quartz.Scheduler; -import org.quartz.Trigger; -import org.quartz.impl.jdbcjobstore.PostgreSQLDelegate; -import org.springframework.beans.factory.ObjectProvider; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate; -import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; -import org.springframework.boot.autoconfigure.quartz.QuartzDataSource; -import org.springframework.boot.autoconfigure.quartz.QuartzDataSourceInitializer; -import org.springframework.boot.autoconfigure.quartz.QuartzDataSourceScriptDatabaseInitializer; -import org.springframework.boot.autoconfigure.quartz.QuartzProperties; -import org.springframework.boot.autoconfigure.quartz.QuartzTransactionManager; -import org.springframework.boot.autoconfigure.quartz.SchedulerFactoryBeanCustomizer; -import org.springframework.boot.autoconfigure.sql.init.OnDatabaseInitializationCondition; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.core.annotation.Order; -import org.springframework.scheduling.quartz.SchedulerFactoryBean; -import org.springframework.scheduling.quartz.SpringBeanJobFactory; -import org.springframework.transaction.PlatformTransactionManager; - -@Configuration(proxyBeanMethods = false) -@ConditionalOnClass({Scheduler.class, SchedulerFactoryBean.class, PlatformTransactionManager.class}) -@EnableConfigurationProperties({QuartzProperties.class}) -@AutoConfigureAfter({DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class, LiquibaseAutoConfiguration.class, FlywayAutoConfiguration.class}) -public class CustomQuartzConfiguration { - - public CustomQuartzConfiguration() { - - } - - - @Bean - @ConditionalOnMissingBean - public SchedulerFactoryBean quartzScheduler(QuartzProperties properties, - @Qualifier("masterDataSource") DataSource dataSource, - ObjectProvider customizers, - ObjectProvider jobDetails, - Map calendars, - ObjectProvider triggers, - ApplicationContext applicationContext) { - - SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); - SpringBeanJobFactory jobFactory = new SpringBeanJobFactory(); - jobFactory.setApplicationContext(applicationContext); - schedulerFactoryBean.setJobFactory(jobFactory); - if (properties.getSchedulerName() != null) { - schedulerFactoryBean.setSchedulerName(properties.getSchedulerName()); - } - - schedulerFactoryBean.setDataSource(dataSource); - schedulerFactoryBean.setAutoStartup(properties.isAutoStartup()); - schedulerFactoryBean.setStartupDelay((int) properties.getStartupDelay().getSeconds()); - schedulerFactoryBean.setWaitForJobsToCompleteOnShutdown(properties.isWaitForJobsToCompleteOnShutdown()); - schedulerFactoryBean.setOverwriteExistingJobs(properties.isOverwriteExistingJobs()); - if (!properties.getProperties().isEmpty()) { - schedulerFactoryBean.setQuartzProperties(this.asProperties(properties.getProperties())); - } - - schedulerFactoryBean.setJobDetails(jobDetails.orderedStream().toArray((x$0) -> { - return new JobDetail[x$0]; - })); - schedulerFactoryBean.setCalendars(calendars); - schedulerFactoryBean.setTriggers(triggers.orderedStream().toArray((x$0) -> { - return new Trigger[x$0]; - })); - customizers.orderedStream().forEach((customizer) -> { - customizer.customize(schedulerFactoryBean); - }); - return schedulerFactoryBean; - } - - - private Properties asProperties(Map source) { - - Properties properties = new Properties(); - properties.putAll(source); - return properties; - } - - - @Configuration(proxyBeanMethods = false) - @ConditionalOnSingleCandidate(DataSource.class) - @ConditionalOnProperty(prefix = "spring.quartz", name = {"job-store-type"}, havingValue = "jdbc") - @Import({DatabaseInitializationDependencyConfigurer.class}) - protected static class JdbcStoreTypeConfiguration { - - protected JdbcStoreTypeConfiguration() { - - } - - - @Bean - @Order(0) - public SchedulerFactoryBeanCustomizer dataSourceCustomizer(QuartzProperties properties, - @Qualifier("masterDataSource") DataSource dataSource, - @QuartzDataSource ObjectProvider quartzDataSource, - @Qualifier("masterTransactionManager") ObjectProvider transactionManager, - @QuartzTransactionManager ObjectProvider quartzTransactionManager) { - - return (schedulerFactoryBean) -> { - DataSource dataSourceToUse = this.getDataSource(dataSource, quartzDataSource); - schedulerFactoryBean.setDataSource(dataSourceToUse); - PlatformTransactionManager txManager = this.getTransactionManager(transactionManager, quartzTransactionManager); - if (txManager != null) { - schedulerFactoryBean.setTransactionManager(txManager); - } - - }; - } - - - private DataSource getDataSource(DataSource dataSource, ObjectProvider quartzDataSource) { - - DataSource dataSourceIfAvailable = quartzDataSource.getIfAvailable(); - return dataSourceIfAvailable != null ? dataSourceIfAvailable : dataSource; - } - - - private PlatformTransactionManager getTransactionManager(ObjectProvider transactionManager, - ObjectProvider quartzTransactionManager) { - - PlatformTransactionManager transactionManagerIfAvailable = quartzTransactionManager.getIfAvailable(); - return transactionManagerIfAvailable != null ? transactionManagerIfAvailable : transactionManager.getIfUnique(); - } - - - @Bean - @ConditionalOnMissingBean({QuartzDataSourceScriptDatabaseInitializer.class, QuartzDataSourceInitializer.class}) - @Conditional({CustomQuartzConfiguration.JdbcStoreTypeConfiguration.OnQuartzDatasourceInitializationCondition.class}) - public QuartzDataSourceScriptDatabaseInitializer quartzDataSourceScriptDatabaseInitializer(DataSource dataSource, - @QuartzDataSource ObjectProvider quartzDataSource, - QuartzProperties properties) { - - DataSource dataSourceToUse = this.getDataSource(dataSource, quartzDataSource); - return new QuartzDataSourceScriptDatabaseInitializer(dataSourceToUse, properties); - } - - - static class OnQuartzDatasourceInitializationCondition extends OnDatabaseInitializationCondition { - - OnQuartzDatasourceInitializationCondition() { - - super("Quartz", "spring.quartz.jdbc.initialize-schema"); - } - - } - - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/HibernateStatisticsInterceptor.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/HibernateStatisticsInterceptor.java deleted file mode 100644 index 6a0d05f6c..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/HibernateStatisticsInterceptor.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.metrics; - -import org.hibernate.EmptyInterceptor; - -public class HibernateStatisticsInterceptor extends EmptyInterceptor { - - private final ThreadLocal queryCount = new ThreadLocal<>(); - - - public void startCounter() { - - queryCount.set(0); - } - - - public Integer getQueryCount() { - - return queryCount.get(); - } - - - public void clearCounter() { - - queryCount.remove(); - } - - - @Override - public String onPrepareStatement(String sql) { - - Integer count = queryCount.get(); - if (count != null) { - queryCount.set(count + 1); - } - return super.onPrepareStatement(sql); - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/MetricsConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/MetricsConfiguration.java deleted file mode 100644 index afd5685f3..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/MetricsConfiguration.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.metrics; - -import java.util.Map; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - -import lombok.RequiredArgsConstructor; - -@Configuration -@RequiredArgsConstructor -@ComponentScan(basePackageClasses = MetricsConfiguration.class) -@ConditionalOnProperty(value = "metrics.persistence.enabled", havingValue = "true") -public class MetricsConfiguration implements HibernatePropertiesCustomizer { - - @Override - public void customize(Map hibernateProperties) { - - hibernateProperties.put("hibernate.session_factory.interceptor", hibernateInterceptor()); - } - - - @Bean - public HibernateStatisticsInterceptor hibernateInterceptor() { - - return new HibernateStatisticsInterceptor(); - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/PersistenceMetricsAspect.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/PersistenceMetricsAspect.java deleted file mode 100644 index 39872c843..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/PersistenceMetricsAspect.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.metrics; - -import java.util.concurrent.TimeUnit; - -import javax.annotation.PostConstruct; - -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Pointcut; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Component; - -import io.micrometer.core.instrument.DistributionSummary; -import io.micrometer.core.instrument.MeterRegistry; -import io.micrometer.core.instrument.Timer; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Aspect -@Component -@RequiredArgsConstructor -@ConditionalOnProperty(value = "metrics.persistence.enabled", havingValue = "true") -public class PersistenceMetricsAspect { - - private final MeterRegistry meterRegistry; - - private final HibernateStatisticsInterceptor statisticsInterceptor; - - - @PostConstruct - protected void postConstruct() { - - log.warn("Persistence Metrics are enabled!"); - } - - - @Pointcut("execution(public * org.springframework.data.repository.Repository+.*(..))") - public void monitor() { - - } - - - @Around("monitor()") - public Object profile(ProceedingJoinPoint pjp) throws Throwable { - - long start = System.currentTimeMillis(); - try { - statisticsInterceptor.startCounter(); - return pjp.proceed(); - } finally { - Integer queryCount = statisticsInterceptor.getQueryCount(); - statisticsInterceptor.clearCounter(); - long elapsedTime = System.currentTimeMillis() - start; - - try { - String repository = pjp.getTarget().getClass().getSimpleName(); - if (pjp.getThis().getClass().getGenericInterfaces().length > 0) { - repository = pjp.getThis().getClass().getGenericInterfaces()[0].getTypeName(); - } - String label = repository + ":" + pjp.getSignature().getName(); - - processQueryCounterSummary(label, queryCount); - processTimer(label, elapsedTime); - } catch (Exception e) { - log.debug("Processing Metrics failed", e); - } - } - - } - - - private void processQueryCounterSummary(String label, int queryCount) { - - final String metric = "QueryCounter:" + label; - final DistributionSummary summary = meterRegistry.find(metric).summary(); - if (summary != null) { - summary.record(queryCount); - } else { - meterRegistry.summary(metric, "JPA", "QueryCount").record(queryCount); - } - } - - - private void processTimer(String label, long elapsedTime) { - - final String metric = "Timer:" + label; - final Timer foundCounter = meterRegistry.find(metric).timer(); - if (foundCounter != null) { - foundCounter.record(elapsedTime, TimeUnit.MILLISECONDS); - } else { - meterRegistry.timer(metric, "JPA", "Timer").record(elapsedTime, TimeUnit.MILLISECONDS); - } - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/MigrationStarterService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/MigrationStarterService.java index aa318b542..f0ae93c44 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/MigrationStarterService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/MigrationStarterService.java @@ -10,9 +10,9 @@ import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.MigrationPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.knecon.fforesight.tenantcommons.TenantContext; +import com.knecon.fforesight.tenantcommons.TenantProvider; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -26,13 +26,13 @@ public class MigrationStarterService { private final FileManagementServiceSettings settings; private final ApplicationContext ctx; private final MigrationPersistenceService migrationPersistenceService; - private final TenantRepository tenantRepository; + private final TenantProvider tenantProvider; - @EventListener(ApplicationReadyEvent.class) + @EventListener(ApplicationReadyEvent.class) public void migrate() { - tenantRepository.findAll().forEach(tenant -> { + tenantProvider.getTenants().forEach(tenant -> { TenantContext.setTenantId(tenant.getTenantId()); @@ -43,7 +43,7 @@ public class MigrationStarterService { // This should only run in post upgrade hook if (settings.isMigrateOnly()) { - tenantRepository.findAll().forEach(tenant -> { + tenantProvider.getTenants().forEach(tenant -> { runForTenant(tenant.getTenantId()); }); @@ -64,7 +64,7 @@ public class MigrationStarterService { } - public void runForTenant(String tenantId) { + public synchronized void runForTenant(String tenantId) { TenantContext.setTenantId(tenantId); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/EncryptSMTPPasswordsMigration11.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/EncryptSMTPPasswordsMigration11.java deleted file mode 100644 index 0000c067f..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/EncryptSMTPPasswordsMigration11.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.migration.migrations; - -import javax.transaction.Transactional; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.persistence.management.v1.processor.migration.Migration; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.SMTPConfigurationService; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -public class EncryptSMTPPasswordsMigration11 extends Migration { - - private static final String NAME = "Encrypt SMTP Config Passwords"; - private static final long VERSION = 11; - - @Autowired - private SMTPConfigurationService smtpConfigurationService; - - - public EncryptSMTPPasswordsMigration11() { - - super(NAME, VERSION); - } - - - @Override - @Transactional - protected void migrate() { - - smtpConfigurationService.encryptPasswordIfNecessary(); - } - -} - - - - - diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ReduceTextFileSizeMigration10.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ReduceTextFileSizeMigration10.java index 4967107ac..c3865f96e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ReduceTextFileSizeMigration10.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ReduceTextFileSizeMigration10.java @@ -9,10 +9,10 @@ import com.iqser.red.service.persistence.management.v1.processor.migration.migra import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.Setter; import lombok.SneakyThrows; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/SimplifiedTextMigration12.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/SimplifiedTextMigration12.java index bb51d151d..1040914bc 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/SimplifiedTextMigration12.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/SimplifiedTextMigration12.java @@ -8,10 +8,10 @@ import com.iqser.red.service.persistence.management.v1.processor.migration.migra import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.Setter; import lombok.SneakyThrows; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/AbstractTextContainer.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/AbstractTextContainer.java index 9ae942f9a..4de4c32b6 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/AbstractTextContainer.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/AbstractTextContainer.java @@ -1,6 +1,5 @@ package com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.reducetext; -import com.dslplatform.json.JsonAttribute; import com.fasterxml.jackson.annotation.JsonIgnore; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; @@ -44,7 +43,6 @@ public abstract class AbstractTextContainer { @JsonIgnore - @JsonAttribute(ignore = true) public float getHeight() { return maxY - minY; @@ -52,7 +50,6 @@ public abstract class AbstractTextContainer { @JsonIgnore - @JsonAttribute(ignore = true) public float getWidth() { return maxX - minX; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/Image.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/Image.java index 578d9eeca..d3752467e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/Image.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/Image.java @@ -1,6 +1,5 @@ package com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.reducetext; -import com.dslplatform.json.CompiledJson; import lombok.AllArgsConstructor; import lombok.Builder; @@ -9,7 +8,6 @@ import lombok.NoArgsConstructor; @Data @Builder -@CompiledJson @NoArgsConstructor @AllArgsConstructor public class Image { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/RedRectangle2D.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/RedRectangle2D.java index de9f4a503..b25021c71 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/RedRectangle2D.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/RedRectangle2D.java @@ -1,7 +1,5 @@ package com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.reducetext; -import com.dslplatform.json.CompiledJson; -import com.dslplatform.json.JsonAttribute; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.AllArgsConstructor; @@ -11,7 +9,6 @@ import lombok.NoArgsConstructor; @Data @Builder -@CompiledJson @NoArgsConstructor @AllArgsConstructor public class RedRectangle2D { @@ -36,7 +33,6 @@ public class RedRectangle2D { @JsonIgnore - @JsonAttribute(ignore = true) public boolean isEmpty() { return width <= 0.0f || height <= 0.0f; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/RedTextPosition.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/RedTextPosition.java index eab32fed3..9184b10cc 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/RedTextPosition.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/RedTextPosition.java @@ -1,6 +1,5 @@ package com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.reducetext; -import com.dslplatform.json.CompiledJson; import com.dslplatform.json.JsonAttribute; import com.fasterxml.jackson.annotation.JsonAlias; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -15,7 +14,6 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -@CompiledJson public class RedTextPosition { // Same values diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/SectionText.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/SectionText.java index 69e78134b..90c4d2fde 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/SectionText.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/SectionText.java @@ -7,7 +7,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import com.dslplatform.json.CompiledJson; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionArea; import lombok.AllArgsConstructor; @@ -17,7 +16,6 @@ import lombok.NoArgsConstructor; @Data @Builder -@CompiledJson @NoArgsConstructor @AllArgsConstructor public class SectionText { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/Text.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/Text.java index 84eac28c9..7fc5c6637 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/Text.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/Text.java @@ -3,14 +3,12 @@ package com.iqser.red.service.persistence.management.v1.processor.migration.migr import java.util.ArrayList; import java.util.List; -import com.dslplatform.json.CompiledJson; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data -@CompiledJson @NoArgsConstructor @AllArgsConstructor public class Text { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/TextBlock.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/TextBlock.java index dc3824388..2a2a42ea0 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/TextBlock.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/TextBlock.java @@ -3,8 +3,6 @@ package com.iqser.red.service.persistence.management.v1.processor.migration.migr import java.util.ArrayList; import java.util.List; -import com.dslplatform.json.CompiledJson; -import com.dslplatform.json.JsonAttribute; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.AllArgsConstructor; @@ -15,7 +13,6 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @Builder @Data -@CompiledJson @NoArgsConstructor public class TextBlock extends AbstractTextContainer { @@ -49,7 +46,6 @@ public class TextBlock extends AbstractTextContainer { @Override @JsonIgnore - @JsonAttribute(ignore = true) public String getText() { return null; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/TextPositionSequence.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/TextPositionSequence.java index 9662fcc6a..e499f8bda 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/TextPositionSequence.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/TextPositionSequence.java @@ -3,8 +3,6 @@ package com.iqser.red.service.persistence.management.v1.processor.migration.migr import java.util.ArrayList; import java.util.List; -import com.dslplatform.json.CompiledJson; -import com.dslplatform.json.JsonAttribute; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; @@ -17,7 +15,6 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @Data @Builder -@CompiledJson @NoArgsConstructor @AllArgsConstructor public class TextPositionSequence { @@ -39,7 +36,6 @@ public class TextPositionSequence { private float pageWidth; - @JsonAttribute @JsonProperty public float getDir() { @@ -47,17 +43,14 @@ public class TextPositionSequence { } - @JsonAttribute @JsonProperty public int getRotation() {return textPositions.get(0).getRotation();} - @JsonAttribute @JsonProperty public float getPageHeight() {return textPositions.get(0).getPageHeight();} - @JsonAttribute @JsonProperty public float getPageWidth() {return textPositions.get(0).getPageWidth();} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/simplifiedtext/Text.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/simplifiedtext/Text.java index 5982a82fb..4d8ca77dc 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/simplifiedtext/Text.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/simplifiedtext/Text.java @@ -3,14 +3,12 @@ package com.iqser.red.service.persistence.management.v1.processor.migration.migr import java.util.ArrayList; import java.util.List; -import com.dslplatform.json.CompiledJson; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data -@CompiledJson @NoArgsConstructor @AllArgsConstructor public class Text { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/AsyncConfig.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/AsyncConfig.java deleted file mode 100644 index 5767e412e..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/AsyncConfig.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.multitenancy; - -import java.util.concurrent.Executor; - -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.annotation.AsyncConfigurerSupport; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -@Configuration -public class AsyncConfig extends AsyncConfigurerSupport { - - @Override - public Executor getAsyncExecutor() { - - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - - executor.setCorePoolSize(7); - executor.setMaxPoolSize(42); - executor.setQueueCapacity(11); - executor.setThreadNamePrefix("TenantAwareTaskExecutor-"); - executor.setTaskDecorator(new TenantAwareTaskDecorator()); - executor.initialize(); - - return executor; - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/ForwardTenantInterceptor.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/ForwardTenantInterceptor.java deleted file mode 100644 index 79e25a06d..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/ForwardTenantInterceptor.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.multitenancy; - -import org.springframework.stereotype.Component; - -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; - -import feign.RequestInterceptor; -import feign.RequestTemplate; - -@Component -public class ForwardTenantInterceptor implements RequestInterceptor { - - public static final String TENANT_HEADER_NAME = "X-TENANT-ID"; - - @Override - public void apply(RequestTemplate template) { - template.header(TENANT_HEADER_NAME, TenantContext.getTenantId()); - } -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/MultiTenancyMessagingConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/MultiTenancyMessagingConfiguration.java deleted file mode 100644 index a98a96782..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/MultiTenancyMessagingConfiguration.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.multitenancy; - -import static com.iqser.red.service.persistence.management.v1.processor.multitenancy.TenantInterceptor.TENANT_HEADER_NAME; - -import org.springframework.amqp.rabbit.config.AbstractRabbitListenerContainerFactory; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.BeanPostProcessor; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; - -@Configuration -public class MultiTenancyMessagingConfiguration { - - @Bean - public static BeanPostProcessor multitenancyBeanPostProcessor() { - - return new BeanPostProcessor() { - - @Override - public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { - - if (bean instanceof RabbitTemplate) { - - ((RabbitTemplate) bean).setBeforePublishPostProcessors(m -> { - m.getMessageProperties().setHeader(TENANT_HEADER_NAME, TenantContext.getTenantId()); - return m; - }); - - } else if (bean instanceof AbstractRabbitListenerContainerFactory) { - - ((AbstractRabbitListenerContainerFactory) bean).setAfterReceivePostProcessors(m -> { - String tenant = m.getMessageProperties().getHeader(TENANT_HEADER_NAME); - - if (tenant != null) { - TenantContext.setTenantId(tenant); - } else { - throw new RuntimeException("No Tenant is set queue message"); - } - return m; - }); - } - return bean; - } - }; - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/MultiTenancyWebConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/MultiTenancyWebConfiguration.java deleted file mode 100644 index 0981a01de..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/MultiTenancyWebConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.multitenancy; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; - -import com.iqser.red.commons.spring.DefaultWebMvcConfiguration; - -@Configuration -public class MultiTenancyWebConfiguration extends DefaultWebMvcConfiguration { - - private final TenantInterceptor tenantInterceptor; - - - @Autowired - public MultiTenancyWebConfiguration(TenantInterceptor tenantInterceptor) { - - this.tenantInterceptor = tenantInterceptor; - } - - - @Override - public void addInterceptors(InterceptorRegistry registry) { - - registry.addWebRequestInterceptor(tenantInterceptor); - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/StorageConnectionProviderImpl.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/StorageConnectionProviderImpl.java deleted file mode 100644 index 78c1a3f70..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/StorageConnectionProviderImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.multitenancy; - -import org.springframework.stereotype.Service; - -import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; -import com.iqser.red.service.persistence.management.v1.processor.service.EncryptionDecryptionService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; -import com.iqser.red.storage.commons.model.AzureStorageConnection; -import com.iqser.red.storage.commons.model.S3StorageConnection; -import com.iqser.red.storage.commons.service.StorageConnectionProvider; - -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -public class StorageConnectionProviderImpl implements StorageConnectionProvider { - - private final EncryptionDecryptionService encryptionDecryptionService; - private final TenantRepository tenantRepository; - - - @Override - public AzureStorageConnection getAzureStorageConnection(String tenantId) { - - var tenant = tenantRepository.findById(tenantId).orElseThrow(() -> new NotFoundException("Tenant does not exist")); - return AzureStorageConnection.builder() - .connectionString(encryptionDecryptionService.decrypt(tenant.getAzureStorageConnection().getConnectionString())) - .containerName(tenant.getAzureStorageConnection().getContainerName()) - .build(); - } - - - @Override - public S3StorageConnection getS3StorageConnection(String tenantId) { - - var tenant = tenantRepository.findById(tenantId).orElseThrow(() -> new NotFoundException("Tenant does not exist")); - return S3StorageConnection.builder() - .key(tenant.getS3StorageConnection().getKey()) - .secret(encryptionDecryptionService.decrypt(tenant.getS3StorageConnection().getSecret())) - .signerType(tenant.getS3StorageConnection().getSignerType()) - .bucketName(tenant.getS3StorageConnection().getBucketName()) - .region(tenant.getS3StorageConnection().getRegion()) - .endpoint(tenant.getS3StorageConnection().getEndpoint()) - .build(); - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/TenantAwareTaskDecorator.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/TenantAwareTaskDecorator.java deleted file mode 100644 index 06af1f7e3..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/TenantAwareTaskDecorator.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.multitenancy; - -import org.springframework.core.task.TaskDecorator; -import org.springframework.lang.NonNull; - -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; - -public class TenantAwareTaskDecorator implements TaskDecorator { - - @Override - @NonNull - public Runnable decorate(@NonNull Runnable runnable) { - - String tenantId = TenantContext.getTenantId(); - return () -> { - try { - TenantContext.setTenantId(tenantId); - runnable.run(); - } finally { - TenantContext.setTenantId(null); - } - }; - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/TenantInterceptor.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/TenantInterceptor.java deleted file mode 100644 index 4072f9c13..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/TenantInterceptor.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.multitenancy; - -import org.springframework.stereotype.Component; -import org.springframework.ui.ModelMap; -import org.springframework.web.context.request.WebRequest; -import org.springframework.web.context.request.WebRequestInterceptor; - -import com.iqser.red.keycloak.commons.KeycloakSecurity; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; - -@Component -public class TenantInterceptor implements WebRequestInterceptor { - - public static final String TENANT_HEADER_NAME = "X-TENANT-ID"; - - - @Override - public void preHandle(WebRequest request) { - - if (request.getHeader(TENANT_HEADER_NAME) != null) { - TenantContext.setTenantId(request.getHeader(TENANT_HEADER_NAME)); - } else { - // Workaround to keep swagger working for now until header is sent somehow. - var realm = KeycloakSecurity.getRealm(); - if (realm.isPresent()){ - TenantContext.setTenantId(realm.get()); - } else { - // Can not throw exception here currently because otherwise we can not create tenant. - TenantContext.clear(); - } - } - } - - - @Override - public void postHandle(WebRequest request, ModelMap model) { - - TenantContext.clear(); - } - - - @Override - public void afterCompletion(WebRequest request, Exception ex) { - - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/AzureStorageConnectionEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/AzureStorageConnectionEntity.java deleted file mode 100644 index f81b3a3e8..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/AzureStorageConnectionEntity.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity; - -import javax.persistence.Column; -import javax.persistence.Embeddable; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Embeddable -public class AzureStorageConnectionEntity { - - @Column(name = "storage_azure_connection_string") - private String connectionString; - @Column(name = "storage_azure_container_name") - private String containerName; - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/DatabaseConnectionEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/DatabaseConnectionEntity.java deleted file mode 100644 index a5d8c5517..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/DatabaseConnectionEntity.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity; - -import java.util.Map; - -import javax.persistence.Basic; -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.Embeddable; -import javax.persistence.FetchType; - -import com.iqser.red.service.persistence.management.v1.processor.utils.JSONMapConverter; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Embeddable -public class DatabaseConnectionEntity { - - @Column(name = "db_driver") - private String driver; - @Column(name = "db_host") - private String host; - @Column(name = "db_port") - private String port; - @Column(name = "db_database") - private String database; - @Column(name = "db_schema") - private String schema; - @Column(name = "db_username") - private String username; - @Column(name = "db_password") - private String password; - - @Basic(fetch = FetchType.EAGER) - @Column(columnDefinition = "text", name = "db_params") - @Convert(converter = JSONMapConverter.class) - private Map params; - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/S3StorageConnectionEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/S3StorageConnectionEntity.java deleted file mode 100644 index bb95e8aab..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/S3StorageConnectionEntity.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity; - -import javax.persistence.Column; -import javax.persistence.Embeddable; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Embeddable -public class S3StorageConnectionEntity { - - @Column(name = "storage_s3_key") - private String key; - @Column(name = "storage_s3_secret") - private String secret; - @Column(name = "storage_s3_signer_type") - private String signerType; - @Column(name = "storage_s3_bucket_name") - private String bucketName; - @Column(name = "storage_s3_region") - private String region; - @Column(name = "storage_s3_endpoint") - private String endpoint; - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/SearchConnectionEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/SearchConnectionEntity.java deleted file mode 100644 index c0fec1181..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/SearchConnectionEntity.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity; - -import java.util.Set; - -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.Embeddable; - -import com.iqser.red.service.persistence.management.v1.processor.utils.JSONStringSetConverter; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Embeddable -public class SearchConnectionEntity { - - @Column(columnDefinition = "text", name = "search_hosts") - @Convert(converter = JSONStringSetConverter.class) - private Set hosts; - @Column(name = "search_port") - private int port = 9300; - @Column(name = "search_scheme") - private String scheme; - @Column(name = "search_username") - private String username; - @Column(name = "search_password") - private String password; - @Column(name = "search_number_of_shards") - private String numberOfShards; - @Column(name = "search_number_of_replicas") - private String numberOfReplicas; - - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/TenantEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/TenantEntity.java deleted file mode 100644 index eb48cfc3e..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/entity/TenantEntity.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity; - -import javax.persistence.Column; -import javax.persistence.Embedded; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Entity -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Table(name = "tenant") -public class TenantEntity { - - @Id - private String tenantId; - @Column - private String displayName; - @Column - private String guid; - - @Embedded - private DatabaseConnectionEntity databaseConnection; - - @Embedded - private SearchConnectionEntity searchConnection; - - @Embedded - private AzureStorageConnectionEntity azureStorageConnection; - - @Embedded - private S3StorageConnectionEntity s3StorageConnection; - -} \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/MasterPersistenceConfig.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/MasterPersistenceConfig.java deleted file mode 100644 index ead431a27..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/MasterPersistenceConfig.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.multitenancy.persistence; - -import java.util.HashMap; -import java.util.Map; - -import javax.persistence.EntityManagerFactory; -import javax.sql.DataSource; - -import org.hibernate.cfg.AvailableSettings; -import org.springframework.beans.factory.ObjectProvider; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; -import org.springframework.boot.autoconfigure.liquibase.LiquibaseDataSource; -import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; -import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.orm.hibernate5.SpringBeanContainer; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; - -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; -import com.zaxxer.hikari.HikariDataSource; - -import liquibase.integration.spring.SpringLiquibase; -import lombok.RequiredArgsConstructor; - -@Configuration -@EnableJpaRepositories(basePackageClasses = TenantRepository.class, entityManagerFactoryRef = "masterEntityManagerFactory", transactionManagerRef = "masterTransactionManager") -@EnableConfigurationProperties({DataSourceProperties.class, JpaProperties.class}) -@RequiredArgsConstructor -public class MasterPersistenceConfig { - - private static final String entityPackages = "com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity"; - private final ConfigurableListableBeanFactory beanFactory; - private final JpaProperties jpaProperties; - - - @Bean - public LocalContainerEntityManagerFactoryBean masterEntityManagerFactory(@Qualifier("masterDataSource") DataSource dataSource) { - - LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); - - em.setPersistenceUnitName("master-persistence-unit"); - em.setPackagesToScan(entityPackages); - em.setDataSource(dataSource); - em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); - - Map properties = new HashMap<>(this.jpaProperties.getProperties()); - properties.put(AvailableSettings.PHYSICAL_NAMING_STRATEGY, "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy"); - properties.put(AvailableSettings.IMPLICIT_NAMING_STRATEGY, "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy"); - properties.put(AvailableSettings.BEAN_CONTAINER, new SpringBeanContainer(this.beanFactory)); - em.setJpaPropertyMap(properties); - - return em; - } - - - @Bean - public JpaTransactionManager masterTransactionManager(@Qualifier("masterEntityManagerFactory") EntityManagerFactory emf) { - - JpaTransactionManager transactionManager = new JpaTransactionManager(); - transactionManager.setEntityManagerFactory(emf); - return transactionManager; - } - - - @Bean - public SpringLiquibase masterLiquibase(@LiquibaseDataSource ObjectProvider liquibaseDataSource) { - - LiquibaseProperties liquibaseProperties = masterLiquibaseProperties(); - SpringLiquibase liquibase = new SpringLiquibase(); - liquibase.setDataSource(liquibaseDataSource.getIfAvailable()); - liquibase.setChangeLog(liquibaseProperties.getChangeLog()); - liquibase.setContexts(liquibaseProperties.getContexts()); - return liquibase; - } - - - @Bean - @ConfigurationProperties("multitenancy.master.liquibase") - public LiquibaseProperties masterLiquibaseProperties() { - - return new LiquibaseProperties(); - } - - - @Bean - @LiquibaseDataSource - @ConfigurationProperties("multitenancy.master.datasource.hikari") - public DataSource masterDataSource() { - - HikariDataSource dataSource = masterDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build(); - dataSource.setPoolName("masterDataSource"); - return dataSource; - } - - - @Bean - @ConfigurationProperties("multitenancy.master.datasource") - public DataSourceProperties masterDataSourceProperties() { - - return new DataSourceProperties(); - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/TenantPersistenceConfig.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/TenantPersistenceConfig.java index 11b0822cb..35ab28f19 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/TenantPersistenceConfig.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/TenantPersistenceConfig.java @@ -3,16 +3,19 @@ package com.iqser.red.service.persistence.management.v1.processor.multitenancy.p import java.util.HashMap; import java.util.Map; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManagerFactory; -import org.hibernate.MultiTenancyStrategy; +//import org.hibernate.MultiTenancyStrategy; +import org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy; import org.hibernate.cfg.AvailableSettings; +import org.hibernate.dialect.Dialect; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.DependsOn; @@ -23,12 +26,12 @@ import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; -import com.iqser.red.service.persistence.management.v1.processor.service.EncryptionDecryptionService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.CurrentTenantIdentifierResolverImpl; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.DynamicDataSourceBasedMultiTenantConnectionProvider; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ColorsRepository; import com.iqser.red.service.persistence.management.v1.processor.settings.TenantHikariSettings; +import com.knecon.fforesight.tenantcommons.EncryptionDecryptionService; +import com.knecon.fforesight.tenantcommons.TenantProvider; import lombok.RequiredArgsConstructor; @@ -52,14 +55,15 @@ public class TenantPersistenceConfig { emfBean.setPersistenceUnitName("tenant-persistence-unit"); emfBean.setPackagesToScan(entityPackages); emfBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); - Map properties = new HashMap<>(this.jpaProperties.getProperties()); - properties.put(AvailableSettings.PHYSICAL_NAMING_STRATEGY, "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy"); + properties.put(AvailableSettings.PHYSICAL_NAMING_STRATEGY, "org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy"); properties.put(AvailableSettings.IMPLICIT_NAMING_STRATEGY, "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy"); properties.put(AvailableSettings.BEAN_CONTAINER, new SpringBeanContainer(this.beanFactory)); - properties.put(AvailableSettings.MULTI_TENANT, MultiTenancyStrategy.DATABASE); +// properties.put(AvailableSettings.MULTI_TENANT, MultiTenancyStrategy.DATABASE); properties.put(AvailableSettings.MULTI_TENANT_CONNECTION_PROVIDER, connectionProvider); properties.put(AvailableSettings.MULTI_TENANT_IDENTIFIER_RESOLVER, tenantResolver); + properties.put(AvailableSettings.DIALECT, "org.hibernate.dialect.PostgreSQLDialect"); + properties.put("hibernate.temp.use_jdbc_metadata_defaults",false); emfBean.setJpaPropertyMap(properties); return emfBean; @@ -85,12 +89,11 @@ public class TenantPersistenceConfig { @Bean - @DependsOn("masterLiquibase") public TenantSpringLiquibaseExecutor tenantLiquibase(EncryptionDecryptionService encryptionService, - TenantRepository tenantRepository, + TenantProvider tenantProvider, LiquibaseProperties tenantLiquibaseProperties) { - return new TenantSpringLiquibaseExecutor(encryptionService, tenantRepository, tenantLiquibaseProperties); + return new TenantSpringLiquibaseExecutor(encryptionService, tenantProvider, tenantLiquibaseProperties); } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/TenantSpringLiquibaseExecutor.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/TenantSpringLiquibaseExecutor.java index 13cc2faef..63cb712b2 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/TenantSpringLiquibaseExecutor.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/TenantSpringLiquibaseExecutor.java @@ -13,10 +13,10 @@ import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.ResourceLoader; import org.springframework.jdbc.datasource.SingleConnectionDataSource; -import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.TenantEntity; -import com.iqser.red.service.persistence.management.v1.processor.service.EncryptionDecryptionService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; import com.iqser.red.service.persistence.management.v1.processor.utils.jdbc.JDBCUtils; +import com.knecon.fforesight.tenantcommons.EncryptionDecryptionService; +import com.knecon.fforesight.tenantcommons.TenantProvider; +import com.knecon.fforesight.tenantcommons.model.TenantResponse; import liquibase.integration.spring.SpringLiquibase; import lombok.RequiredArgsConstructor; @@ -29,7 +29,7 @@ import lombok.extern.slf4j.Slf4j; public class TenantSpringLiquibaseExecutor implements InitializingBean, ResourceLoaderAware { private final EncryptionDecryptionService encryptionService; - private final TenantRepository tenantRepository; + private final TenantProvider tenantProvider; @Qualifier("tenantLiquibaseProperties") private final LiquibaseProperties tenantLiquibaseProperties; @@ -41,22 +41,25 @@ public class TenantSpringLiquibaseExecutor implements InitializingBean, Resource @Override public void afterPropertiesSet() { - log.info("DynamicDataSources based multitenancy enabled"); - this.runOnAllTenants(tenantRepository.findAll()); + log.info("DynamicDataSources based multi-tenancy enabled"); + this.runOnAllTenants(tenantProvider.getTenants()); } @SneakyThrows - protected void runOnAllTenants(List tenants) { + protected void runOnAllTenants(List tenants) { - for (TenantEntity tenant : tenants) { + for (var tenant : tenants) { - log.info("Initializing Liquibase for tenant " + tenant.getTenantId()); - try (Connection connection = DriverManager.getConnection(JDBCUtils.buildJdbcUrlWithSchema(tenant.getDatabaseConnection()), + var jdbcURL = JDBCUtils.buildJdbcUrlWithSchema(tenant.getDatabaseConnection()); + log.info("Initializing Liquibase for tenant {} / {}", tenant.getTenantId(), jdbcURL); + try (Connection connection = DriverManager.getConnection(jdbcURL, tenant.getDatabaseConnection().getUsername(), encryptionService.decrypt(tenant.getDatabaseConnection().getPassword()))) { DataSource tenantDataSource = new SingleConnectionDataSource(connection, false); SpringLiquibase liquibase = this.getSpringLiquibase(tenantDataSource); + liquibase.setDefaultSchema(tenant.getDatabaseConnection().getSchema()); + liquibase.setLiquibaseSchema(tenant.getDatabaseConnection().getSchema()); liquibase.afterPropertiesSet(); } log.info("Liquibase ran for tenant " + tenant.getTenantId()); diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/roles/ActionRoles.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ActionRoles.java similarity index 99% rename from persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/roles/ActionRoles.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ActionRoles.java index ed7935b69..6ccc244e2 100644 --- a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/roles/ActionRoles.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ActionRoles.java @@ -1,4 +1,4 @@ -package com.iqser.red.keycloak.commons.roles; +package com.iqser.red.service.persistence.management.v1.processor.roles; public final class ActionRoles { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ApplicationRoles.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ApplicationRoles.java new file mode 100644 index 000000000..ddbc9a8c8 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ApplicationRoles.java @@ -0,0 +1,257 @@ +package com.iqser.red.service.persistence.management.v1.processor.roles; + +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ADD_COMMENT; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ADD_DICTIONARY_ENTRY; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ADD_DOSSIER_DICTIONARY_ENTRY; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ADD_UPDATE_DICTIONARY_TYPE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ADD_UPDATE_DOSSIER; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ADD_UPDATE_DOSSIER_DICTIONARY_TYPE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ARCHIVE_DOSSIER; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.CONVERT_HIGHLIGHTS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.CREATE_TENANT; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_COMMENT; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_DICTIONARY_ENTRY; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_DICTIONARY_TYPE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_DOSSIER; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_DOSSIER_DICTIONARY_ENTRY; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_DOSSIER_DICTIONARY_TYPE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_FILE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_HIGHLIGHTS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_IMPORTED_REDACTIONS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_MANUAL_REDACTION; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_REPORT_TEMPLATE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DEPLOYMENT_INFO; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DOWNLOAD_ANNOTATED_FILE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DOWNLOAD_ORIGINAL_FILE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DOWNLOAD_REDACTED_FILE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DOWNLOAD_REDACTION_PREVIEW_FILE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DOWNLOAD_REPORT_TEMPLATE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DO_MANUAL_REDACTION; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.EXCLUDE_INCLUDE_FILE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.EXCLUDE_INCLUDE_PAGES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.GET_HIGHLIGHTS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.GET_REPORT_TEMPLATES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.GET_RSS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.GET_TENANTS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.MANAGE_ACL_PERMISSIONS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.MANAGE_USER_PREFERENCES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.MANAGE_VIEWED_PAGES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.PROCESS_DOWNLOAD; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.PROCESS_MANUAL_REDACTION_REQUEST; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.PROCESS_TEXT_HIGHLIGHTS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_ALL_USERS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_APP_CONFIG; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_COLORS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DICTIONARY_TYPES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DIGITAL_SIGNATURE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER_ATTRIBUTES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER_ATTRIBUTES_CONFIG; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER_STATUS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER_TEMPLATES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOWNLOAD_STATUS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_FILE_ATTRIBUTES_CONFIG; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_FILE_STATUS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_GENERAL_CONFIGURATION; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_LEGAL_BASIS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_LICENSE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_LICENSE_REPORT; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_MANUAL_REDACTIONS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_NOTIFICATIONS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_REDACTION_LOG; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_RULES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_SMTP_CONFIGURATION; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_USERS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_VERSIONS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_WATERMARK; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.REANALYZE_DOSSIER; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.REANALYZE_FILE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.REINDEX; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.REQUEST_MANUAL_REDACTION; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ROTATE_PAGE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.SEARCH; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.SEARCH_AUDIT_LOG; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.SET_REVIEWER; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.SET_STATUS_APPROVED; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.SET_STATUS_UNDER_APPROVAL; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.UNARCHIVE_DOSSIER; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.UPDATE_LICENSE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.UPDATE_MY_PROFILE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.UPDATE_NOTIFICATIONS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.UPLOAD_FILE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.UPLOAD_REPORT_TEMPLATE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_APP_CONFIG; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_COLORS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_DIGITAL_SIGNATURE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_DOSSIER_ATTRIBUTES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_DOSSIER_ATTRIBUTES_CONFIG; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_DOSSIER_STATUS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_DOSSIER_TEMPLATES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_FILE_ATTRIBUTES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_FILE_ATTRIBUTES_CONFIG; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_GENERAL_CONFIGURATION; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_LEGAL_BASIS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_RULES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_SMTP_CONFIGURATION; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_USERS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_WATERMARK; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +import com.google.common.collect.Sets; + +public final class ApplicationRoles { + + public static final String RED_USER_ROLE = "RED_USER"; + public static final String RED_MANAGER_ROLE = "RED_MANAGER"; + public static final String RED_ADMIN_ROLE = "RED_ADMIN"; + public static final String RED_USER_ADMIN_ROLE = "RED_USER_ADMIN"; + + public static final Set UNMAPPED_ACTION_ROLES = Sets.newHashSet(UNARCHIVE_DOSSIER, UPDATE_LICENSE, GET_RSS); + + public static final Set RED_USER_ACTION_ROLES = Sets.newHashSet(ADD_COMMENT, + READ_LICENSE, + READ_APP_CONFIG, + READ_DOSSIER_STATUS, + ADD_DOSSIER_DICTIONARY_ENTRY, + DO_MANUAL_REDACTION, + ADD_UPDATE_DOSSIER_DICTIONARY_TYPE, + DELETE_COMMENT, + DELETE_DOSSIER_DICTIONARY_ENTRY, + DELETE_DOSSIER_DICTIONARY_TYPE, + DELETE_FILE, + DELETE_MANUAL_REDACTION, + DOWNLOAD_ANNOTATED_FILE, + DOWNLOAD_ORIGINAL_FILE, + DOWNLOAD_REDACTED_FILE, + DOWNLOAD_REDACTION_PREVIEW_FILE, + DOWNLOAD_REPORT_TEMPLATE, + EXCLUDE_INCLUDE_FILE, + EXCLUDE_INCLUDE_PAGES, + GET_REPORT_TEMPLATES, + MANAGE_USER_PREFERENCES, + MANAGE_VIEWED_PAGES, + PROCESS_DOWNLOAD, + PROCESS_MANUAL_REDACTION_REQUEST, + READ_COLORS, + READ_DICTIONARY_TYPES, + READ_DIGITAL_SIGNATURE, + READ_DOSSIER, + READ_DOSSIER_ATTRIBUTES, + READ_DOSSIER_ATTRIBUTES_CONFIG, + READ_DOSSIER_TEMPLATES, + READ_DOWNLOAD_STATUS, + READ_FILE_ATTRIBUTES_CONFIG, + READ_FILE_STATUS, + READ_GENERAL_CONFIGURATION, + READ_LEGAL_BASIS, + READ_MANUAL_REDACTIONS, + READ_NOTIFICATIONS, + READ_REDACTION_LOG, + READ_RULES, + READ_USERS, + READ_VERSIONS, + READ_WATERMARK, + REANALYZE_DOSSIER, + REANALYZE_FILE, + REQUEST_MANUAL_REDACTION, + ROTATE_PAGE, + SEARCH, + SEARCH_AUDIT_LOG, + SET_REVIEWER, + SET_STATUS_APPROVED, + SET_STATUS_UNDER_APPROVAL, + UPDATE_MY_PROFILE, + UPDATE_NOTIFICATIONS, + UPLOAD_FILE, + WRITE_FILE_ATTRIBUTES, + PROCESS_TEXT_HIGHLIGHTS, + GET_HIGHLIGHTS, + CONVERT_HIGHLIGHTS, + DELETE_HIGHLIGHTS, + DELETE_IMPORTED_REDACTIONS); + + public static final Set RED_ADMIN_ACTION_ROLES = Sets.newHashSet(ADD_DICTIONARY_ENTRY, + ADD_UPDATE_DICTIONARY_TYPE, + WRITE_DOSSIER_STATUS, + READ_DOSSIER_STATUS, + DELETE_DICTIONARY_ENTRY, + DELETE_DICTIONARY_TYPE, + DELETE_REPORT_TEMPLATE, + DOWNLOAD_REPORT_TEMPLATE, + GET_REPORT_TEMPLATES, + MANAGE_USER_PREFERENCES, + READ_COLORS, + READ_DICTIONARY_TYPES, + READ_DIGITAL_SIGNATURE, + READ_DOSSIER_ATTRIBUTES, + READ_DOSSIER_ATTRIBUTES_CONFIG, + READ_DOSSIER_TEMPLATES, + READ_FILE_ATTRIBUTES_CONFIG, + READ_LEGAL_BASIS, + READ_LICENSE_REPORT, + READ_NOTIFICATIONS, + READ_RULES, + READ_SMTP_CONFIGURATION, + READ_VERSIONS, + READ_WATERMARK, + REINDEX, + SEARCH_AUDIT_LOG, + UPDATE_NOTIFICATIONS, + UPLOAD_REPORT_TEMPLATE, + WRITE_COLORS, + WRITE_DIGITAL_SIGNATURE, + WRITE_DOSSIER_ATTRIBUTES_CONFIG, + WRITE_DOSSIER_TEMPLATES, + WRITE_FILE_ATTRIBUTES_CONFIG, + WRITE_GENERAL_CONFIGURATION, + WRITE_LEGAL_BASIS, + WRITE_RULES, + WRITE_SMTP_CONFIGURATION, + WRITE_WATERMARK, + WRITE_APP_CONFIG, + MANAGE_ACL_PERMISSIONS, + CREATE_TENANT, + GET_TENANTS, + DEPLOYMENT_INFO); + + public static final Set RED_MANAGER_ACTION_ROLES = Sets.newHashSet(ADD_UPDATE_DOSSIER, ARCHIVE_DOSSIER, DELETE_DOSSIER, WRITE_DOSSIER_ATTRIBUTES); + + public static final Set RED_USER_ADMIN_ACTION_ROLES = Sets.newHashSet(MANAGE_USER_PREFERENCES, + READ_ALL_USERS, + READ_DOSSIER, + READ_APP_CONFIG, + READ_GENERAL_CONFIGURATION, + READ_GENERAL_CONFIGURATION, + READ_NOTIFICATIONS, + READ_USERS, + UPDATE_MY_PROFILE, + UPDATE_NOTIFICATIONS, + WRITE_USERS, + READ_LICENSE); + + public static final Map> ROLE_DATA = Map.of(RED_USER_ROLE, + RED_USER_ACTION_ROLES, + RED_MANAGER_ROLE, + RED_MANAGER_ACTION_ROLES, + RED_ADMIN_ROLE, + RED_ADMIN_ACTION_ROLES, + RED_USER_ADMIN_ROLE, + RED_USER_ADMIN_ACTION_ROLES); + + + private ApplicationRoles() {} + + + public static void validateRoles(Collection roles) { + + for (String role : roles) { + if (!ROLE_DATA.containsKey(role)) { + throw new IllegalArgumentException("Invalid Role: " + role); + } + } + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/AccessControlService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/AccessControlService.java index 4a8e2a394..5a1ff5859 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/AccessControlService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/AccessControlService.java @@ -4,12 +4,12 @@ import org.springframework.http.HttpStatus; import org.springframework.security.access.prepost.PostAuthorize; import org.springframework.stereotype.Service; -import com.iqser.red.keycloak.commons.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import feign.FeignException; import lombok.RequiredArgsConstructor; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/CvAnalysisMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/CvAnalysisMessageReceiver.java index 89eb4edda..0159e5092 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/CvAnalysisMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/CvAnalysisMessageReceiver.java @@ -28,9 +28,7 @@ public class CvAnalysisMessageReceiver { @SneakyThrows @RabbitListener(queues = MessagingConfiguration.CV_ANALYSIS_RESPONSE_QUEUE) - public void receive(String in) { - - var response = objectMapper.readValue(in, CvAnalysisServiceResponse.class); + public void receive(CvAnalysisServiceResponse response) { fileStatusService.setStatusAnalyse(response.getDossierId(), response.getFileId(), false); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DeploymentKeyService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DeploymentKeyService.java deleted file mode 100644 index 9ccbd5ccf..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DeploymentKeyService.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.service; - -import java.nio.charset.StandardCharsets; -import java.util.Locale; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import com.google.common.hash.HashFunction; -import com.google.common.hash.Hashing; - -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -public class DeploymentKeyService { - - private final TenantManagementService tenantManagementService; - - private final HashFunction hashFunction = Hashing.farmHashFingerprint64(); - private final String hardcodedKey = "89274365-160c-49f2-ab8b-ad83fc43c2e1"; - @Value("${redaction.kubernetes.id:someValue}") - private String redactionKubernetesId; - - - public String getDeploymentKey(String tenantId) { - - var tenant = tenantManagementService.getTenant(tenantId); - - var deploymentKey = hashFunction.hashString(tenant.getGuid() + redactionKubernetesId + hardcodedKey, StandardCharsets.UTF_8); - - return deploymentKey.toString().toUpperCase(Locale.ROOT); - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryManagementService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryManagementService.java index 1e95ce6b6..5a5405632 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryManagementService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryManagementService.java @@ -13,7 +13,7 @@ import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryService.java index fbd09fc11..cc5f7630e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryService.java @@ -1,16 +1,16 @@ package com.iqser.red.service.persistence.management.v1.processor.service; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_DICTIONARY_ENTRY; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_DOSSIER_DICTIONARY_ENTRY; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_UPDATE_DICTIONARY_TYPE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_UPDATE_DOSSIER_DICTIONARY_TYPE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DICTIONARY_ENTRY; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DICTIONARY_TYPE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DOSSIER_DICTIONARY_ENTRY; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DOSSIER_DICTIONARY_TYPE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_COLORS; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DICTIONARY_TYPES; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_COLORS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ADD_DICTIONARY_ENTRY; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ADD_DOSSIER_DICTIONARY_ENTRY; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ADD_UPDATE_DICTIONARY_TYPE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ADD_UPDATE_DOSSIER_DICTIONARY_TYPE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_DICTIONARY_ENTRY; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_DICTIONARY_TYPE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_DOSSIER_DICTIONARY_ENTRY; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_DOSSIER_DICTIONARY_TYPE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_COLORS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DICTIONARY_TYPES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_COLORS; import static com.iqser.red.service.persistence.management.v1.processor.utils.TypeIdUtils.toTypeId; import java.util.ArrayList; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureKmsService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureKmsService.java index be094fed3..4817709e7 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureKmsService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureKmsService.java @@ -14,6 +14,7 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.NotFo import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DigitalSignatureKmsRepository; import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureKms; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignatureType; +import com.knecon.fforesight.tenantcommons.EncryptionDecryptionService; import feign.FeignException; import lombok.RequiredArgsConstructor; @@ -45,7 +46,10 @@ public class DigitalSignatureKmsService { DigitalSignatureKmsEntity digitalSignature = convert(digitalSignatureKms); encrypt(digitalSignature); - var result = digitalSignatureKmsRepository.save(digitalSignature); + var saved = digitalSignatureKmsRepository.save(digitalSignature); + + DigitalSignatureKmsEntity result = new DigitalSignatureKmsEntity(); + BeanUtils.copyProperties(saved, result); digitalSignatureTypeService.setActiveDigitalSignatureType(DigitalSignatureType.KMS); decrypt(result); return result; @@ -73,6 +77,7 @@ public class DigitalSignatureKmsService { public DigitalSignatureKmsEntity getDigitalSignature() { return digitalSignatureKmsRepository.findById(DigitalSignatureKmsEntity.ID).map(digitalSignature -> { + DigitalSignatureKmsEntity result = new DigitalSignatureKmsEntity(); BeanUtils.copyProperties(digitalSignature, result); decrypt(result); @@ -87,6 +92,7 @@ public class DigitalSignatureKmsService { digitalSignatureTypeService.deleteDigitalSignatureType(); } + private DigitalSignatureKmsEntity convert(DigitalSignatureKms digitalSignatureKms) { return DigitalSignatureKmsEntity.builder() diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureService.java index cd087453f..0c69a2c97 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureService.java @@ -1,6 +1,6 @@ package com.iqser.red.service.persistence.management.v1.processor.service; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @@ -13,6 +13,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignature; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignatureType; +import com.knecon.fforesight.tenantcommons.EncryptionDecryptionService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierManagementService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierManagementService.java index 07d82a23c..50b5090ea 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierManagementService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierManagementService.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.stereotype.Service; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierService.java index 03cbb820b..8d3f2fb33 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierService.java @@ -4,7 +4,6 @@ import java.time.OffsetDateTime; import java.util.List; import java.util.Set; -import javax.validation.ConstraintViolationException; import org.springframework.stereotype.Service; @@ -20,6 +19,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierChange; +import jakarta.validation.ConstraintViolationException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java index 5f95f385d..28a9058e9 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java @@ -7,7 +7,7 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @@ -32,13 +32,13 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CloneDossierTemplateRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStatus; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateImportService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateImportService.java index ab9e072e6..e4124d763 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateImportService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateImportService.java @@ -55,7 +55,6 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; import com.iqser.red.service.persistence.management.v1.processor.utils.FileUtils; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplate; @@ -74,6 +73,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DownloadService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DownloadService.java index 347d1ac14..04e128c20 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DownloadService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DownloadService.java @@ -131,14 +131,10 @@ public class DownloadService { private void addToDownloadQueue(DownloadJob downloadJob, int priority) { - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.DOWNLOAD_QUEUE, objectMapper.writeValueAsString(downloadJob), message -> { + rabbitTemplate.convertAndSend(MessagingConfiguration.DOWNLOAD_QUEUE, downloadJob, message -> { message.getMessageProperties().setPriority(priority); return message; }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EmailService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EmailService.java index 7a130c8db..67b8fcb27 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EmailService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EmailService.java @@ -4,13 +4,13 @@ import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.Properties; -import javax.mail.Address; -import javax.mail.Message; -import javax.mail.Multipart; -import javax.mail.internet.AddressException; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeBodyPart; -import javax.mail.internet.MimeMultipart; +import jakarta.mail.Address; +import jakarta.mail.Message; +import jakarta.mail.Multipart; +import jakarta.mail.internet.AddressException; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeBodyPart; +import jakarta.mail.internet.MimeMultipart; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.JavaMailSenderImpl; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EncryptionDecryptionService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EncryptionDecryptionService.java deleted file mode 100644 index 5dc7052fb..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EncryptionDecryptionService.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.service; - -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.security.SecureRandom; -import java.security.spec.KeySpec; -import java.util.Base64; - -import javax.annotation.PostConstruct; -import javax.crypto.Cipher; -import javax.crypto.SecretKey; -import javax.crypto.SecretKeyFactory; -import javax.crypto.spec.GCMParameterSpec; -import javax.crypto.spec.PBEKeySpec; -import javax.crypto.spec.SecretKeySpec; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import lombok.SneakyThrows; - -@Service -public class EncryptionDecryptionService { - - @Value("${persistence-service.crypto.key:redaction}") - private String key; - - private SecretKey secretKey; - private byte[] iv; - - - @SneakyThrows - @PostConstruct - protected void postConstruct() { - - SecureRandom secureRandom = new SecureRandom(); - iv = new byte[12]; - secureRandom.nextBytes(iv); - secretKey = generateSecretKey(key, iv); - } - - - @SneakyThrows - public SecretKey generateSecretKey(String password, byte[] iv) { - - KeySpec spec = new PBEKeySpec(password.toCharArray(), iv, 65536, 128); // AES-128 - SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); - byte[] key = secretKeyFactory.generateSecret(spec).getEncoded(); - return new SecretKeySpec(key, "AES"); - } - - - @SneakyThrows - public String encrypt(String strToEncrypt) { - if(strToEncrypt == null){ - return null; - } - - return Base64.getEncoder().encodeToString(encrypt(strToEncrypt.getBytes())); - } - - - @SneakyThrows - public byte[] encrypt(byte[] data) { - - Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); - GCMParameterSpec parameterSpec = new GCMParameterSpec(128, iv); - cipher.init(Cipher.ENCRYPT_MODE, secretKey, parameterSpec); - byte[] encryptedData = cipher.doFinal(data); - ByteBuffer byteBuffer = ByteBuffer.allocate(4 + iv.length + encryptedData.length); - byteBuffer.putInt(iv.length); - byteBuffer.put(iv); - byteBuffer.put(encryptedData); - return byteBuffer.array(); - } - - - @SneakyThrows - public String decrypt(String strToDecrypt) { - - byte[] bytes = Base64.getDecoder().decode(strToDecrypt); - return new String(decrypt(bytes), StandardCharsets.UTF_8); - } - - - @SneakyThrows - public byte[] decrypt(byte[] encryptedData) { - - ByteBuffer byteBuffer = ByteBuffer.wrap(encryptedData); - int noonceSize = byteBuffer.getInt(); - if (noonceSize < 12 || noonceSize >= 16) { - throw new IllegalArgumentException("Nonce size is incorrect. Make sure that the incoming data is an AES encrypted file."); - } - byte[] iv = new byte[noonceSize]; - byteBuffer.get(iv); - - SecretKey secretKey = generateSecretKey(key, iv); - - byte[] cipherBytes = new byte[byteBuffer.remaining()]; - byteBuffer.get(cipherBytes); - - Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); - GCMParameterSpec parameterSpec = new GCMParameterSpec(128, iv); - cipher.init(Cipher.DECRYPT_MODE, secretKey, parameterSpec); - return cipher.doFinal(cipherBytes); - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileAttributesManagementService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileAttributesManagementService.java index cfe0ed5cb..492186678 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileAttributesManagementService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileAttributesManagementService.java @@ -16,7 +16,7 @@ import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.stereotype.Service; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileManagementStorageService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileManagementStorageService.java index b1a46677a..81ca3f41d 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileManagementStorageService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileManagementStorageService.java @@ -7,13 +7,13 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.imported.ImportedRedactions; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileService.java index 6b9f5368b..d25318f6c 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileService.java @@ -7,7 +7,7 @@ import java.time.temporal.ChronoUnit; import java.util.Arrays; import java.util.Set; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.stereotype.Service; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusProcessingUpdateService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusProcessingUpdateService.java index 2a037417e..8ff33992d 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusProcessingUpdateService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusProcessingUpdateService.java @@ -1,6 +1,6 @@ package com.iqser.red.service.persistence.management.v1.processor.service; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.apache.commons.lang3.StringUtils; import org.springframework.retry.support.RetryTemplate; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java index 7da56b821..546b78131 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java @@ -6,8 +6,6 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import javax.transaction.Transactional; - import org.apache.commons.lang3.StringUtils; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service; @@ -49,6 +47,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -221,14 +220,10 @@ public class FileStatusService { setStatusFullProcessing(fileId); } - try { - if (priority) { - rabbitTemplate.convertAndSend(MessagingConfiguration.REDACTION_PRIORITY_QUEUE, objectMapper.writeValueAsString(analyseRequest)); - } else { - rabbitTemplate.convertAndSend(MessagingConfiguration.REDACTION_QUEUE, objectMapper.writeValueAsString(analyseRequest)); - } - } catch (JsonProcessingException e) { - throw new RuntimeException(e); + if (priority) { + rabbitTemplate.convertAndSend(MessagingConfiguration.REDACTION_PRIORITY_QUEUE, analyseRequest); + } else { + rabbitTemplate.convertAndSend(MessagingConfiguration.REDACTION_QUEUE, analyseRequest); } } @@ -240,7 +235,7 @@ public class FileStatusService { setStatusPreProcessingQueued(fileId); - rabbitTemplate.convertAndSend(MessagingConfiguration.PRE_PROCESSING_QUEUE, objectMapper.writeValueAsString(processUntouchedDocumentRequest)); + rabbitTemplate.convertAndSend(MessagingConfiguration.PRE_PROCESSING_QUEUE, processUntouchedDocumentRequest); } @@ -254,22 +249,18 @@ public class FileStatusService { fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.FIGURE_DETECTION_ANALYZING); - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.CV_ANALYSIS_QUEUE, - objectMapper.writeValueAsString(CvAnalysisServiceRequest.builder() - .dossierId(dossierId) - .fileId(fileId) - .operation(CvAnalysisServiceRequest.OPERATION_FIGURE_DETECTION) - .targetFileExtension(CvAnalysisServiceRequest.TARGET_FILE_EXTENSION) - .responseFileExtension(CvAnalysisServiceRequest.FIGURE_DETECTION_FILE_EXTENSION) - .build()), - message -> { - message.getMessageProperties().setPriority(1); - return message; - }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } + rabbitTemplate.convertAndSend(MessagingConfiguration.CV_ANALYSIS_QUEUE, + CvAnalysisServiceRequest.builder() + .dossierId(dossierId) + .fileId(fileId) + .operation(CvAnalysisServiceRequest.OPERATION_FIGURE_DETECTION) + .targetFileExtension(CvAnalysisServiceRequest.TARGET_FILE_EXTENSION) + .responseFileExtension(CvAnalysisServiceRequest.FIGURE_DETECTION_FILE_EXTENSION) + .build(), + message -> { + message.getMessageProperties().setPriority(1); + return message; + }); } @@ -277,44 +268,35 @@ public class FileStatusService { fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.TABLE_PARSING_ANALYZING); - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.CV_ANALYSIS_QUEUE, - objectMapper.writeValueAsString(CvAnalysisServiceRequest.builder() - .dossierId(dossierId) - .fileId(fileId) - .operation(CvAnalysisServiceRequest.OPERATION_TABLE_PARSING) - .targetFileExtension(CvAnalysisServiceRequest.TARGET_FILE_EXTENSION) - .responseFileExtension(CvAnalysisServiceRequest.TABLE_PARSING_FILE_EXTENSION) - .build()), - message -> { - message.getMessageProperties().setPriority(1); - return message; - }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } + rabbitTemplate.convertAndSend(MessagingConfiguration.CV_ANALYSIS_QUEUE, + CvAnalysisServiceRequest.builder() + .dossierId(dossierId) + .fileId(fileId) + .operation(CvAnalysisServiceRequest.OPERATION_TABLE_PARSING) + .targetFileExtension(CvAnalysisServiceRequest.TARGET_FILE_EXTENSION) + .responseFileExtension(CvAnalysisServiceRequest.TABLE_PARSING_FILE_EXTENSION) + .build(), + message -> { + message.getMessageProperties().setPriority(1); + return message; + }); } public void addToImageQueue(String dossierId, String fileId) { setStatusImageAnalyzing(fileId); - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.IMAGE_SERVICE_QUEUE, - objectMapper.writeValueAsString(ImageServiceRequest.builder() - .dossierId(dossierId) - .fileId(fileId) - .targetFileExtension(ImageServiceRequest.TARGET_FILE_EXTENSION) - .responseFileExtension(ImageServiceRequest.RESPONSE_FILE_EXTENSION) - .build()), - message -> { - message.getMessageProperties().setPriority(1); - return message; - }); - } catch (JsonProcessingException e) { - log.warn("Error trying to send message to the image queue: {}", e.getMessage()); - throw new RuntimeException(e); - } + rabbitTemplate.convertAndSend(MessagingConfiguration.IMAGE_SERVICE_QUEUE, + ImageServiceRequest.builder() + .dossierId(dossierId) + .fileId(fileId) + .targetFileExtension(ImageServiceRequest.TARGET_FILE_EXTENSION) + .responseFileExtension(ImageServiceRequest.RESPONSE_FILE_EXTENSION) + .build(), + message -> { + message.getMessageProperties().setPriority(1); + return message; + }); } @@ -336,21 +318,17 @@ public class FileStatusService { protected void addToNerQueue(String dossierId, String fileId) { setStatusNerAnalyzing(fileId); - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.NER_SERVICE_QUEUE, - objectMapper.writeValueAsString(NerServiceRequest.builder() - .dossierId(dossierId) - .fileId(fileId) - .targetFileExtension(NerServiceRequest.TARGET_FILE_EXTENSION) - .responseFileExtension(NerServiceRequest.RESPONSE_FILE_EXTENSION) - .build()), - message -> { - message.getMessageProperties().setPriority(1); - return message; - }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } + rabbitTemplate.convertAndSend(MessagingConfiguration.NER_SERVICE_QUEUE, + NerServiceRequest.builder() + .dossierId(dossierId) + .fileId(fileId) + .targetFileExtension(NerServiceRequest.TARGET_FILE_EXTENSION) + .responseFileExtension(NerServiceRequest.RESPONSE_FILE_EXTENSION) + .build(), + message -> { + message.getMessageProperties().setPriority(1); + return message; + }); } @@ -430,14 +408,10 @@ public class FileStatusService { private void addToOcrQueue(String dossierId, String fileId, int priority) { - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_QUEUE, objectMapper.writeValueAsString(new DocumentRequest(dossierId, fileId)), message -> { - message.getMessageProperties().setPriority(priority); - return message; - }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } + rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_QUEUE, new DocumentRequest(dossierId, fileId), message -> { + message.getMessageProperties().setPriority(priority); + return message; + }); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/GeneralConfigurationService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/GeneralConfigurationService.java deleted file mode 100644 index da2b9c4d5..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/GeneralConfigurationService.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.service; - -import org.apache.commons.lang3.StringUtils; -import org.keycloak.representations.idm.RealmRepresentation; -import org.springframework.stereotype.Service; - -import com.iqser.red.keycloak.commons.KeyCloakSettings; -import com.iqser.red.keycloak.commons.RealmService; -import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; -import com.iqser.red.service.persistence.service.v1.api.shared.model.GeneralConfigurationModel; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -@RequiredArgsConstructor -public class GeneralConfigurationService { - - private final RealmService realmService; - private final FileManagementServiceSettings fileManagementServiceSettings; - private final KeyCloakSettings keyCloakSettings; - - public void initGeneralConfiguration(String tenantId){ - TenantContext.setTenantId(tenantId); - var generalConfiguration = getGeneralConfigurations(); - log.info("Currently Configured Application Name: {}, default name: {}", generalConfiguration.getDisplayName(), fileManagementServiceSettings.getApplicationName()); - updateGeneralConfigurations(getGeneralConfigurations()); - TenantContext.clear(); - } - - public GeneralConfigurationModel getGeneralConfigurations() { - - var realm = realmService.realm(TenantContext.getTenantId()).toRepresentation(); - var auxiliaryName = realm.getDisplayNameHtml(); - - if (!fileManagementServiceSettings.getApplicationName().equals(auxiliaryName)) { - - auxiliaryName = StringUtils.replaceOnce(auxiliaryName, fileManagementServiceSettings.getApplicationName(), ""); - auxiliaryName = StringUtils.replaceOnce(auxiliaryName, " (", ""); - auxiliaryName = StringUtils.reverse(StringUtils.replaceOnce(StringUtils.reverse(auxiliaryName), ")", "")); - - } else { - auxiliaryName = null; - } - - return GeneralConfigurationModel.builder() - .auxiliaryName(auxiliaryName) - .displayName(realm.getDisplayNameHtml()) - .forgotPasswordFunctionEnabled(realm.isResetPasswordAllowed() != null && realm.isResetPasswordAllowed()) - .build(); - } - - - public void updateGeneralConfigurations(GeneralConfigurationModel generalConfigurationModel) { - - var realm = realmService.realm(TenantContext.getTenantId()); - - var clientRepresentations = realm.clients().findByClientId(keyCloakSettings.getClientId()); - for (var client : clientRepresentations) { - client.setDirectAccessGrantsEnabled(true); - var clientResource = realm.clients().get(client.getId()); - clientResource.update(client); - } - - var realmRepresentation = realm.toRepresentation(); - realmRepresentation.setResetPasswordAllowed(generalConfigurationModel.isForgotPasswordFunctionEnabled()); - if (!StringUtils.isEmpty(generalConfigurationModel.getAuxiliaryName())) { - setDisplayName(realmRepresentation, fileManagementServiceSettings.getApplicationName() + " (" + generalConfigurationModel.getAuxiliaryName() + ")"); - } else { - setDisplayName(realmRepresentation, fileManagementServiceSettings.getApplicationName()); - } - - try { - realm.update(realmRepresentation); - } catch (Exception e) { - throw new RuntimeException("Could not update realm"); - } - } - - - private void setDisplayName(RealmRepresentation realmRepresentation, String value) { - - realmRepresentation.setDisplayName(value); - realmRepresentation.setDisplayNameHtml(value); - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ImageMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ImageMessageReceiver.java index 15d0dff7b..a4b573931 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ImageMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ImageMessageReceiver.java @@ -33,9 +33,9 @@ public class ImageMessageReceiver { @SneakyThrows @RabbitListener(queues = MessagingConfiguration.IMAGE_SERVICE_RESPONSE_QUEUE) - public void receive(String in) { + public void receive(Message message) { - JsonNode imageResponse = objectMapper.readTree(in); + JsonNode imageResponse = objectMapper.readTree(message.getBody()); String dossierId = imageResponse.path("dossierId").asText(); String fileId = imageResponse.path("fileId").asText(); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/IndexingService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/IndexingService.java index 88f4a55b9..9a975037c 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/IndexingService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/IndexingService.java @@ -68,36 +68,21 @@ public class IndexingService { public void addToIndexingQueue(IndexMessageType indexMessageType, String dossierTemplateId, String dossierId, String fileId, int priority) { - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.INDEXING_QUEUE, - objectMapper.writeValueAsString(IndexMessage.builder() - .messageType(indexMessageType) - .dossierTemplateId(dossierTemplateId) - .dossierId(dossierId) - .fileId(fileId) - .build()), - message -> { - message.getMessageProperties().setPriority(priority); - return message; - }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } + rabbitTemplate.convertAndSend(MessagingConfiguration.INDEXING_QUEUE, + IndexMessage.builder().messageType(indexMessageType).dossierTemplateId(dossierTemplateId).dossierId(dossierId).fileId(fileId).build(), + message -> { + message.getMessageProperties().setPriority(priority); + return message; + }); } public void addToDeleteFromIndexQueue(String dossierId, String fileId, int priority) { - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.DELETE_FROM_INDEX_QUEUE, - objectMapper.writeValueAsString(IndexMessage.builder().dossierId(dossierId).fileId(fileId).build()), - message -> { - message.getMessageProperties().setPriority(priority); - return message; - }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } + rabbitTemplate.convertAndSend(MessagingConfiguration.DELETE_FROM_INDEX_QUEUE, IndexMessage.builder().dossierId(dossierId).fileId(fileId).build(), message -> { + message.getMessageProperties().setPriority(priority); + return message; + }); } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/KeyCloakRoleManagerApplicationRunner.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/KeyCloakRoleManagerApplicationRunner.java deleted file mode 100644 index 3643ffbdf..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/KeyCloakRoleManagerApplicationRunner.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.service; - -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.stereotype.Component; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Component -@RequiredArgsConstructor -public class KeyCloakRoleManagerApplicationRunner implements ApplicationRunner { - - private final TenantManagementService tenantManagementService; - private final KeyCloakRoleManagerService keyCloakRoleManagerService; - - - @Override - public void run(ApplicationArguments args) { - - tenantManagementService.getTenants().forEach(tenant -> { - - keyCloakRoleManagerService.updateRoles(tenant.getTenantId()); - - }); - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/KeyCloakRoleManagerService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/KeyCloakRoleManagerService.java deleted file mode 100644 index d0c108bcc..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/KeyCloakRoleManagerService.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.service; - -import static com.iqser.red.keycloak.commons.roles.ActionRoles.GET_RSS; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_ADMIN_ROLE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_MANAGER_ROLE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_USER_ADMIN_ROLE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_USER_ROLE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.UNMAPPED_ACTION_ROLES; - -import java.util.ArrayList; -import java.util.Set; -import java.util.stream.Collectors; - -import org.keycloak.representations.idm.ClientRepresentation; -import org.keycloak.representations.idm.RoleRepresentation; -import org.springframework.stereotype.Component; - -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; -import com.iqser.red.keycloak.commons.KeyCloakSettings; -import com.iqser.red.keycloak.commons.RealmService; -import com.iqser.red.keycloak.commons.roles.ApplicationRoles; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Component -@RequiredArgsConstructor -public class KeyCloakRoleManagerService { - - private final RealmService realmService; - private final KeyCloakSettings settings; - - - public void updateRoles(String tenantId) { - - var realm = realmService.realm(tenantId); - - log.info("Running KeyCloak Role Manager, managing client: {} with system client {}", settings.getApplicationClientId(), settings.getClientId()); - var existingRoles = realm.roles().list().stream().map(RoleRepresentation::getName).collect(Collectors.toList()); - - log.info("Existing KC roles: {}", existingRoles); - - var redactionClientRepresentation = getRedactionClientRepresentation(tenantId); - var redactionClient = realm.clients().get(redactionClientRepresentation.getId()); - var clientRoles = redactionClient.roles().list().stream().map(RoleRepresentation::getName).collect(Collectors.toList()); - - var allRoles = ApplicationRoles.ROLE_DATA.values().stream().flatMap(Set::stream).collect(Collectors.toSet()); - allRoles.addAll(UNMAPPED_ACTION_ROLES); - log.info("Existing KC client roles: {}", clientRoles); - log.info("Current Application KC client roles: {}", allRoles); - if (!Sets.newHashSet(clientRoles).equals(allRoles)) { - - log.info("Role-Sets are different, recreating form scratch ... "); - // remove all roles from the redaction client - - clientRoles.forEach(clientRole -> { - try { - redactionClient.roles().deleteRole(clientRole); - } catch (Exception e) { - log.warn("Failed to delete client role: {}", clientRole); - } - }); - - // re-create all client-roles - allRoles.forEach(role -> { - var roleRepresentation = new RoleRepresentation(role, role, false); - redactionClient.roles().create(roleRepresentation); - }); - log.info("Cleaned up KC client roles and written current ones!"); - } - - var allClientRoles = redactionClient.roles().list(); - - if (settings.isScmEnabled()) { - ApplicationRoles.ROLE_DATA.get(RED_USER_ROLE).add(GET_RSS); - } - - // if an application-role doesn't exist, create it - for (String applicationRole : ApplicationRoles.ROLE_DATA.keySet()) { - - log.info("Running Role Composition for role: {}", applicationRole); - if (!existingRoles.contains(applicationRole)) { - - log.info("Application Role: {} doesn't exist, creating it now", applicationRole); - var role = new RoleRepresentation(applicationRole, applicationRole, false); - role.setComposite(true); - realm.roles().create(role); - - } - - var applicationRoleResource = realm.roles().get(applicationRole); - Set composites = realm.rolesById() - .getClientRoleComposites(applicationRoleResource.toRepresentation().getId(), redactionClient.toRepresentation().getId()); - - log.info("Deleting previous composites for application role {}", applicationRole); - realm.rolesById().deleteComposites(applicationRoleResource.toRepresentation().getId(), new ArrayList<>(composites)); - var relevantClientRoles = allClientRoles.stream().filter(role -> ApplicationRoles.ROLE_DATA.get(applicationRole).contains(role.getName())).collect(Collectors.toList()); - log.info("Writing new composites for application role {}", applicationRole); - realm.rolesById().addComposites(applicationRoleResource.toRepresentation().getId(), relevantClientRoles); - log.info("Finished application role {}", applicationRole); - } - - // add RED_USER Realm Role to RED_MANAGER - var redUserRole = realm.roles().get(RED_USER_ROLE); - var redManagerRole = realm.roles().get(RED_MANAGER_ROLE); - - realm.rolesById().addComposites(redManagerRole.toRepresentation().getId(), Lists.newArrayList(redUserRole.toRepresentation())); - - // add RED_USER_ADMIN Realm Role to RED_ADMIN - var redAdminRole = realm.roles().get(RED_ADMIN_ROLE); - var redUserAdminRole = realm.roles().get(RED_USER_ADMIN_ROLE); - - realm.rolesById().addComposites(redAdminRole.toRepresentation().getId(), Lists.newArrayList(redUserAdminRole.toRepresentation())); - - log.info("Finished KC Role Manager for tenant {}", tenantId); - - } - - private ClientRepresentation getRedactionClientRepresentation(String tenantId) { - - String applicationClientId = settings.getApplicationClientId(); - var clientRepresentationIterator = realmService.realm(tenantId).clients().findByClientId(applicationClientId).iterator(); - - if (clientRepresentationIterator.hasNext()) { - return clientRepresentationIterator.next(); - } else { - throw new IllegalStateException(String.format("The application client information for the id %s could not be retrieved. " + // - "Please check the application settings and correct the license-service/userKeycloakSettings/applicationClientId setting.", applicationClientId)); - } - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/job/KeyCloakUserSyncService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/KeyCloakUserSyncService.java similarity index 77% rename from persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/job/KeyCloakUserSyncService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/KeyCloakUserSyncService.java index de1733562..11e0eb4dc 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/job/KeyCloakUserSyncService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/KeyCloakUserSyncService.java @@ -1,17 +1,16 @@ -package com.iqser.red.service.persistence.management.v1.processor.job; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.util.HashSet; import java.util.stream.Collectors; import org.springframework.stereotype.Service; -import com.iqser.red.keycloak.commons.UserListingService; -import com.iqser.red.keycloak.commons.model.User; import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; -import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.UserService; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.management.v1.processor.client.tenantusermanagementservice.UsersClient; +import com.iqser.red.service.persistence.management.v1.processor.service.users.model.User; +import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; +import com.knecon.fforesight.tenantcommons.TenantContext; +import com.knecon.fforesight.tenantcommons.TenantProvider; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -22,19 +21,18 @@ import lombok.extern.slf4j.Slf4j; public class KeyCloakUserSyncService { private final UserService userService; - private final UserListingService userListingService; + private final UsersClient usersClient; private final DossierManagementService dossierManagementService; private final DossierACLService dossierACLService; - private final TenantManagementService tenantManagementService; + private final TenantProvider tenantProvider; public void syncUsersWithKC() { - - tenantManagementService.getTenants().forEach(tenant -> { + tenantProvider.getTenants().forEach(tenant -> { TenantContext.setTenantId(tenant.getTenantId()); - var allUsers = userListingService.getAllUsers(tenant.getTenantId()); + var allUsers = usersClient.getAllUsers(true); // all userIds from KC var allUserIds = allUsers.stream().map(User::getUserId).collect(Collectors.toSet()); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ManualRedactionService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ManualRedactionService.java index df8560a24..135636e72 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ManualRedactionService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ManualRedactionService.java @@ -247,14 +247,10 @@ public class ManualRedactionService { var analyseRequest = AnalyzeRequest.builder().messageType(MessageType.SURROUNDING_TEXT).dossierId(dossierId).fileId(fileId).manualRedactions(manualRedactions).build(); - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.REDACTION_QUEUE, objectMapper.writeValueAsString(analyseRequest), message -> { - message.getMessageProperties().setPriority(1); - return message; - }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } + rabbitTemplate.convertAndSend(MessagingConfiguration.REDACTION_QUEUE, analyseRequest, message -> { + message.getMessageProperties().setPriority(1); + return message; + }); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/NerMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/NerMessageReceiver.java index d2be9847f..e332a5df5 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/NerMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/NerMessageReceiver.java @@ -30,9 +30,9 @@ public class NerMessageReceiver { @SneakyThrows @RabbitListener(queues = MessagingConfiguration.NER_SERVICE_RESPONSE_QUEUE) - public void receive(String in) { + public void receive(Message message) { - HashMap entityResponse = objectMapper.readValue(in, new TypeReference<>() { + HashMap entityResponse = objectMapper.readValue(message.getBody(), new TypeReference<>() { }); String dossierId = (String) entityResponse.get("dossierId"); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/OCRProcessingMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/OCRProcessingMessageReceiver.java index c231b05cd..c9ce0abeb 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/OCRProcessingMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/OCRProcessingMessageReceiver.java @@ -23,9 +23,7 @@ public class OCRProcessingMessageReceiver { @SneakyThrows @RabbitListener(queues = MessagingConfiguration.OCR_STATUS_UPDATE_RESPONSE_QUEUE) - public void receive(String in) { - - var response = objectMapper.readValue(in, OCRStatusUpdateResponse.class); + public void receive(OCRStatusUpdateResponse response) { fileStatusService.updateOCRStatus(response); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ReportTemplateService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ReportTemplateService.java index 7dddf3fb3..2b7e95dbe 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ReportTemplateService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ReportTemplateService.java @@ -11,11 +11,11 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.ReportTemplateUpdateRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplate; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplateUploadRequest; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/StopwordService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/StopwordService.java index 287d313e0..775f865b9 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/StopwordService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/StopwordService.java @@ -4,7 +4,7 @@ import java.util.HashSet; import java.util.Locale; import java.util.Set; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.springframework.stereotype.Service; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/TenantManagementService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/TenantManagementService.java deleted file mode 100644 index 64ed8b1ef..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/TenantManagementService.java +++ /dev/null @@ -1,446 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.service; - -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_ADMIN_ROLE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_MANAGER_ROLE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_USER_ADMIN_ROLE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_USER_ROLE; - -import java.net.URI; -import java.net.URISyntaxException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Set; -import java.util.UUID; -import java.util.stream.Collectors; - -import javax.sql.DataSource; - -import org.keycloak.representations.idm.ClientRepresentation; -import org.keycloak.representations.idm.CredentialRepresentation; -import org.keycloak.representations.idm.RealmRepresentation; -import org.keycloak.representations.idm.RoleRepresentation; -import org.keycloak.representations.idm.RolesRepresentation; -import org.keycloak.representations.idm.UserRepresentation; -import org.postgresql.util.PSQLException; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.core.io.ResourceLoader; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.StatementCallback; -import org.springframework.jdbc.datasource.SingleConnectionDataSource; -import org.springframework.stereotype.Service; - -import com.iqser.red.keycloak.commons.KeyCloakAdminClientService; -import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; -import com.iqser.red.service.persistence.management.v1.processor.exception.InternalServerErrorException; -import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; -import com.iqser.red.service.persistence.management.v1.processor.migration.AsyncMigrationStarterService; -import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.AzureStorageConnectionEntity; -import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.DatabaseConnectionEntity; -import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.S3StorageConnectionEntity; -import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.SearchConnectionEntity; -import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.TenantEntity; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; -import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; -import com.iqser.red.service.persistence.management.v1.processor.utils.jdbc.JDBCUtils; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.AzureStorageConnection; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.DatabaseConnection; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.RedUser; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.S3StorageConnection; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.SearchConnection; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantResponse; - -import liquibase.exception.LiquibaseException; -import liquibase.integration.spring.SpringLiquibase; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -@EnableConfigurationProperties(LiquibaseProperties.class) -public class TenantManagementService { - - private static final Long MAX_WAIT_TIME = 60_000L; // 60 seconds - - private static final Set SUPPORTED_DATABASES = Set.of("postgresql"); - private static final Set SQL_CONNECTION_ERROR_CODES = Set.of( - // connection_exception - "08000", - // connection_does_not_exist - "08003", - // connection_failure - "08006", - // invalid_catalog_name - "3D000"); - - private final EncryptionDecryptionService encryptionService; - - private final LiquibaseProperties liquibaseProperties; - private final ResourceLoader resourceLoader; - private final TenantRepository tenantRepository; - private final AsyncMigrationStarterService asyncMigrationStarterService; - private final GeneralConfigurationService generalConfigurationService; - private final KeyCloakRoleManagerService keyCloakRoleManagerService; - private final KeyCloakAdminClientService keycloak; - - private final FileManagementServiceSettings settings; - - public TenantManagementService(EncryptionDecryptionService encryptionService, - @Qualifier("tenantLiquibaseProperties") LiquibaseProperties liquibaseProperties, - ResourceLoader resourceLoader, - TenantRepository tenantRepository, - AsyncMigrationStarterService asyncMigrationStarterService, - GeneralConfigurationService generalConfigurationService, - KeyCloakRoleManagerService keyCloakRoleManagerService, - KeyCloakAdminClientService keycloak, FileManagementServiceSettings settings) { - - this.encryptionService = encryptionService; - this.liquibaseProperties = liquibaseProperties; - this.resourceLoader = resourceLoader; - this.tenantRepository = tenantRepository; - this.asyncMigrationStarterService = asyncMigrationStarterService; - this.generalConfigurationService = generalConfigurationService; - this.keyCloakRoleManagerService = keyCloakRoleManagerService; - this.keycloak = keycloak; - this.settings = settings; - } - - - @SneakyThrows - public void createTenant(TenantRequest tenantRequest) { - - if (tenantRepository.findById(tenantRequest.getTenantId()).isEmpty()) { - - createSchema(tenantRequest); - - var jdbcUrl = JDBCUtils.buildJdbcUrlWithSchema(tenantRequest.getDatabaseConnection()); - validateJdbcUrl(jdbcUrl); - - try (Connection connection = DriverManager.getConnection(jdbcUrl, - tenantRequest.getDatabaseConnection().getUsername(), - tenantRequest.getDatabaseConnection().getPassword())) { - DataSource tenantDataSource = new SingleConnectionDataSource(connection, false); - runLiquibase(tenantDataSource); - } catch (PSQLException e) { - handleClientException(e); - handleInternalException(e); - } - - TenantEntity tenantEntity = TenantEntity.builder() - .tenantId(tenantRequest.getTenantId()) - .displayName(tenantRequest.getDisplayName()) - .guid(UUID.randomUUID().toString()) - .databaseConnection(DatabaseConnectionEntity.builder() - .driver(tenantRequest.getDatabaseConnection().getDriver()) - .host(tenantRequest.getDatabaseConnection().getHost()) - .port(tenantRequest.getDatabaseConnection().getPort()) - .database(tenantRequest.getDatabaseConnection().getDatabase()) - .schema(tenantRequest.getDatabaseConnection().getSchema()) - .username(tenantRequest.getDatabaseConnection().getUsername()) - .password(encryptionService.encrypt(tenantRequest.getDatabaseConnection().getPassword())) - .build()) - .searchConnection(SearchConnectionEntity.builder() - .hosts(tenantRequest.getSearchConnection().getHosts()) - .port(tenantRequest.getSearchConnection().getPort()) - .scheme(tenantRequest.getSearchConnection().getScheme()) - .username(tenantRequest.getSearchConnection().getUsername()) - .password(encryptionService.encrypt(tenantRequest.getSearchConnection().getPassword())) - .numberOfShards(tenantRequest.getSearchConnection().getNumberOfShards()) - .numberOfReplicas(tenantRequest.getSearchConnection().getNumberOfReplicas()) - .build()) - .build(); - - if (tenantRequest.getAzureStorageConnection() != null) { - tenantEntity.setAzureStorageConnection(AzureStorageConnectionEntity.builder() - .connectionString(encryptionService.encrypt(tenantRequest.getAzureStorageConnection().getConnectionString())) - .containerName(tenantRequest.getAzureStorageConnection().getContainerName()) - .build()); - } - - if (tenantRequest.getS3StorageConnection() != null) { - tenantEntity.setS3StorageConnection(S3StorageConnectionEntity.builder() - .key(tenantRequest.getS3StorageConnection().getKey()) - .secret(encryptionService.encrypt(tenantRequest.getS3StorageConnection().getSecret())) - .signerType(tenantRequest.getS3StorageConnection().getSignerType()) - .bucketName(tenantRequest.getS3StorageConnection().getBucketName()) - .region(tenantRequest.getS3StorageConnection().getRegion()) - .endpoint(tenantRequest.getS3StorageConnection().getEndpoint()) - .build()); - } - - tenantRepository.save(tenantEntity); - - createRealm(tenantRequest.getTenantId(), tenantRequest.getRedUsers()); - - var waitTime = 0; - boolean realmReady; - do { - realmReady = tryToAccessRealm(tenantRequest.getTenantId()); - if (realmReady) { - break; - } else { - Thread.sleep(1_000L); - waitTime += 1_000L; - } - - } while (waitTime < MAX_WAIT_TIME); - - if (!realmReady) { - throw new InternalServerErrorException("Failed to create KC realm"); - } - - generalConfigurationService.initGeneralConfiguration(tenantRequest.getTenantId()); - keyCloakRoleManagerService.updateRoles(tenantRequest.getTenantId()); - asyncMigrationStarterService.runForTenant(tenantRequest.getTenantId()); - - } else { - throw ConflictException.withObjectName("tenant"); - } - } - - - private void createSchema(TenantRequest tenantRequest) { - - var jdbcUrl = JDBCUtils.buildJdbcUrl(tenantRequest.getDatabaseConnection()); - try (Connection connection = DriverManager.getConnection(jdbcUrl, - tenantRequest.getDatabaseConnection().getUsername(), - tenantRequest.getDatabaseConnection().getPassword())) { - DataSource tenantDataSource = new SingleConnectionDataSource(connection, false); - JdbcTemplate jdbcTemplate = new JdbcTemplate(tenantDataSource); - jdbcTemplate.execute((StatementCallback) stmt -> stmt.execute("CREATE SCHEMA " + tenantRequest.getDatabaseConnection().getSchema())); - jdbcTemplate.execute((StatementCallback) stmt -> stmt.execute("GRANT USAGE ON SCHEMA " + tenantRequest.getDatabaseConnection() - .getSchema() + " TO " + tenantRequest.getDatabaseConnection().getUsername())); - } catch (Exception e) { - log.info("Could not create schema, ignoring"); - } - } - - - private boolean tryToAccessRealm(String tenantId) { - - try { - return keycloak.getAdminClient().realms().findAll().stream().anyMatch(r -> r.getRealm().equals(tenantId)); - } catch (Exception e) { - return false; - } - } - - - private void createRealm(String tenantId, List users) { - - var redaction = new RealmRepresentation(); - redaction.setId(tenantId); - redaction.setRealm(tenantId); - redaction.setEnabled(true); - redaction.setLoginTheme("redaction"); - redaction.setEmailTheme("redaction"); - redaction.setAccountTheme("redaction"); - redaction.setAccessTokenLifespan(settings.getTenantAccessTokenLifeSpan()); - redaction.setSsoSessionIdleTimeout(settings.getSsoSessionIdleTimeout()); - - var redactionClient = new ClientRepresentation(); - redactionClient.setEnabled(true); - redactionClient.setName("redaction"); - redactionClient.setClientId("redaction"); - redactionClient.setStandardFlowEnabled(true); - redactionClient.setImplicitFlowEnabled(true); - redactionClient.setDirectAccessGrantsEnabled(true); - redactionClient.setRedirectUris(List.of("http://localhost:4200/*","/ui/*")); - redactionClient.setWebOrigins(List.of("+")); - redactionClient.setPublicClient(true); - - var swaggerClient = new ClientRepresentation(); - swaggerClient.setEnabled(true); - swaggerClient.setName("swagger-ui-client"); - swaggerClient.setClientId("swagger-ui-client"); - swaggerClient.setStandardFlowEnabled(true); - swaggerClient.setImplicitFlowEnabled(false); - swaggerClient.setDirectAccessGrantsEnabled(false); - swaggerClient.setServiceAccountsEnabled(true); - swaggerClient.setAuthorizationServicesEnabled(true); - swaggerClient.setRedirectUris(List.of("/redaction-gateway-v1/*")); - swaggerClient.setWebOrigins(List.of("+")); - - redaction.setClients(List.of(redactionClient, swaggerClient)); - var redUserRole = new RoleRepresentation(); - redUserRole.setComposite(true); - redUserRole.setName(RED_USER_ROLE); - redUserRole.setContainerId("redaction"); - - var redManagerRole = new RoleRepresentation(); - redManagerRole.setComposite(true); - redManagerRole.setName(RED_MANAGER_ROLE); - redManagerRole.setContainerId("redaction"); - - var redAdminRole = new RoleRepresentation(); - redAdminRole.setComposite(true); - redAdminRole.setName(RED_ADMIN_ROLE); - redAdminRole.setContainerId("redaction"); - - var redUserAdminRole = new RoleRepresentation(); - redUserAdminRole.setComposite(true); - redUserAdminRole.setName(RED_USER_ADMIN_ROLE); - redUserAdminRole.setContainerId("redaction"); - - RolesRepresentation rolesRepresentation = new RolesRepresentation(); - rolesRepresentation.setRealm(List.of(redUserRole, redManagerRole, redAdminRole, redUserAdminRole)); - redaction.setRoles(rolesRepresentation); - - redaction.setUsers(users.stream().map(this::toUserRepresentation).collect(Collectors.toList())); - - keycloak.getAdminClient().realms().create(redaction); - } - - - private UserRepresentation toUserRepresentation(RedUser redUser) { - - var credentialRepresentation = new CredentialRepresentation(); - credentialRepresentation.setType("password"); - credentialRepresentation.setValue(redUser.getPassword()); - - var user = new UserRepresentation(); - user.setUsername(redUser.getUsername()); - user.setCredentials(List.of(credentialRepresentation)); - user.setEmail(redUser.getEmail()); - user.setFirstName(redUser.getFirstName()); - user.setLastName(redUser.getLastName()); - user.setEmailVerified(true); - - var roles = new ArrayList(); - roles.addAll(redUser.getRedRoles()); - roles.add("uma_authorization"); - roles.add("offline_access"); - - user.setRealmRoles(roles); - - var clientRoles = new HashMap>(); - clientRoles.put("account", List.of("manage-account", "view-profile")); - - user.setClientRoles(clientRoles); - user.setEnabled(true); - - return user; - } - - - @SneakyThrows - private void validateJdbcUrl(String jdbcUrl) { - - try { - // just create a URI object to check if the string is a valid URI - var uri = new URI(jdbcUrl); - var subUri = new URI(uri.getSchemeSpecificPart()); - - if (uri.getScheme() == null || subUri.getScheme() == null || !uri.getScheme().equals("jdbc") || !SUPPORTED_DATABASES.contains(subUri.getScheme())) { - throw new IllegalArgumentException("Your jdbcUrl is not valid."); - } - } catch (URISyntaxException e) { - throw new IllegalArgumentException("Your jdbcUrl is not valid.", e); - } - - } - - - private void runLiquibase(DataSource dataSource) throws LiquibaseException { - - SpringLiquibase liquibase = getSpringLiquibase(dataSource); - liquibase.afterPropertiesSet(); - } - - - private void handleClientException(PSQLException e) { - - if (e.getSQLState().equals("28000") || e.getSQLState().equals("28P01")) { - throw new IllegalArgumentException("Database credentials are not correct. Please check them."); - } - if (SQL_CONNECTION_ERROR_CODES.contains(e.getSQLState())) { - throw new IllegalArgumentException("Error when connecting to tenant database. Please check the jdbcUrl parameter."); - } - } - - - private void handleInternalException(PSQLException e) { - - log.error(String.format("Connection to tenant DB failed with SQL state %s. Please check if the tenant DB is still running. " + // - "If yes please check the connection configuration.", e.getSQLState()), e); - throw new RuntimeException("Could not connect to the tenant DB. This is an internal error.", e); - } - - - protected SpringLiquibase getSpringLiquibase(DataSource dataSource) { - - SpringLiquibase liquibase = new SpringLiquibase(); - liquibase.setResourceLoader(resourceLoader); - liquibase.setDataSource(dataSource); - liquibase.setChangeLog(liquibaseProperties.getChangeLog()); - liquibase.setContexts(liquibaseProperties.getContexts()); - return liquibase; - } - - - public List getTenants() { - - return tenantRepository.findAll().stream().map(this::convert).collect(Collectors.toList()); - } - - - private TenantResponse convert(TenantEntity entity) { - - var tenantResponse = TenantResponse.builder() - .tenantId(entity.getTenantId()) - .displayName(entity.getDisplayName()) - .guid(entity.getGuid()) - .databaseConnection(DatabaseConnection.builder() - .driver(entity.getDatabaseConnection().getDriver()) - .host(entity.getDatabaseConnection().getHost()) - .port(entity.getDatabaseConnection().getPort()) - .database(entity.getDatabaseConnection().getDatabase()) - .schema(entity.getDatabaseConnection().getSchema()) - .username(entity.getDatabaseConnection().getUsername()) - .password(entity.getDatabaseConnection().getPassword()) - .params(entity.getDatabaseConnection().getParams()) - .build()) - .searchConnection(SearchConnection.builder() - .hosts(entity.getSearchConnection().getHosts()) - .port(entity.getSearchConnection().getPort()) - .scheme(entity.getSearchConnection().getScheme()) - .username(entity.getSearchConnection().getUsername()) - .password(entity.getSearchConnection().getPassword()) - .numberOfShards(entity.getSearchConnection().getNumberOfShards()) - .numberOfReplicas(entity.getSearchConnection().getNumberOfReplicas()) - .build()) - .build(); - - if (entity.getAzureStorageConnection() != null) { - tenantResponse.setAzureStorageConnection(AzureStorageConnection.builder() - .connectionString(entity.getAzureStorageConnection().getConnectionString()) - .containerName(entity.getAzureStorageConnection().getContainerName()) - .build()); - } - - if (entity.getS3StorageConnection() != null) { - tenantResponse.setS3StorageConnection(S3StorageConnection.builder() - .key(entity.getS3StorageConnection().getKey()) - .secret(entity.getS3StorageConnection().getSecret()) - .signerType(entity.getS3StorageConnection().getSignerType()) - .bucketName(entity.getS3StorageConnection().getBucketName()) - .region(entity.getS3StorageConnection().getRegion()) - .endpoint(entity.getS3StorageConnection().getEndpoint()) - .build()); - } - - return tenantResponse; - } - - - public TenantResponse getTenant(String tenantId) { - - return tenantRepository.findById(tenantId).map(this::convert).orElseThrow(() -> new NotFoundException("Tenant does not exist")); - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UploadService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UploadService.java index a59965017..7e27fb181 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UploadService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UploadService.java @@ -1,7 +1,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPLOAD_FILE; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_FILE_ATTRIBUTES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.UPLOAD_FILE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_FILE_ATTRIBUTES; import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; @@ -14,10 +14,8 @@ import org.springframework.stereotype.Service; import com.google.common.collect.Lists; import com.google.common.hash.HashFunction; import com.google.common.hash.Hashing; -import com.iqser.red.keycloak.commons.KeycloakSecurity; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileUploadResult; import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; @@ -26,6 +24,8 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.AddFileRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UserCacheBuilder.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UserCacheBuilder.java deleted file mode 100644 index 998d333ec..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UserCacheBuilder.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.service; - -import javax.annotation.PostConstruct; - -import org.springframework.stereotype.Service; - -import com.iqser.red.keycloak.commons.UserListingService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -@RequiredArgsConstructor -public class UserCacheBuilder { - - private final UserListingService userService; - private final TenantManagementService tenantManagementService; - - - @PostConstruct - protected void postConstruct() { - - tenantManagementService.getTenants().forEach(tenant -> userService.getAllUsers(tenant.getTenantId())); - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UserService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UserService.java deleted file mode 100644 index f993f6c9a..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UserService.java +++ /dev/null @@ -1,597 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.service; - -import static com.iqser.red.keycloak.commons.DefaultKeyCloakCommonsConfiguration.USERS_CACHE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_ADMIN_ROLE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_MANAGER_ROLE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_ROLES; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_USER_ADMIN_ROLE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_USER_ROLE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.validateRoles; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.TreeSet; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -import javax.validation.constraints.NotNull; -import javax.ws.rs.ClientErrorException; -import javax.ws.rs.NotAuthorizedException; -import javax.ws.rs.NotFoundException; -import javax.ws.rs.core.Response; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.validator.routines.EmailValidator; -import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; -import org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl; -import org.keycloak.OAuth2Constants; -import org.keycloak.admin.client.KeycloakBuilder; -import org.keycloak.admin.client.resource.UserResource; -import org.keycloak.admin.client.resource.UsersResource; -import org.keycloak.representations.idm.CredentialRepresentation; -import org.keycloak.representations.idm.RoleRepresentation; -import org.keycloak.representations.idm.UserRepresentation; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.stereotype.Service; - -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; -import com.iqser.red.keycloak.commons.KeyCloakSettings; -import com.iqser.red.keycloak.commons.KeycloakSecurity; -import com.iqser.red.keycloak.commons.RealmService; -import com.iqser.red.keycloak.commons.UserListingService; -import com.iqser.red.keycloak.commons.model.User; -import com.iqser.red.keycloak.commons.roles.ApplicationRoles; -import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; -import com.iqser.red.service.persistence.management.v1.processor.acl.custom.service.CustomPermissionService; -import com.iqser.red.service.persistence.management.v1.processor.exception.AuthenticationFailedException; -import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; -import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateUserRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.ResetPasswordRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateMyProfileRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateProfileRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AddNotificationRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; -import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationType; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -@RequiredArgsConstructor -public class UserService { - - private final RealmService realmService; - private final KeyCloakSettings keyCloakSettings; - private final DossierManagementService dossierManagementService; - private final FileStatusManagementService fileStatusManagementService; - private final AuditPersistenceService auditPersistenceService; - private final NotificationPersistenceService notificationPersistenceService; - private final DossierACLService dossierACLService; - private final CustomPermissionService customPermissionService; - private final UserListingService userListingService; - - - @CacheEvict(value = USERS_CACHE, allEntries = true) - public void evictUserCache() { - - } - - - @CacheEvict(value = USERS_CACHE, allEntries = true, beforeInvocation = true) - public User createUser(CreateUserRequest user) { - - String username = StringUtils.isEmpty(user.getUsername()) ? user.getEmail() : user.getUsername(); - if (!this.getTenantUsersResource().search(username).isEmpty()) { - throw new ConflictException("User with this username already exists"); - } - - if (!EmailValidator.getInstance().isValid(user.getEmail())) { - throw new BadRequestException("Email address format is not valid"); - } - // also search by email in case the username was provided at creation - if (!StringUtils.isEmpty(user.getUsername()) && !this.getTenantUsersResource().searchByEmail(user.getEmail(), true).isEmpty()) { - throw new ConflictException("User with this email already exists"); - } - - validateRoles(user.getRoles()); - - UserRepresentation userRepresentation = new UserRepresentation(); - userRepresentation.setUsername(username); - userRepresentation.setEmail(user.getEmail()); - userRepresentation.setEnabled(true); - userRepresentation.setFirstName(user.getFirstName()); - userRepresentation.setLastName(user.getLastName()); - - try (var response = this.getTenantUsersResource().create(userRepresentation)) { - - if (response.getStatusInfo().getFamily() != Response.Status.Family.SUCCESSFUL) { - if (response.getStatusInfo().getStatusCode() == 409) { - throw new ConflictException(response.getStatusInfo().getReasonPhrase()); - } - if (response.getStatusInfo().getStatusCode() == 400) { - throw new BadRequestException(response.getStatusInfo().getReasonPhrase()); - } - throw new BadRequestException("Cannot create user ... "); - } - - var createdUser = getUserByUsername(username); - - try { - sendResetPasswordEmail(createdUser.getUserId()); - } catch (Exception e) { - log.debug("Activation E-mail could not be sent!", e); - } - - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(createdUser.getUserId()) - .category(AuditCategory.USER.name()) - .message("User created") - .build()); - - if(!user.getRoles().isEmpty()) { - setRoles(createdUser.getUserId(), user.getRoles()); - } - - customPermissionService.syncAllCustomPermissions(); - - return getUserByUsername(username); - } - } - - - private UsersResource getTenantUsersResource() { - return realmService.realm(TenantContext.getTenantId()).users(); - } - - private User getUserByUsername(String username) { - - var userList = this.getTenantUsersResource().search(username); - if (userList.isEmpty()) { - throw new NotFoundException("User with this username already exists"); - } - - return convert(userList.iterator().next()); - } - - - private void sendResetPasswordEmail(String userId) { - - try { - this.getTenantUsersResource().get(userId).executeActionsEmail(Collections.singletonList("UPDATE_PASSWORD"), 86400); - } catch (Exception e) { - throw new BadRequestException("Failed to send email", e); - } - } - - @CacheEvict(value = USERS_CACHE, allEntries = true, beforeInvocation = true) - public void setRoles(String userId, List roles, List currentUserRoles) { - - roles.forEach(role -> { - if (!ApplicationRoles.ROLE_DATA.containsKey(role)) { - throw new BadRequestException("Invalid role: " + role); - } - }); - - var userResource = getUserResource(userId); - var userRoles = userResource.roles().realmLevel().listEffective().stream().map(RoleRepresentation::getName).collect(Collectors.toList()); - - var isUser = userRoles.contains(RED_USER_ROLE); // || currentRoles.contains(RED_MANAGER_ROLE); - var isManager = userRoles.contains(RED_MANAGER_ROLE); - var isAdmin = currentUserRoles.contains(RED_ADMIN_ROLE); - - if (!isAdmin && roles.contains(RED_ADMIN_ROLE)) { - throw new BadRequestException("Cannot assign admin-role. You're not an admin!"); - } - - if (!isAdmin && userRoles.contains(RED_ADMIN_ROLE) && !roles.contains(RED_ADMIN_ROLE)) { - throw new BadRequestException("Cannot remove admin role of a user"); - } - - if (userId.equalsIgnoreCase(KeycloakSecurity.getUserId()) && isAdmin && !roles.contains(RED_ADMIN_ROLE)) { - log.info("Admin can not remove admin role from himself."); - throw new ConflictException("Admin could not remove admin role from himself."); - } - - if (!roles.contains(RED_MANAGER_ROLE) && isManager) { - removeUserFromDossiers(userId, UserRemovalModel.REMOVE_MANAGER); - } - - if (!roles.contains(RED_USER_ROLE) && !roles.contains(RED_MANAGER_ROLE) && isUser) { - removeUserFromDossiers(userId, UserRemovalModel.REMOVE_USER); - } - - var currentRolesAsRoleRepresentation = ApplicationRoles.ROLE_DATA.keySet().stream().map(this::getRoleRepresentation).collect(Collectors.toList()); - var newRoles = roles.stream().map(this::getRoleRepresentation).collect(Collectors.toList()); - - userResource.roles().realmLevel().remove(currentRolesAsRoleRepresentation); - userResource.roles().realmLevel().add(newRoles); - - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(userId) - .category(AuditCategory.USER.name()) - .message("Roles updated for user") - .details(Map.of("CurrentRoles", roles)) - .build()); - } - - - @CacheEvict(value = USERS_CACHE, allEntries = true, beforeInvocation = true) - public void setRoles(String userId, List roles) { - - var currentUserResource = getUserResource(KeycloakSecurity.getUserId()); - var currentUserRoles = currentUserResource.roles().realmLevel().listEffective().stream().map(RoleRepresentation::getName).collect(Collectors.toList()); - - setRoles(userId, roles, currentUserRoles); - - - } - - - private User convert(UserRepresentation userRepresentation) { - - var user = userListingService.convertBasicUser(userRepresentation); - user.setRoles(getRoles(user.getUserId())); - if (user.getRoles().contains(RED_MANAGER_ROLE)) { - user.getRoles().add(RED_USER_ROLE); - } - if (user.getRoles().contains(RED_ADMIN_ROLE)) { - user.getRoles().add(RED_USER_ADMIN_ROLE); - } - return user; - } - - - public UserResource getUserResource(String userId) { - - if (StringUtils.isBlank(userId)) { - throw new BadRequestException("No id provided."); - } - try { - return this.getTenantUsersResource().get(userId); - } catch (NotFoundException e) { - throw new NotFoundException("User with id: " + userId + " does not exist", e); - } - } - - public boolean checkUserHasAdminRole(String userId) { - var userResource = this.getUserResource(userId); - var userRoles = userResource.roles().realmLevel().listEffective().stream().map(RoleRepresentation::getName).collect(Collectors.toSet()); - return userRoles.contains(RED_ADMIN_ROLE); - } - - - private void removeUserFromDossiers(String userId, UserRemovalModel mode) { - - dossierManagementService.getAllDossiers(true, true).forEach(dossier -> { - - dossierACLService.enhanceDossierWithACLData(dossier); - - updateDossierUsers(userId, mode, dossier); - }); - - } - - - private RoleRepresentation getRoleRepresentation(String role) { - - RoleRepresentation realmRole; - try { - realmRole = realmService.realm(TenantContext.getTenantId()).roles().get(role).toRepresentation(); - } catch (NotFoundException e) { - log.warn("The realm role {} is not found.", role); - throw new NotFoundException("The realm role " + role + " is not found.", e); - } - return realmRole; - } - - - private Set getRoles(String id) { - - List realmMappings = this.getTenantUsersResource().get(id).roles().getAll().getRealmMappings(); - if (realmMappings == null) { - log.warn("User with id=" + id + " contains null role mappings."); - return new TreeSet<>(); - } - return realmMappings.stream().map(RoleRepresentation::getName).filter(name -> name.startsWith(keyCloakSettings.getRolePrefix())).collect(Collectors.toSet()); - } - - - public void updateDossierUsers(String userId, UserRemovalModel mode, Dossier dossier) { - - if (mode == UserRemovalModel.REMOVE_USER || mode == UserRemovalModel.PERMANENT) { - // remove from members in case we removed the user role or we permanently removed this user - dossier.getMemberIds().remove(userId); - dossier.getApproverIds().remove(userId); - } - fileStatusManagementService.getAllDossierStatus(dossier.getId()).forEach(fileStatus -> { - if (userId.equals(fileStatus.getAssignee()) && (mode == UserRemovalModel.REMOVE_USER || mode == UserRemovalModel.PERMANENT)) { - fileStatusManagementService.setCurrentFileAssignee(dossier.getId(), fileStatus.getId(), null); - } - }); - - if (userId.equals(dossier.getOwnerId()) && (mode == UserRemovalModel.REMOVE_MANAGER || mode == UserRemovalModel.PERMANENT)) { - dossier.setOwnerId(null); - - dossier.getMemberIds() - .forEach(member -> notificationPersistenceService.insertNotification(AddNotificationRequest.builder() - .userId(member) - .issuerId(KeycloakSecurity.getUserId()) - .notificationType(NotificationType.DOSSIER_OWNER_DELETED.name()) - .target(Map.of("dossierId", dossier.getId())) - .build())); - } - - dossierManagementService.updateDossier(CreateOrUpdateDossierRequest.builder() - .dossierTemplateId(dossier.getDossierTemplateId()) - .dossierName(dossier.getDossierName()) - .description(dossier.getDescription()) - .dossierTemplateId(dossier.getDossierTemplateId()) - .downloadFileTypes(dossier.getDownloadFileTypes()) - .dueDate(dossier.getDueDate()) - .reportTemplateIds(Lists.newArrayList(dossier.getReportTemplateIds())) - .watermarkId(dossier.getWatermarkId()) - .previewWatermarkId(dossier.getPreviewWatermarkId()) - .dossierStatusId(dossier.getDossierStatusId()) - .build(), dossier.getId()); - - dossierACLService.updateDossierACL(dossier.getMemberIds(), dossier.getApproverIds(), dossier.getOwnerId(), dossier.getId()); - } - - - public Optional getUserById(String userId) { - - return this.getAllUsers().stream().filter(u -> u.getUserId().equalsIgnoreCase(userId)).findAny(); - } - - public Optional getOptionalUserByUsername(String username) { - return this.getAllUsers().stream().filter(u -> u.getUsername().contains(username)).findFirst(); - } - - - public List getUsersByIds(Collection userIds) { - return this.getAllUsers().stream().filter(u -> userIds.contains(u.getUserId())).collect(Collectors.toList()); - } - - - @CacheEvict(value = USERS_CACHE, allEntries = true, beforeInvocation = true) - public void updateMyProfile(UpdateMyProfileRequest updateProfileRequest) { - - var user = this.getUserResource(KeycloakSecurity.getUserId()); - var userRepresentation = user.toRepresentation(); - - if (userRepresentation.getFederatedIdentities() != null && !userRepresentation.getFederatedIdentities().isEmpty() && !updateProfileRequest.getEmail() - .equals(userRepresentation.getEmail())) { - throw new NotAllowedException("It is not allowed to change the email from a federated identity"); - } - - if (!updateProfileRequest.getEmail().equals(userRepresentation.getEmail())) { - validatePassword(userRepresentation.getUsername(), updateProfileRequest.getPassword()); - } - - userRepresentation.setFirstName(updateProfileRequest.getFirstName()); - userRepresentation.setLastName(updateProfileRequest.getLastName()); - userRepresentation.setEmail(updateProfileRequest.getEmail()); - this.setUsername(userRepresentation, updateProfileRequest.getEmail()); - - try { - user.update(userRepresentation); - } catch (ClientErrorException e) { - if (e.getResponse().getStatus() == 409) { - throw new ConflictException("E-mail already in use"); - } - throw e; - } - - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(KeycloakSecurity.getUserId()) - .category(AuditCategory.USER.name()) - .message("Profile updated for user") - .details(Map.of("Profile", updateProfileRequest)) - .build()); - } - - private void setUsername(UserRepresentation userRepresentation, String emailToSet) { - // update the username only if none was provided at creation and in this case the email and username are the same - if (userRepresentation.getUsername().equals(userRepresentation.getEmail())) { - userRepresentation.setUsername(emailToSet); - } - } - - private void validatePassword(String username, String password) { - - if (password == null || password.isEmpty()) { - throw new AuthenticationFailedException(); - } - - var changeEmailClient = KeycloakBuilder.builder() - - .serverUrl(keyCloakSettings.getServerUrl()) - .realm(TenantContext.getTenantId()) - .username(username) - .password(password) - .clientId(keyCloakSettings.getClientId()) - .clientSecret(keyCloakSettings.getClientSecret()) - .grantType(OAuth2Constants.PASSWORD) - .resteasyClient(new ResteasyClientBuilderImpl().connectionTTL(2, TimeUnit.SECONDS) - .hostnameVerification(ResteasyClientBuilder.HostnameVerificationPolicy.ANY) - .connectionPoolSize(keyCloakSettings.getConnectionPoolSize()) - .disableTrustManager() - .build()) - .build(); - - try { - changeEmailClient.tokenManager().getAccessTokenString(); - } catch (NotAuthorizedException e) { - throw new AuthenticationFailedException(e); - } - - changeEmailClient.close(); - - } - - - @CacheEvict(value = USERS_CACHE, allEntries = true, beforeInvocation = true) - public void deleteUser(String userId) { - - if (KeycloakSecurity.getUserId().equalsIgnoreCase(userId)) { - throw new ConflictException("Cannot delete self"); - } - - var currentUserResource = getUserResource(KeycloakSecurity.getUserId()); - var currentRoles = currentUserResource.roles().realmLevel().listEffective().stream().map(RoleRepresentation::getName).collect(Collectors.toList()); - - var userResource = getUserResource(userId); - var userRoles = userResource.roles().realmLevel().listEffective().stream().map(RoleRepresentation::getName).collect(Collectors.toList()); - - var isCurrentUserOnlyUserAdmin = currentRoles.contains(RED_USER_ADMIN_ROLE) && !currentRoles.contains(RED_ADMIN_ROLE); - var isUserToBeDeletedAdmin = userRoles.contains(RED_ADMIN_ROLE); - - if (isCurrentUserOnlyUserAdmin && isUserToBeDeletedAdmin) { - throw new NotAllowedException("It is not allowed to delete a user with RED-ADMIN role"); - } - - removeUserFromDossiers(userId, UserRemovalModel.PERMANENT); - - realmService.realm(TenantContext.getTenantId()).users().get(userId).remove(); - customPermissionService.syncAllCustomPermissions(); - - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(userId) - .category(AuditCategory.USER.name()) - .message("User removed") - .build()); - - } - - - /* - * If a user is deleted via Keycloak, the user ist still in the RedactManager database, thus we have to clean this - */ - public Set removeDeletedUsers(@NotNull Set userIds) { - - var users = userListingService.getAllUsers(TenantContext.getTenantId()); - Set deletedUsers = new HashSet<>(); - - for (String userId : userIds) { - if (users.stream().filter(u -> u.getUserId().equalsIgnoreCase(userId)).findAny().isEmpty()) { - log.info("Will delete {} user", userId); - - removeUserFromDossiers(userId, UserRemovalModel.PERMANENT); - realmService.realm(TenantContext.getTenantId()).users().delete(userId); - - auditPersistenceService.audit(AuditRequest.builder().objectId(userId).category(AuditCategory.USER.name()).message("User removed automatically").build()); - deletedUsers.add(userId); - } - } - - customPermissionService.syncAllCustomPermissions(); - return deletedUsers; - } - - - @CacheEvict(value = USERS_CACHE, allEntries = true, beforeInvocation = true) - public void updateProfile(String userId, UpdateProfileRequest updateProfileRequest) { - - var user = this.getUserResource(userId); - var userRepresentation = user.toRepresentation(); - - if (userRepresentation.getFederatedIdentities() != null && !userRepresentation.getFederatedIdentities().isEmpty() && !updateProfileRequest.getEmail() - .equals(userRepresentation.getEmail())) { - throw new NotAllowedException("It is not allowed to change the email from a federated identity"); - } - - if (!EmailValidator.getInstance().isValid(updateProfileRequest.getEmail())) { - throw new BadRequestException("Email address format is not valid"); - } - - userRepresentation.setFirstName(updateProfileRequest.getFirstName()); - userRepresentation.setLastName(updateProfileRequest.getLastName()); - userRepresentation.setEmail(updateProfileRequest.getEmail()); - this.setUsername(userRepresentation, updateProfileRequest.getEmail()); - - user.update(userRepresentation); - - setRoles(userId, updateProfileRequest.getRoles()); - - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(KeycloakSecurity.getUserId()) - .category(AuditCategory.USER.name()) - .message("Profile updated for user") - .details(Map.of("Profile", updateProfileRequest)) - .build()); - } - - - @CacheEvict(value = USERS_CACHE, allEntries = true, beforeInvocation = true) - public User activateProfile(String userId, boolean isActive) { - - var user = this.getUserResource(userId); - var userRepresentation = user.toRepresentation(); - - userRepresentation.setEnabled(isActive); - user.update(userRepresentation); - - var currentRoles = getRoles(userId); - if (isActive && currentRoles.isEmpty()) { // add RED_USER role - setRoles(userId, List.of(RED_USER_ROLE)); - } - - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(KeycloakSecurity.getUserId()) - .category(AuditCategory.USER.name()) - .message("Profile activated/deactivated for user") - .details(Map.of("Profile activated", isActive)) - .build()); - - return convert(this.getTenantUsersResource().get(userId).toRepresentation()); - } - - - public void resetPassword(String userId, ResetPasswordRequest resetPasswordRequest) { - - try { - CredentialRepresentation request = new CredentialRepresentation(); - request.setType("password"); - request.setTemporary(resetPasswordRequest.isTemporary()); - request.setValue(resetPasswordRequest.getPassword()); - realmService.realm(TenantContext.getTenantId()).users().get(userId).resetPassword(request); - } catch (Exception e) { - throw new BadRequestException("Failed to send email", e); - } - } - - - public List getAllUsers() { - - return userListingService.getAllUsers(TenantContext.getTenantId()); - } - - - public enum UserRemovalModel { - PERMANENT, - REMOVE_MANAGER, - REMOVE_USER - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/WatermarkService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/WatermarkService.java index fe81cf9fc..9de757b1b 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/WatermarkService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/WatermarkService.java @@ -5,7 +5,7 @@ import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Optional; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadDLQMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadDLQMessageReceiver.java index 230568c45..df327d458 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadDLQMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadDLQMessageReceiver.java @@ -29,9 +29,8 @@ public class DownloadDLQMessageReceiver { @RabbitListener(queues = MessagingConfiguration.DOWNLOAD_DLQ) - public void handleDlqMessage(Message failedMessage) throws IOException { + public void handleDlqMessage(DownloadJob downloadJob) throws IOException { - DownloadJob downloadJob = objectMapper.readValue(failedMessage.getBody(), DownloadJob.class); log.warn("Handling download job in DLQ userId: {} storageId: {} - setting status to error!", downloadJob.getUserId(), downloadJob.getStorageId()); setDownloadFailed(downloadJob.getUserId(), downloadJob.getStorageId()); } @@ -48,18 +47,16 @@ public class DownloadDLQMessageReceiver { @RabbitListener(queues = MessagingConfiguration.REPORT_DLQ) - public void handleReportDlqMessage(Message failedMessage) throws IOException { + public void handleReportDlqMessage(ReportRequestMessage reportRequestMessage) { - ReportRequestMessage reportRequestMessage = objectMapper.readValue(failedMessage.getBody(), ReportRequestMessage.class); log.warn("Handling report request in DLQ userId: {} storageId: {} - setting status to error!", reportRequestMessage.getUserId(), reportRequestMessage.getDownloadId()); setDownloadFailed(reportRequestMessage.getUserId(), reportRequestMessage.getDownloadId()); } @RabbitListener(queues = MessagingConfiguration.REPORT_RESULT_DLQ) - public void handleReportResponseDlqMessage(Message failedMessage) throws IOException { + public void handleReportResponseDlqMessage(ReportResultMessage reportResultMessage) { - ReportResultMessage reportResultMessage = objectMapper.readValue(failedMessage.getBody(), ReportResultMessage.class); log.warn("Handling report request in DLQ userId: {} storageId: {} - setting status to error!", reportResultMessage.getUserId(), reportResultMessage.getDownloadId()); setDownloadFailed(reportResultMessage.getUserId(), reportResultMessage.getDownloadId()); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadPreparationService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadPreparationService.java index 221ea404c..ef8fe4200 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadPreparationService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadPreparationService.java @@ -8,7 +8,7 @@ import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service; @@ -33,7 +33,6 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; import com.iqser.red.service.persistence.management.v1.processor.utils.FileSystemBackedArchiver; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AddNotificationRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; @@ -42,6 +41,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.download.Do import com.iqser.red.service.redaction.report.v1.api.model.ReportResultMessage; import com.iqser.red.service.redaction.report.v1.api.model.StoredFileInformation; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; @@ -104,7 +104,7 @@ public class DownloadPreparationService { .build(); log.info("Sending redaction request for downloadId:{} to pdftron-redaction-queue", message.getDownloadId()); - rabbitTemplate.convertAndSend(MessagingConfiguration.PDFTRON_QUEUE, objectMapper.writeValueAsString(message)); + rabbitTemplate.convertAndSend(MessagingConfiguration.PDFTRON_QUEUE, message); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadProcessorService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadProcessorService.java index 20d810e22..ae653b5a2 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadProcessorService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadProcessorService.java @@ -4,7 +4,7 @@ import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service; @@ -60,14 +60,10 @@ public class DownloadProcessorService { private void addReportQueue(ReportRequestMessage reportRequestMessage, int priority) { - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.REPORT_QUEUE, objectMapper.writeValueAsString(reportRequestMessage), message -> { - message.getMessageProperties().setPriority(priority); - return message; - }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } + rabbitTemplate.convertAndSend(MessagingConfiguration.REPORT_QUEUE, reportRequestMessage, message -> { + message.getMessageProperties().setPriority(priority); + return message; + }); } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/RedactionDlqMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/RedactionDlqMessageReceiver.java index 1becab0ec..0636317ae 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/RedactionDlqMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/RedactionDlqMessageReceiver.java @@ -1,5 +1,8 @@ package com.iqser.red.service.persistence.management.v1.processor.service.download; +import java.io.IOException; + +import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Service; @@ -30,11 +33,11 @@ public class RedactionDlqMessageReceiver { @RabbitHandler - public void receive(String in) throws JsonProcessingException { + public void receive(Message message) throws IOException { // Since we receive different message types here, we do not convert to an object here; // We just assume that the message contains a downloadId. - JsonNode jsonNode = objectMapper.readTree(in); + JsonNode jsonNode = objectMapper.readTree(message.getBody()); final String downloadId; try { downloadId = jsonNode.findValue("downloadId").asText(); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/DossierTemplateExportService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/DossierTemplateExportService.java index 6a9c23372..89756d1ff 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/DossierTemplateExportService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/DossierTemplateExportService.java @@ -9,7 +9,7 @@ import java.io.InputStream; import java.util.List; import java.util.stream.Collectors; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service; @@ -101,14 +101,10 @@ public class DossierTemplateExportService { private void addToExportDownloadQueue(DownloadJob downloadJob, int priority) { - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.EXPORT_DOWNLOAD_QUEUE, objectMapper.writeValueAsString(downloadJob), message -> { - message.getMessageProperties().setPriority(priority); - return message; - }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } + rabbitTemplate.convertAndSend(MessagingConfiguration.EXPORT_DOWNLOAD_QUEUE, downloadJob, message -> { + message.getMessageProperties().setPriority(priority); + return message; + }); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/ExportDownloadMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/ExportDownloadMessageReceiver.java index dc7204a51..85b8af4f6 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/ExportDownloadMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/ExportDownloadMessageReceiver.java @@ -19,13 +19,11 @@ import lombok.extern.slf4j.Slf4j; public class ExportDownloadMessageReceiver { private final DossierTemplateExportService dossierTemplateService; - private final ObjectMapper objectMapper; @RabbitHandler - public void receive(String in) throws JsonProcessingException { + public void receive(DownloadJob downloadJob) throws JsonProcessingException { - DownloadJob downloadJob = objectMapper.readValue(in, DownloadJob.class); log.info("Preparing export download for userId: {} and storageId: {}", downloadJob.getUserId(), downloadJob.getStorageId()); dossierTemplateService.createDownloadArchive(downloadJob); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/AutomaticAnalysisJob.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/AutomaticAnalysisJob.java index 624bb17d9..7b54535ad 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/AutomaticAnalysisJob.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/AutomaticAnalysisJob.java @@ -10,10 +10,11 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; +import com.knecon.fforesight.tenantcommons.TenantContext; +import com.knecon.fforesight.tenantcommons.TenantProvider; +import com.knecon.fforesight.tenantcommons.model.UpdateDetailsRequest; import lombok.RequiredArgsConstructor; import lombok.Setter; @@ -27,7 +28,7 @@ public class AutomaticAnalysisJob implements Job { private final AmqpAdmin amqpAdmin; private final FileManagementServiceSettings fileManagementServiceSettings; private final FileStatusService fileStatusService; - private final TenantRepository tenantRepository; + private final TenantProvider tenantProvider; @Setter private boolean schedulingStopped; @@ -41,7 +42,8 @@ public class AutomaticAnalysisJob implements Job { return; } - tenantRepository.findAll().forEach(tenant -> { + tenantProvider.getTenants().forEach(tenant -> { + tenantProvider.updateDetails(tenant.getTenantId(), UpdateDetailsRequest.builder().key("persistence-service-ready").value(true).build()); TenantContext.setTenantId(tenant.getTenantId()); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/DeletedFilesCleanupJob.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/DeletedFilesCleanupJob.java index 03f5d1950..b1cb42dfe 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/DeletedFilesCleanupJob.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/DeletedFilesCleanupJob.java @@ -12,8 +12,8 @@ import com.iqser.red.service.persistence.management.v1.processor.service.Applica import com.iqser.red.service.persistence.management.v1.processor.service.DossierService; import com.iqser.red.service.persistence.management.v1.processor.service.FileService; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.knecon.fforesight.tenantcommons.TenantContext; +import com.knecon.fforesight.tenantcommons.TenantProvider; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -27,13 +27,13 @@ public class DeletedFilesCleanupJob implements Job { private final FileStatusService fileStatusService; private final FileService fileService; private final ApplicationConfigService applicationConfigService; - private final TenantRepository tenantRepository; + private final TenantProvider tenantProvider; @Override public void execute(JobExecutionContext jobExecutionContext) { - tenantRepository.findAll().forEach(tenant -> { + tenantProvider.getTenants().forEach(tenant -> { TenantContext.setTenantId(tenant.getTenantId()); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/DownloadCleanupJob.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/DownloadCleanupJob.java index e1a4acd06..866728660 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/DownloadCleanupJob.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/DownloadCleanupJob.java @@ -10,11 +10,10 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.download.DownloadStatusEntity; import com.iqser.red.service.persistence.management.v1.processor.service.ApplicationConfigService; -import com.iqser.red.service.persistence.management.v1.processor.service.DossierService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DownloadStatusPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; +import com.knecon.fforesight.tenantcommons.TenantProvider; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -26,15 +25,14 @@ public class DownloadCleanupJob implements Job { private final DownloadStatusPersistenceService downloadStatusPersistenceService; private final StorageService storageService; - private final DossierService dossierService; private final ApplicationConfigService applicationConfigService; - private final TenantRepository tenantRepository; + private final TenantProvider tenantProvider; @Override public void execute(JobExecutionContext jobExecutionContext) { - tenantRepository.findAll().forEach(tenant -> { + tenantProvider.getTenants().forEach(tenant -> { TenantContext.setTenantId(tenant.getTenantId()); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/KeyCloakUserSyncJob.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/KeyCloakUserSyncJob.java index 183ea3c0d..a1289e7a4 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/KeyCloakUserSyncJob.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/KeyCloakUserSyncJob.java @@ -3,10 +3,9 @@ package com.iqser.red.service.persistence.management.v1.processor.service.job; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; -import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; -import com.iqser.red.service.persistence.management.v1.processor.job.KeyCloakUserSyncService; +import com.iqser.red.service.persistence.management.v1.processor.service.KeyCloakUserSyncService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/SendNotificationEmailJob.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/SendNotificationEmailJob.java index 8f8a681fc..41f8f8219 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/SendNotificationEmailJob.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/SendNotificationEmailJob.java @@ -11,9 +11,9 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationEmailService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPreferencesPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.EmailNotificationType; +import com.knecon.fforesight.tenantcommons.TenantContext; +import com.knecon.fforesight.tenantcommons.TenantProvider; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -26,13 +26,13 @@ public class SendNotificationEmailJob implements Job { private final NotificationEmailService notificationEmailService; private final NotificationPersistenceService notificationPersistenceService; private final NotificationPreferencesPersistenceService notificationPreferencesPersistenceService; - private final TenantRepository tenantRepository; + private final TenantProvider tenantProvider; @Override public void execute(JobExecutionContext jobExecutionContext) { - tenantRepository.findAll().forEach(tenant -> { + tenantProvider.getTenants().forEach(tenant -> { TenantContext.setTenantId(tenant.getTenantId()); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/SyncUserPermissionsJob.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/SyncUserPermissionsJob.java index 4fb45a2e2..f082ae448 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/SyncUserPermissionsJob.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/SyncUserPermissionsJob.java @@ -3,12 +3,11 @@ package com.iqser.red.service.persistence.management.v1.processor.service.job; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; -import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.acl.custom.service.CustomPermissionService; -import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.knecon.fforesight.tenantcommons.TenantContext; +import com.knecon.fforesight.tenantcommons.TenantProvider; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -20,14 +19,14 @@ public class SyncUserPermissionsJob implements Job { private final CustomPermissionService customPermissionService; - private final TenantManagementService tenantManagementService; + private final TenantProvider tenantProvider; @Override public void execute(JobExecutionContext context) throws JobExecutionException { var singleTenant = context.getJobDetail().getJobDataMap() != null ? context.getJobDetail().getJobDataMap().get("tenantId") : null; - tenantManagementService.getTenants().forEach(tenant -> { + tenantProvider.getTenants().forEach(tenant -> { // if it's for a single tenant run only for that one, else run it for all tenants if (tenant.getTenantId().equals(singleTenant) || singleTenant == null) { TenantContext.setTenantId(tenant.getTenantId()); @@ -37,4 +36,5 @@ public class SyncUserPermissionsJob implements Job { }); } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AuditPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AuditPersistenceService.java index 2d3aa2447..840ff9c6e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AuditPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AuditPersistenceService.java @@ -9,7 +9,7 @@ import java.time.OffsetDateTime; import java.time.temporal.ChronoUnit; import java.util.List; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.beans.BeanUtils; import org.springframework.data.domain.Page; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java index 4b6d3f5bd..28d6c7904 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java @@ -7,7 +7,7 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributeConfigPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributeConfigPersistenceService.java index 9ad086e2a..907b02907 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributeConfigPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributeConfigPersistenceService.java @@ -7,7 +7,7 @@ import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.text.WordUtils; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributePersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributePersistenceService.java index faee140ab..ac2ec9e67 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributePersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributePersistenceService.java @@ -2,7 +2,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis import java.util.List; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierStatusPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierStatusPersistenceService.java index c1417d4f4..2ddbff1c7 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierStatusPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierStatusPersistenceService.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java index e2d4ffc30..21454b2aa 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DownloadStatusPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DownloadStatusPersistenceService.java index 538960fa3..a32bb81d4 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DownloadStatusPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DownloadStatusPersistenceService.java @@ -7,7 +7,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.stereotype.Service; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/EntryPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/EntryPersistenceService.java index 31b5eee33..278d5e103 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/EntryPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/EntryPersistenceService.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.stereotype.Service; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileAttributeConfigPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileAttributeConfigPersistenceService.java index 9e7cb4e76..a0f7a0956 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileAttributeConfigPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileAttributeConfigPersistenceService.java @@ -11,7 +11,7 @@ import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.text.WordUtils; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java index 5557c015a..e366f59dd 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java @@ -8,7 +8,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/LegalBasisMappingPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/LegalBasisMappingPersistenceService.java index 572199ee9..26616d99c 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/LegalBasisMappingPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/LegalBasisMappingPersistenceService.java @@ -7,7 +7,7 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.stereotype.Service; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPersistenceService.java index a6af880e4..e6a4940d8 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPersistenceService.java @@ -4,7 +4,7 @@ import java.time.OffsetDateTime; import java.time.temporal.ChronoUnit; import java.util.List; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPreferencesPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPreferencesPersistenceService.java index 0ebf575e6..87233efcb 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPreferencesPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPreferencesPersistenceService.java @@ -7,7 +7,7 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.beans.BeanUtils; import org.springframework.dao.DataIntegrityViolationException; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ReportTemplatePersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ReportTemplatePersistenceService.java index 682cc72b9..e321e9d88 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ReportTemplatePersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ReportTemplatePersistenceService.java @@ -4,7 +4,7 @@ import java.time.OffsetDateTime; import java.time.temporal.ChronoUnit; import java.util.List; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.stereotype.Service; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/RulesPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/RulesPersistenceService.java index e763dac89..ea6a23836 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/RulesPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/RulesPersistenceService.java @@ -1,6 +1,6 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persistence; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.stereotype.Service; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/SMTPConfigurationService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/SMTPConfigurationService.java deleted file mode 100644 index 69c3b17a7..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/SMTPConfigurationService.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.service.persistence; - -import javax.transaction.Transactional; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.SMTPConfigurationEntity; -import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; -import com.iqser.red.service.persistence.management.v1.processor.service.EmailService; -import com.iqser.red.service.persistence.management.v1.processor.service.EncryptionDecryptionService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.SMTPRepository; -import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.SMTPConfiguration; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -@RequiredArgsConstructor -public class SMTPConfigurationService { - - private final static String DEFAULT_PASSWORD = "********"; - private final EncryptionDecryptionService encryptionDecryptionService; - private final SMTPRepository smtpRepository; - private final EmailService emailService; - - - public void updateSMTPConfiguration(SMTPConfiguration smtpConfiguration) { - - updatePassword(smtpConfiguration); - saveConfiguration(MagicConverter.convert(smtpConfiguration, SMTPConfigurationEntity.class)); - } - - - private void updatePassword(SMTPConfiguration smtpConfiguration) { - - if (DEFAULT_PASSWORD.equals(smtpConfiguration.getPassword())) { - try { - var currentSMTPConfig = getCurrentSMTPConfiguration(false); - smtpConfiguration.setPassword(currentSMTPConfig.getPassword()); - } catch (Exception e) { - log.debug("No current SMTP Config exists", e); - } - } else { - smtpConfiguration.setPassword(encryptionDecryptionService.encrypt(smtpConfiguration.getPassword())); - } - } - - - private SMTPConfigurationEntity saveConfiguration(SMTPConfigurationEntity smtpConfiguration) { - - return smtpRepository.save(smtpConfiguration); - } - - - public SMTPConfiguration getCurrentSMTPConfiguration(boolean maskPassword) { - - var smtpConfiguration = getConfiguration(); - if (smtpConfiguration.isAuth() && maskPassword) { - smtpConfiguration.setPassword(DEFAULT_PASSWORD); - } - return MagicConverter.convert(smtpConfiguration, SMTPConfiguration.class); - } - - - private SMTPConfigurationEntity getConfiguration() { - - return smtpRepository.findById(SMTPConfigurationEntity.ID).orElseThrow(() -> new NotFoundException("SMTP Configuration not found")); - } - - - public void testSMTPConfiguration(String testEmail, SMTPConfiguration smtpConfiguration) { - - String targetEmail = null; - if (StringUtils.isBlank(testEmail)) { - // will send e-mail to self in case testEmail is not set - targetEmail = smtpConfiguration.getFrom(); - } else { - targetEmail = testEmail; - } - - updatePassword(smtpConfiguration); - smtpConfiguration.setPassword(encryptionDecryptionService.decrypt(smtpConfiguration.getPassword())); - emailService.send(smtpConfiguration, targetEmail, "Redaction Test Message", "This is a test message"); - } - - - @Transactional - public void deleteConfiguration() { - - smtpRepository.deleteById(SMTPConfigurationEntity.ID); - } - - - @Transactional - public void encryptPasswordIfNecessary() { - - var smtpConfigurationOptional = smtpRepository.findById(SMTPConfigurationEntity.ID); - - if (smtpConfigurationOptional.isPresent()) { - var smtpConfiguration = smtpConfigurationOptional.get(); - try { - // this makes the migration idempotent, since an exception will be thrown if the password can't be decrypted - // this prevents double encryption if the migration runs more than once - - encryptionDecryptionService.decrypt(smtpConfiguration.getPassword()); - log.info("SMTP Password for id {} is already encrypted", smtpConfiguration.getId()); - } catch (Exception e) { - log.info("Encrypting SMTP Password for id {}", smtpConfiguration.getId()); - smtpConfiguration.setPassword(encryptionDecryptionService.encrypt(smtpConfiguration.getPassword())); - } - } else { - log.info("NO SMPT Configuration present for migration!"); - } - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ViewedPagesPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ViewedPagesPersistenceService.java index ffaacfc2c..5a52208ca 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ViewedPagesPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ViewedPagesPersistenceService.java @@ -3,7 +3,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis import java.time.OffsetDateTime; import java.util.List; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.stereotype.Service; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/CommentPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/CommentPersistenceService.java index 350fb885b..0a31941b7 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/CommentPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/CommentPersistenceService.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Service; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/CurrentTenantIdentifierResolverImpl.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/CurrentTenantIdentifierResolverImpl.java index 5d8fbd475..b06f3222d 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/CurrentTenantIdentifierResolverImpl.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/CurrentTenantIdentifierResolverImpl.java @@ -3,7 +3,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis import org.hibernate.context.spi.CurrentTenantIdentifierResolver; import org.springframework.stereotype.Component; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.knecon.fforesight.tenantcommons.TenantContext; @Component("currentTenantIdentifierResolver") public class CurrentTenantIdentifierResolverImpl implements CurrentTenantIdentifierResolver { @@ -27,4 +27,4 @@ public class CurrentTenantIdentifierResolverImpl implements CurrentTenantIdentif return true; } -} \ No newline at end of file +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/DevDataProvider.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/DevDataProvider.java new file mode 100644 index 000000000..384567b54 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/DevDataProvider.java @@ -0,0 +1,92 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Stream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Service; + +import com.iqser.red.service.persistence.management.v1.processor.migration.AsyncMigrationStarterService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateImportService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest; +import com.knecon.fforesight.tenantcommons.TenantContext; + +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@Profile("dev") +public class DevDataProvider { + + @Autowired + private AsyncMigrationStarterService asyncMigrationStarterService; + + + public void importDossierTemplatesToTenant(String tenantId){ + TenantContext.setTenantId(tenantId); + asyncMigrationStarterService.runForTenant(tenantId); + if(dossierTemplateRepository.count() == 0) { + executeImport(); + } + TenantContext.clear(); + } + + @Autowired + private DossierTemplateImportService dossierTemplateImportService; + + @Autowired + private DossierTemplateRepository dossierTemplateRepository; + + public byte[] pack(String sourceDirPath) throws IOException { + + var bos = new ByteArrayOutputStream(); + var p = Paths.get(sourceDirPath); + try (ZipOutputStream zs = new ZipOutputStream(bos)) { + Stream paths = Files.walk(p); + { + paths.filter(path -> !Files.isDirectory(path)).forEach(path -> { + ZipEntry zipEntry = new ZipEntry(p.relativize(path).toString()); + try { + zs.putNextEntry(zipEntry); + Files.copy(path, zs); + zs.closeEntry(); + } catch (IOException e) { + System.err.println(e); + } + }); + } + } + + return bos.toByteArray(); + + } + + @SneakyThrows + private void executeImport() { + + var importDir = new File("/Users/timobejan/work/dossier-templates-v2/dev"); + + + for (var file : importDir.listFiles()) { + if(file.isDirectory()){ + var archive = pack(file.getAbsolutePath()); + log.info("Importing file: " + file.getName() + " " + " with size: " + archive.length); + var request = new ImportDossierTemplateRequest(); + request.setArchive(archive); + request.setUpdateExistingDossierTemplate(false); + request.setUserId("system"); + dossierTemplateImportService.importDossierTemplate(request); + } + } + } +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/DynamicDataSourceBasedMultiTenantConnectionProvider.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/DynamicDataSourceBasedMultiTenantConnectionProvider.java index 28d86e9e4..7f7c9ae17 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/DynamicDataSourceBasedMultiTenantConnectionProvider.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/DynamicDataSourceBasedMultiTenantConnectionProvider.java @@ -5,24 +5,21 @@ import java.sql.SQLException; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import javax.sql.DataSource; import org.hibernate.engine.jdbc.connections.spi.AbstractDataSourceBasedMultiTenantConnectionProviderImpl; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.stereotype.Component; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.cache.RemovalListener; -import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.TenantEntity; -import com.iqser.red.service.persistence.management.v1.processor.service.EncryptionDecryptionService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.SchemaConnection; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; import com.iqser.red.service.persistence.management.v1.processor.settings.TenantHikariSettings; import com.iqser.red.service.persistence.management.v1.processor.utils.jdbc.JDBCUtils; +import com.knecon.fforesight.tenantcommons.EncryptionDecryptionService; +import com.knecon.fforesight.tenantcommons.TenantProvider; import com.zaxxer.hikari.HikariDataSource; import lombok.RequiredArgsConstructor; @@ -35,11 +32,9 @@ public class DynamicDataSourceBasedMultiTenantConnectionProvider extends Abstrac private static final String TENANT_POOL_NAME_SUFFIX = "DataSource"; - private final DataSource masterDataSource; - private final DataSourceProperties masterDataSourceProperties; - private final TenantRepository masterTenantRepository; private final EncryptionDecryptionService encryptionService; private final TenantHikariSettings tenantHikariSettings; + private final TenantProvider tenantProvider; @Value("${multitenancy.datasource-cache.maximumSize:100}") private Long maximumSize; @@ -58,7 +53,7 @@ public class DynamicDataSourceBasedMultiTenantConnectionProvider extends Abstrac connectionPerTenant = CacheBuilder.newBuilder().maximumSize(maximumSize).expireAfterAccess(expireAfterAccess, TimeUnit.MINUTES).build(new CacheLoader<>() { public SchemaConnection load(String key) { - TenantEntity tenant = masterTenantRepository.findByTenantId(key).orElseThrow(() -> new RuntimeException("No such tenant: " + key)); + var tenant = tenantProvider.getTenant(key); var jdbcUrl = JDBCUtils.buildJdbcUrl(tenant.getDatabaseConnection()); return SchemaConnection.builder().jdbcUrl(jdbcUrl).databaseConnection(tenant.getDatabaseConnection()).build(); } @@ -104,7 +99,7 @@ public class DynamicDataSourceBasedMultiTenantConnectionProvider extends Abstrac @Override protected DataSource selectAnyDataSource() { - return masterDataSource; + return null; } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/MultiTenantDataSource.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/MultiTenantDataSource.java index 193ced519..fc96bcbd7 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/MultiTenantDataSource.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/MultiTenantDataSource.java @@ -12,7 +12,7 @@ import javax.sql.DataSource; import org.springframework.stereotype.Component; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.RequiredArgsConstructor; @@ -22,42 +22,51 @@ public class MultiTenantDataSource implements DataSource { private final DynamicDataSourceBasedMultiTenantConnectionProvider dsd; - private DataSource getActiveDataSource(){ + + private DataSource getActiveDataSource() { + return dsd.selectDataSource(TenantContext.getTenantId()); } + @Override public Connection getConnection() throws SQLException { + return dsd.getConnection(TenantContext.getTenantId()); } @Override public Connection getConnection(String username, String password) throws SQLException { - return getActiveDataSource().getConnection(username,password); + + return getActiveDataSource().getConnection(username, password); } @Override public PrintWriter getLogWriter() throws SQLException { + return getActiveDataSource().getLogWriter(); } @Override public void setLogWriter(PrintWriter out) throws SQLException { + getActiveDataSource().setLogWriter(out); } @Override public void setLoginTimeout(int seconds) throws SQLException { + getActiveDataSource().setLoginTimeout(seconds); } @Override public int getLoginTimeout() throws SQLException { + return getActiveDataSource().getLoginTimeout(); } @@ -71,12 +80,14 @@ public class MultiTenantDataSource implements DataSource { @Override public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return getActiveDataSource().getParentLogger(); } @Override public ShardingKeyBuilder createShardingKeyBuilder() throws SQLException { + return DataSource.super.createShardingKeyBuilder(); } @@ -90,6 +101,7 @@ public class MultiTenantDataSource implements DataSource { @Override public boolean isWrapperFor(Class iface) throws SQLException { + return getActiveDataSource().isWrapperFor(iface); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/MultiTenantDataSourceHealthIndicator.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/MultiTenantDataSourceHealthIndicator.java new file mode 100644 index 000000000..9a77bed46 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/MultiTenantDataSourceHealthIndicator.java @@ -0,0 +1,29 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.health.Health; +import org.springframework.boot.actuate.jdbc.DataSourceHealthIndicator; +import org.springframework.stereotype.Component; + +@Component +public class MultiTenantDataSourceHealthIndicator extends DataSourceHealthIndicator { + + @Autowired + private MultiTenantDataSource multiTenantDataSource; + + + @Override + public void afterPropertiesSet() throws Exception { + + setDataSource(multiTenantDataSource); + super.afterPropertiesSet(); + } + + + @Override + protected void doHealthCheck(Health.Builder builder) throws Exception { + + builder.up().withDetail("database", "multi-tenant-setup"); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/repository/SchemaConnection.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/SchemaConnection.java similarity index 62% rename from persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/repository/SchemaConnection.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/SchemaConnection.java index 55a78e508..ac2c1b55b 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/repository/SchemaConnection.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/SchemaConnection.java @@ -1,6 +1,7 @@ -package com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository; +package com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy; -import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.DatabaseConnectionEntity; + +import com.knecon.fforesight.tenantcommons.model.DatabaseConnection; import lombok.AllArgsConstructor; import lombok.Builder; @@ -15,6 +16,6 @@ public class SchemaConnection { @EqualsAndHashCode.Include private String jdbcUrl; - private DatabaseConnectionEntity databaseConnection; + private DatabaseConnection databaseConnection; } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/TenantManagementService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/TenantManagementService.java new file mode 100644 index 000000000..245f9f784 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/TenantManagementService.java @@ -0,0 +1,182 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy; + +import static com.iqser.red.service.persistence.management.v1.processor.configuration.TenantMessagingConfiguration.PERSISTENCE_SERVICE_TENANT_CREATED_QUEUE; +import static com.iqser.red.service.persistence.management.v1.processor.configuration.UserMessagingConfiguration.PERSISTENCE_SERVICE_USER_CREATED_QUEUE; + +import java.net.URI; +import java.net.URISyntaxException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.util.Set; + +import javax.sql.DataSource; + +import org.postgresql.util.PSQLException; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.core.io.ResourceLoader; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.StatementCallback; +import org.springframework.jdbc.datasource.SingleConnectionDataSource; +import org.springframework.stereotype.Service; + +import com.iqser.red.service.persistence.management.v1.processor.migration.AsyncMigrationStarterService; +import com.iqser.red.service.persistence.management.v1.processor.service.users.events.TenantCreatedEvent; +import com.iqser.red.service.persistence.management.v1.processor.utils.jdbc.JDBCUtils; +import com.knecon.fforesight.tenantcommons.EncryptionDecryptionService; +import com.knecon.fforesight.tenantcommons.TenantProvider; +import com.knecon.fforesight.tenantcommons.model.TenantResponse; +import com.knecon.fforesight.tenantcommons.model.UpdateDetailsRequest; + +import jakarta.annotation.PostConstruct; +import liquibase.exception.LiquibaseException; +import liquibase.integration.spring.SpringLiquibase; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@EnableConfigurationProperties(LiquibaseProperties.class) +public class TenantManagementService { + + private static final Set SUPPORTED_DATABASES = Set.of("postgresql"); + private static final Set SQL_CONNECTION_ERROR_CODES = Set.of( + // connection_exception + "08000", + // connection_does_not_exist + "08003", + // connection_failure + "08006", + // invalid_catalog_name + "3D000"); + + + private final LiquibaseProperties liquibaseProperties; + private final ResourceLoader resourceLoader; + private final AsyncMigrationStarterService asyncMigrationStarterService; + private final TenantProvider tenantProvider; + private final EncryptionDecryptionService encryptionDecryptionService; + private final DevDataProvider devDataProvider; + + public TenantManagementService(@Qualifier("tenantLiquibaseProperties") LiquibaseProperties liquibaseProperties, + ResourceLoader resourceLoader, + EncryptionDecryptionService encryptionDecryptionService, + AsyncMigrationStarterService asyncMigrationStarterService, + TenantProvider tenantProvider, + @Autowired(required = false) DevDataProvider devDataProvider){ + + this.liquibaseProperties = liquibaseProperties; + this.resourceLoader = resourceLoader; + this.encryptionDecryptionService = encryptionDecryptionService; + this.asyncMigrationStarterService = asyncMigrationStarterService; + this.tenantProvider = tenantProvider; + this.devDataProvider = devDataProvider; + } + + + @SneakyThrows + @RabbitListener(queues = PERSISTENCE_SERVICE_TENANT_CREATED_QUEUE) + public void createTenant(TenantCreatedEvent tenantRequest) { + + var tenant = tenantProvider.getTenant(tenantRequest.getTenantId()); + + createSchema(tenant); + + var jdbcUrl = JDBCUtils.buildJdbcUrlWithSchema(tenant.getDatabaseConnection()); + validateJdbcUrl(jdbcUrl); + + try (Connection connection = DriverManager.getConnection(jdbcUrl, tenant.getDatabaseConnection().getUsername(), encryptionDecryptionService.decrypt(tenant.getDatabaseConnection().getPassword()))) { + DataSource tenantDataSource = new SingleConnectionDataSource(connection, false); + runLiquibase(tenantDataSource); + } catch (PSQLException e) { + handleClientException(e); + handleInternalException(e); + } + + asyncMigrationStarterService.runForTenant(tenantRequest.getTenantId()); + + tenantProvider.updateDetails(tenantRequest.getTenantId(), UpdateDetailsRequest.builder().key("persistence-service-ready").value(true).build()); + + if(devDataProvider!=null) { + devDataProvider.importDossierTemplatesToTenant(tenantRequest.getTenantId()); + } + + + } + + + private void createSchema(TenantResponse tenantRequest) { + + var jdbcUrl = JDBCUtils.buildJdbcUrl(tenantRequest.getDatabaseConnection()); + try (Connection connection = DriverManager.getConnection(jdbcUrl, + tenantRequest.getDatabaseConnection().getUsername(), + encryptionDecryptionService.decrypt(tenantRequest.getDatabaseConnection().getPassword()))) { + DataSource tenantDataSource = new SingleConnectionDataSource(connection, false); + JdbcTemplate jdbcTemplate = new JdbcTemplate(tenantDataSource); + jdbcTemplate.execute((StatementCallback) stmt -> stmt.execute("CREATE SCHEMA " + tenantRequest.getDatabaseConnection().getSchema())); + jdbcTemplate.execute((StatementCallback) stmt -> stmt.execute("GRANT USAGE ON SCHEMA " + tenantRequest.getDatabaseConnection() + .getSchema() + " TO " + tenantRequest.getDatabaseConnection().getUsername())); + } catch (Exception e) { + log.info("Could not create schema, ignoring"); + } + } + + + @SneakyThrows + private void validateJdbcUrl(String jdbcUrl) { + + try { + // just create a URI object to check if the string is a valid URI + var uri = new URI(jdbcUrl); + var subUri = new URI(uri.getSchemeSpecificPart()); + + if (uri.getScheme() == null || subUri.getScheme() == null || !uri.getScheme().equals("jdbc") || !SUPPORTED_DATABASES.contains(subUri.getScheme())) { + throw new IllegalArgumentException("Your jdbcUrl is not valid."); + } + } catch (URISyntaxException e) { + throw new IllegalArgumentException("Your jdbcUrl is not valid.", e); + } + + } + + + private void runLiquibase(DataSource dataSource) throws LiquibaseException { + + SpringLiquibase liquibase = getSpringLiquibase(dataSource); + liquibase.afterPropertiesSet(); + } + + + private void handleClientException(PSQLException e) { + + if (e.getSQLState().equals("28000") || e.getSQLState().equals("28P01")) { + throw new IllegalArgumentException("Database credentials are not correct. Please check them."); + } + if (SQL_CONNECTION_ERROR_CODES.contains(e.getSQLState())) { + throw new IllegalArgumentException("Error when connecting to tenant database. Please check the jdbcUrl parameter."); + } + } + + + private void handleInternalException(PSQLException e) { + + log.error(String.format("Connection to tenant DB failed with SQL state %s. Please check if the tenant DB is still running. " + // + "If yes please check the connection configuration.", e.getSQLState()), e); + throw new RuntimeException("Could not connect to the tenant DB. This is an internal error.", e); + } + + + protected SpringLiquibase getSpringLiquibase(DataSource dataSource) { + + SpringLiquibase liquibase = new SpringLiquibase(); + liquibase.setResourceLoader(resourceLoader); + liquibase.setDataSource(dataSource); + liquibase.setChangeLog(liquibaseProperties.getChangeLog()); + liquibase.setContexts(liquibaseProperties.getContexts()); + return liquibase; + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/repository/TenantRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/repository/TenantRepository.java deleted file mode 100644 index b1dcf06e9..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/repository/TenantRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository; - -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.TenantEntity; - -public interface TenantRepository extends JpaRepository { - - @Query("select t from TenantEntity t where t.tenantId = :tenantId") - Optional findByTenantId(@Param("tenantId") String tenantId); - -} \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java index 8894bbd2c..e67917473 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java @@ -3,7 +3,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis import java.time.OffsetDateTime; import java.util.List; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; @@ -61,7 +61,7 @@ public interface FileRepository extends JpaRepository { void updateWorkflowStatus(String fileId, WorkflowStatus workflowStatus, OffsetDateTime lastUpdated, OffsetDateTime approvalDate, boolean excludedFromAutomaticAnalysis); - @Modifying + @Modifying(clearAutomatically = true, flushAutomatically = true) @Query("update FileEntity f set f.workflowStatus = :workflowStatus, f.lastUpdated = :lastUpdated, f.approvalDate = :approvalDate " + " where f.id = :fileId") void updateWorkflowStatus(String fileId, WorkflowStatus workflowStatus, OffsetDateTime lastUpdated, OffsetDateTime approvalDate); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/SMTPRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/SMTPRepository.java deleted file mode 100644 index 8476d80f1..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/SMTPRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.SMTPConfigurationEntity; - -public interface SMTPRepository extends JpaRepository { - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java index 358c05849..5d4e7c4b6 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java @@ -61,7 +61,7 @@ public interface TypeRepository extends JpaRepository { @Modifying(clearAutomatically = true, flushAutomatically = true) - @Query("Update TypeEntity t set t.softDeletedTime = CURRENT_TIMESTAMP where t.id = :typeId") + @Query("Update TypeEntity t set t.softDeletedTime = offset_datetime where t.id = :typeId") void softDeleteTypeById(String typeId); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/EntryRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/EntryRepository.java index 6e2d09f64..9db7f0762 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/EntryRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/EntryRepository.java @@ -2,7 +2,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis import java.util.List; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/FalsePositiveEntryRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/FalsePositiveEntryRepository.java index f510e5cf1..4f1ba0c56 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/FalsePositiveEntryRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/FalsePositiveEntryRepository.java @@ -2,7 +2,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis import java.util.List; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/FalseRecommendationEntryRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/FalseRecommendationEntryRepository.java index 6220fb5b8..eed395872 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/FalseRecommendationEntryRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/FalseRecommendationEntryRepository.java @@ -2,7 +2,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis import java.util.List; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/QueryExecutor.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/QueryExecutor.java index 2f4d96f37..3582120cb 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/QueryExecutor.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/QueryExecutor.java @@ -5,9 +5,9 @@ import java.util.LinkedList; import java.util.List; import java.util.Set; -import javax.persistence.EntityManager; -import javax.persistence.Query; -import javax.transaction.Transactional; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; +import jakarta.transaction.Transactional; import org.springframework.stereotype.Component; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/UserService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/UserService.java new file mode 100644 index 000000000..e69e3d488 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/UserService.java @@ -0,0 +1,255 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.users; + +import static com.iqser.red.service.persistence.management.v1.processor.configuration.UserMessagingConfiguration.PERSISTENCE_SERVICE_USER_CREATED_QUEUE; +import static com.iqser.red.service.persistence.management.v1.processor.configuration.UserMessagingConfiguration.PERSISTENCE_SERVICE_USER_DELETED_QUEUE; +import static com.iqser.red.service.persistence.management.v1.processor.configuration.UserMessagingConfiguration.PERSISTENCE_SERVICE_USER_OWN_PROFILE_UPDATED_QUEUE; +import static com.iqser.red.service.persistence.management.v1.processor.configuration.UserMessagingConfiguration.PERSISTENCE_SERVICE_USER_ROLES_UPDATED_QUEUE; +import static com.iqser.red.service.persistence.management.v1.processor.configuration.UserMessagingConfiguration.PERSISTENCE_SERVICE_USER_STATUS_CHANGED_QUEUE; +import static com.iqser.red.service.persistence.management.v1.processor.configuration.UserMessagingConfiguration.PERSISTENCE_SERVICE_USER_UPDATED_QUEUE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles.RED_MANAGER_ROLE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles.RED_USER_ROLE; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Service; + +import com.google.common.collect.Lists; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.service.CustomPermissionService; +import com.iqser.red.service.persistence.management.v1.processor.client.tenantusermanagementservice.UsersClient; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.users.events.UserCreatedEvent; +import com.iqser.red.service.persistence.management.v1.processor.service.users.events.UserRemovedEvent; +import com.iqser.red.service.persistence.management.v1.processor.service.users.events.UserRolesUpdatedEvent; +import com.iqser.red.service.persistence.management.v1.processor.service.users.events.UserStatusToggleEvent; +import com.iqser.red.service.persistence.management.v1.processor.service.users.events.UserUpdatedEvent; +import com.iqser.red.service.persistence.management.v1.processor.service.users.events.UserUpdatedOwnProfileEvent; +import com.iqser.red.service.persistence.management.v1.processor.service.users.model.User; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AddNotificationRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationType; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; + +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class UserService { + + private final DossierManagementService dossierManagementService; + private final FileStatusManagementService fileStatusManagementService; + private final AuditPersistenceService auditPersistenceService; + private final NotificationPersistenceService notificationPersistenceService; + private final DossierACLService dossierACLService; + private final CustomPermissionService customPermissionService; + private final UsersClient usersClient; + + + + @RabbitListener(queues = PERSISTENCE_SERVICE_USER_CREATED_QUEUE) + public void userCreated(UserCreatedEvent user) { + + auditPersistenceService.audit(AuditRequest.builder() + .userId(user.getCreatingUserId()) + .objectId(user.getUser().getUserId()) + .category(AuditCategory.USER.name()) + .message("User created") + .build()); + + customPermissionService.syncAllCustomPermissions(); + + } + + @RabbitListener(queues = PERSISTENCE_SERVICE_USER_ROLES_UPDATED_QUEUE) + public void rolesUpdated(UserRolesUpdatedEvent userRolesUpdatedEvent) { + + var newRoles = userRolesUpdatedEvent.getNewRoles(); + + var isUser = userRolesUpdatedEvent.getOldRoles().contains(RED_USER_ROLE); // || currentRoles.contains(RED_MANAGER_ROLE); + var isManager = userRolesUpdatedEvent.getOldRoles().contains(RED_MANAGER_ROLE); + + if (!newRoles.contains(RED_MANAGER_ROLE) && isManager) { + removeUserFromDossiers(userRolesUpdatedEvent.getUser().getUserId(), UserRemovalModel.REMOVE_MANAGER); + } + + if (!newRoles.contains(RED_USER_ROLE) && !newRoles.contains(RED_MANAGER_ROLE) && isUser) { + removeUserFromDossiers(userRolesUpdatedEvent.getUser().getUserId(), UserRemovalModel.REMOVE_USER); + } + + auditPersistenceService.audit(AuditRequest.builder() + .userId(userRolesUpdatedEvent.getModifyingUserId()) + .objectId(userRolesUpdatedEvent.getUser().getUserId()) + .category(AuditCategory.USER.name()) + .message("Roles updated for user") + .details(Map.of("CurrentRoles", newRoles)) + .build()); + } + + + private void removeUserFromDossiers(String userId, UserRemovalModel mode) { + + dossierManagementService.getAllDossiers(true, true).forEach(dossier -> { + + dossierACLService.enhanceDossierWithACLData(dossier); + + updateDossierUsers(userId, mode, dossier); + }); + + } + + + public void updateDossierUsers(String userId, UserRemovalModel mode, Dossier dossier) { + + if (mode == UserRemovalModel.REMOVE_USER || mode == UserRemovalModel.PERMANENT) { + // remove from members in case we removed the user role or we permanently removed this user + dossier.getMemberIds().remove(userId); + dossier.getApproverIds().remove(userId); + } + fileStatusManagementService.getAllDossierStatus(dossier.getId()).forEach(fileStatus -> { + if (userId.equals(fileStatus.getAssignee()) && (mode == UserRemovalModel.REMOVE_USER || mode == UserRemovalModel.PERMANENT)) { + fileStatusManagementService.setCurrentFileAssignee(dossier.getId(), fileStatus.getId(), null); + } + }); + + if (userId.equals(dossier.getOwnerId()) && (mode == UserRemovalModel.REMOVE_MANAGER || mode == UserRemovalModel.PERMANENT)) { + dossier.setOwnerId(null); + + dossier.getMemberIds() + .forEach(member -> notificationPersistenceService.insertNotification(AddNotificationRequest.builder() + .userId(member) + .issuerId(KeycloakSecurity.getUserId()) + .notificationType(NotificationType.DOSSIER_OWNER_DELETED.name()) + .target(Map.of("dossierId", dossier.getId())) + .build())); + } + + dossierManagementService.updateDossier(CreateOrUpdateDossierRequest.builder() + .dossierTemplateId(dossier.getDossierTemplateId()) + .dossierName(dossier.getDossierName()) + .description(dossier.getDescription()) + .dossierTemplateId(dossier.getDossierTemplateId()) + .downloadFileTypes(dossier.getDownloadFileTypes()) + .dueDate(dossier.getDueDate()) + .reportTemplateIds(Lists.newArrayList(dossier.getReportTemplateIds())) + .watermarkId(dossier.getWatermarkId()) + .previewWatermarkId(dossier.getPreviewWatermarkId()) + .dossierStatusId(dossier.getDossierStatusId()) + .build(), dossier.getId()); + + dossierACLService.updateDossierACL(dossier.getMemberIds(), dossier.getApproverIds(), dossier.getOwnerId(), dossier.getId()); + } + + + @RabbitListener(queues = PERSISTENCE_SERVICE_USER_OWN_PROFILE_UPDATED_QUEUE) + public void myProfileUpdated(UserUpdatedOwnProfileEvent userUpdatedOwnProfileEvent) { + + auditPersistenceService.audit(AuditRequest.builder() + .userId(userUpdatedOwnProfileEvent.getUser().getUserId()) + .objectId(userUpdatedOwnProfileEvent.getUser().getUserId()) + .category(AuditCategory.USER.name()) + .message("Profile updated for user") + .details(Map.of("Profile", userUpdatedOwnProfileEvent.getUser())) + .build()); + } + + @RabbitListener(queues = PERSISTENCE_SERVICE_USER_DELETED_QUEUE) + public void userRemoved(UserRemovedEvent userRemovedEvent) { + + removeUserFromDossiers(userRemovedEvent.getUser().getUserId(), UserRemovalModel.PERMANENT); + + customPermissionService.syncAllCustomPermissions(); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(userRemovedEvent.getDeletingUserId()) + .objectId(userRemovedEvent.getUser().getUserId()) + .category(AuditCategory.USER.name()) + .message("User removed") + .build()); + + } + + + /* + * If a user is deleted via Keycloak, the user ist still in the RedactManager database, thus we have to clean this + */ + public Set removeDeletedUsers(@NotNull Set userIds) { + + var users = usersClient.getAllUsers(true); + Set deletedUsers = new HashSet<>(); + + for (String userId : userIds) { + if (users.stream().filter(u -> u.getUserId().equalsIgnoreCase(userId)).findAny().isEmpty()) { + log.info("Will delete {} user", userId); + + removeUserFromDossiers(userId, UserRemovalModel.PERMANENT); + + auditPersistenceService.audit(AuditRequest.builder().objectId(userId).category(AuditCategory.USER.name()).message("User removed automatically").build()); + deletedUsers.add(userId); + } + } + + customPermissionService.syncAllCustomPermissions(); + return deletedUsers; + } + + + @RabbitListener(queues = PERSISTENCE_SERVICE_USER_UPDATED_QUEUE) + public void userUpdated(UserUpdatedEvent userUpdatedEvent) { + + auditPersistenceService.audit(AuditRequest.builder() + .userId(userUpdatedEvent.getModifyingUserId()) + .objectId(userUpdatedEvent.getUser().getUserId()) + .category(AuditCategory.USER.name()) + .message("Profile updated for user") + .details(Map.of("Profile", userUpdatedEvent.getUser())) + .build()); + } + + + @RabbitListener(queues = PERSISTENCE_SERVICE_USER_STATUS_CHANGED_QUEUE) + public void userStatusToggled(UserStatusToggleEvent userStatusToggleEvent) { + + auditPersistenceService.audit(AuditRequest.builder() + .userId(userStatusToggleEvent.getModifyingUserId()) + .objectId(userStatusToggleEvent.getUser().getUserId()) + .category(AuditCategory.USER.name()) + .message("Profile activated/deactivated for user") + .details(Map.of("Profile activated", userStatusToggleEvent.getUser().isActive())) + .build()); + + } + + + public Optional getUserById(String userId) { + + return usersClient.getAllUsers(false).stream().filter(u -> u.getUserId().equalsIgnoreCase(userId)).findAny(); + } + + + public List getUsersByIds(Set actualMemberIds) { + return usersClient.getAllUsers(false).stream().filter(u -> actualMemberIds.contains(u.getUserId())).collect(Collectors.toList()); + } + + + public enum UserRemovalModel { + PERMANENT, + REMOVE_MANAGER, + REMOVE_USER + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/TenantCreatedEvent.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/TenantCreatedEvent.java new file mode 100644 index 000000000..2836ec388 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/TenantCreatedEvent.java @@ -0,0 +1,14 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.users.events; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TenantCreatedEvent { + + private String tenantId; + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserCreatedEvent.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserCreatedEvent.java new file mode 100644 index 000000000..46d913afe --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserCreatedEvent.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.users.events; + + +import com.iqser.red.service.persistence.management.v1.processor.service.users.model.User; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserCreatedEvent { + + private User user; + private String creatingUserId; + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserRemovedEvent.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserRemovedEvent.java new file mode 100644 index 000000000..b934fd839 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserRemovedEvent.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.users.events; + + +import com.iqser.red.service.persistence.management.v1.processor.service.users.model.User; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserRemovedEvent { + + private User user; + private String deletingUserId; + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserRolesUpdatedEvent.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserRolesUpdatedEvent.java new file mode 100644 index 000000000..7cb8d1200 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserRolesUpdatedEvent.java @@ -0,0 +1,21 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.users.events; + +import java.util.Set; + +import com.iqser.red.service.persistence.management.v1.processor.service.users.model.User; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserRolesUpdatedEvent { + + private User user; + private Set oldRoles; + private Set newRoles; + private String modifyingUserId; + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserStatusToggleEvent.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserStatusToggleEvent.java new file mode 100644 index 000000000..dec2cd79c --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserStatusToggleEvent.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.users.events; + + +import com.iqser.red.service.persistence.management.v1.processor.service.users.model.User; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserStatusToggleEvent { + + private User user; + private String modifyingUserId; + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserUpdatedEvent.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserUpdatedEvent.java new file mode 100644 index 000000000..2f9e51e7b --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserUpdatedEvent.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.users.events; + + +import com.iqser.red.service.persistence.management.v1.processor.service.users.model.User; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserUpdatedEvent { + + private User user; + private String modifyingUserId; + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserUpdatedOwnProfileEvent.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserUpdatedOwnProfileEvent.java new file mode 100644 index 000000000..abe09d66d --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/events/UserUpdatedOwnProfileEvent.java @@ -0,0 +1,17 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.users.events; + + +import com.iqser.red.service.persistence.management.v1.processor.service.users.model.User; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserUpdatedOwnProfileEvent { + + private User user; + +} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/model/User.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/model/User.java similarity index 86% rename from persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/model/User.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/model/User.java index 47882f690..40338067e 100644 --- a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/model/User.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/model/User.java @@ -1,4 +1,4 @@ -package com.iqser.red.keycloak.commons.model; +package com.iqser.red.service.persistence.management.v1.processor.service.users.model; import java.io.Serializable; import java.util.Set; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONDownloadFileTypeConverter.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONDownloadFileTypeConverter.java index 6ac017194..a8a4e1337 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONDownloadFileTypeConverter.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONDownloadFileTypeConverter.java @@ -3,8 +3,8 @@ package com.iqser.red.service.persistence.management.v1.processor.utils; import java.util.HashSet; import java.util.Set; -import javax.persistence.AttributeConverter; -import javax.persistence.Converter; +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONIntegerSetConverter.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONIntegerSetConverter.java index 3d251f25e..141ba7abe 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONIntegerSetConverter.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONIntegerSetConverter.java @@ -3,8 +3,8 @@ package com.iqser.red.service.persistence.management.v1.processor.utils; import java.util.HashSet; import java.util.Set; -import javax.persistence.AttributeConverter; -import javax.persistence.Converter; +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONMapConverter.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONMapConverter.java index 684702abb..5571bf82b 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONMapConverter.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONMapConverter.java @@ -3,8 +3,8 @@ package com.iqser.red.service.persistence.management.v1.processor.utils; import java.util.HashMap; import java.util.Map; -import javax.persistence.AttributeConverter; -import javax.persistence.Converter; +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONStoredFileInformationConverter.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONStoredFileInformationConverter.java index 794a66761..aca69a293 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONStoredFileInformationConverter.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONStoredFileInformationConverter.java @@ -3,8 +3,8 @@ package com.iqser.red.service.persistence.management.v1.processor.utils; import java.util.HashSet; import java.util.Set; -import javax.persistence.AttributeConverter; -import javax.persistence.Converter; +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONStringSetConverter.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONStringSetConverter.java index 668f2150f..9d1b8d0f8 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONStringSetConverter.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONStringSetConverter.java @@ -3,8 +3,8 @@ package com.iqser.red.service.persistence.management.v1.processor.utils; import java.util.HashSet; import java.util.Set; -import javax.persistence.AttributeConverter; -import javax.persistence.Converter; +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/MagicConverter.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/MagicConverter.java index 98e4b4bca..fd46cade2 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/MagicConverter.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/MagicConverter.java @@ -7,7 +7,7 @@ import java.util.List; import java.util.Set; import java.util.function.BiConsumer; -import javax.persistence.EmbeddedId; +import jakarta.persistence.EmbeddedId; import org.springframework.beans.BeanUtils; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCUtils.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCUtils.java index 5aecbbbbd..19b95d652 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCUtils.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCUtils.java @@ -5,39 +5,19 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.DatabaseConnectionEntity; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.DatabaseConnection; +import com.knecon.fforesight.tenantcommons.model.DatabaseConnection; import lombok.experimental.UtilityClass; @UtilityClass public class JDBCUtils { - public String buildJdbcUrl(DatabaseConnectionEntity databaseConnectionEntity) { - - StringBuilder sb = createJdbcConnectionStringBuilder(databaseConnectionEntity.getDriver(), - databaseConnectionEntity.getHost(), - databaseConnectionEntity.getPort(), - databaseConnectionEntity.getDatabase()); - - Map params = getConnectionParameters(databaseConnectionEntity); - appendParams(sb, params); - return sb.toString(); - } - - private StringBuilder createJdbcConnectionStringBuilder(String driver, String host, String port, String database) { return new StringBuilder("jdbc:").append(driver).append("://").append(host).append(':').append(port).append('/').append(database); } - private Map getConnectionParameters(DatabaseConnectionEntity databaseConnectionEntity) { - - return Optional.ofNullable(databaseConnectionEntity.getParams()).orElseGet(HashMap::new); - } - - public String buildJdbcUrl(DatabaseConnection databaseConnection) { StringBuilder sb = createJdbcConnectionStringBuilder(databaseConnection.getDriver(), @@ -86,14 +66,4 @@ public class JDBCUtils { } - public String buildJdbcUrlWithSchema(DatabaseConnectionEntity databaseConnection) { - - return createJdbcConnectionString(databaseConnection.getDriver(), - databaseConnection.getHost(), - databaseConnection.getPort(), - databaseConnection.getDatabase(), - databaseConnection.getSchema(), - getConnectionParameters(databaseConnection)); - } - } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCWriteUtils.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCWriteUtils.java index 7c71a2a32..6439933c2 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCWriteUtils.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCWriteUtils.java @@ -11,14 +11,14 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import javax.persistence.Column; -import javax.persistence.Table; -import javax.transaction.Transactional; +import jakarta.persistence.Column; +import jakarta.persistence.Table; import org.apache.commons.lang3.StringUtils; import org.springframework.core.env.Environment; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/multitenancy/TenantContext.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/multitenancy/TenantContext.java deleted file mode 100644 index b9e04a2b4..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/multitenancy/TenantContext.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public final class TenantContext { - - private static final InheritableThreadLocal currentTenant = new InheritableThreadLocal<>(); - - - public static String getTenantId() { - - return currentTenant.get(); - } - - - public static void setTenantId(String tenantId) { - - log.debug("Setting tenantId to " + tenantId); - currentTenant.set(tenantId); - } - - - public static void clear() { - - currentTenant.remove(); - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-master.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-master.yaml deleted file mode 100644 index d1fa43356..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-master.yaml +++ /dev/null @@ -1,9 +0,0 @@ -databaseChangeLog: - - include: - file: db/changelog/master/1-initial-schema.changelog.yaml - - include: - file: db/changelog/master/2-quartz.changelog.yaml - - include: - file: db/changelog/master/3-detailed-db-connection.changelog.yaml - - include: - file: db/changelog/master/4-add-unique-constraint-for-tenants-table.yaml diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml index ecd963873..dc73b14ca 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml @@ -133,6 +133,8 @@ databaseChangeLog: file: db/changelog/tenant/48-add-watermark-text-alignment.yaml - include: file: db/changelog/tenant/sql/49-add-keep_overlapping_objects.sql + - include: + file: db/changelog/tenant/sql/204-big-int-to-serial-for-remaining-tables.sql - include: file: db/changelog/tenant/50-add-file-status-error-info.yaml - include: diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/1-initial-schema.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/1-initial-schema.changelog.yaml deleted file mode 100644 index 20278bf88..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/1-initial-schema.changelog.yaml +++ /dev/null @@ -1,30 +0,0 @@ -databaseChangeLog: - - changeSet: - id: create-tenants-table - author: dom - changes: - - createTable: - columns: - - column: - constraints: - nullable: false - primaryKey: true - primaryKeyName: tenant_pkey - name: tenant_id - type: VARCHAR(255) - - column: - name: display_name - type: VARCHAR(255) - - column: - name: guid - type: VARCHAR(255) - - column: - name: username - type: VARCHAR(255) - - column: - name: password - type: VARCHAR(255) - - column: - name: jdbc_url - type: VARCHAR(255) - tableName: tenant \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/2-quartz.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/2-quartz.changelog.yaml deleted file mode 100644 index fe25d36b3..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/2-quartz.changelog.yaml +++ /dev/null @@ -1,536 +0,0 @@ -databaseChangeLog: - - changeSet: - id: 1646818341589-1 - author: timobejan (generated) - changes: - - createTable: - columns: - - column: - constraints: - nullable: false - primaryKey: true - name: SCHED_NAME - type: VARCHAR(120) - - column: - constraints: - nullable: false - primaryKey: true - name: TRIGGER_NAME - type: VARCHAR(200) - - column: - constraints: - nullable: false - primaryKey: true - name: TRIGGER_GROUP - type: VARCHAR(200) - - column: - name: BLOB_DATA - type: BYTEA - tableName: QRTZ_BLOB_TRIGGERS - - changeSet: - id: 1646818341589-2 - author: timobejan (generated) - changes: - - createTable: - columns: - - column: - constraints: - nullable: false - primaryKey: true - name: SCHED_NAME - type: VARCHAR(120) - - column: - constraints: - nullable: false - primaryKey: true - name: CALENDAR_NAME - type: VARCHAR(200) - - column: - constraints: - nullable: false - name: CALENDAR - type: BYTEA - tableName: QRTZ_CALENDARS - - changeSet: - id: 1646818341589-3 - author: timobejan (generated) - changes: - - createTable: - columns: - - column: - constraints: - nullable: false - primaryKey: true - name: SCHED_NAME - type: VARCHAR(120) - - column: - constraints: - nullable: false - primaryKey: true - name: TRIGGER_NAME - type: VARCHAR(200) - - column: - constraints: - nullable: false - primaryKey: true - name: TRIGGER_GROUP - type: VARCHAR(200) - - column: - constraints: - nullable: false - name: CRON_EXPRESSION - type: VARCHAR(200) - - column: - name: TIME_ZONE_ID - type: VARCHAR(80) - tableName: QRTZ_CRON_TRIGGERS - - changeSet: - id: 1646818341589-4 - author: timobejan (generated) - changes: - - createTable: - columns: - - column: - constraints: - nullable: false - primaryKey: true - name: SCHED_NAME - type: VARCHAR(120) - - column: - constraints: - nullable: false - primaryKey: true - name: ENTRY_ID - type: VARCHAR(95) - - column: - constraints: - nullable: false - name: TRIGGER_NAME - type: VARCHAR(200) - - column: - constraints: - nullable: false - name: TRIGGER_GROUP - type: VARCHAR(200) - - column: - constraints: - nullable: false - name: INSTANCE_NAME - type: VARCHAR(200) - - column: - constraints: - nullable: false - name: FIRED_TIME - type: BIGINT - - column: - constraints: - nullable: false - name: SCHED_TIME - type: BIGINT - - column: - constraints: - nullable: false - name: PRIORITY - type: INT - - column: - constraints: - nullable: false - name: STATE - type: VARCHAR(16) - - column: - name: JOB_NAME - type: VARCHAR(200) - - column: - name: JOB_GROUP - type: VARCHAR(200) - - column: - name: IS_NONCONCURRENT - type: BOOL - - column: - name: REQUESTS_RECOVERY - type: BOOL - tableName: QRTZ_FIRED_TRIGGERS - - changeSet: - id: 1646818341589-5 - author: timobejan (generated) - changes: - - createTable: - columns: - - column: - constraints: - nullable: false - primaryKey: true - name: SCHED_NAME - type: VARCHAR(120) - - column: - constraints: - nullable: false - primaryKey: true - name: JOB_NAME - type: VARCHAR(200) - - column: - constraints: - nullable: false - primaryKey: true - name: JOB_GROUP - type: VARCHAR(200) - - column: - name: DESCRIPTION - type: VARCHAR(250) - - column: - constraints: - nullable: false - name: JOB_CLASS_NAME - type: VARCHAR(250) - - column: - constraints: - nullable: false - name: IS_DURABLE - type: BOOL - - column: - constraints: - nullable: false - name: IS_NONCONCURRENT - type: BOOL - - column: - constraints: - nullable: false - name: IS_UPDATE_DATA - type: BOOL - - column: - constraints: - nullable: false - name: REQUESTS_RECOVERY - type: BOOL - - column: - name: JOB_DATA - type: BYTEA - tableName: QRTZ_JOB_DETAILS - - changeSet: - id: 1646818341589-6 - author: timobejan (generated) - changes: - - createTable: - columns: - - column: - constraints: - nullable: false - primaryKey: true - name: SCHED_NAME - type: VARCHAR(120) - - column: - constraints: - nullable: false - primaryKey: true - name: LOCK_NAME - type: VARCHAR(40) - tableName: QRTZ_LOCKS - - changeSet: - id: 1646818341589-7 - author: timobejan (generated) - changes: - - createTable: - columns: - - column: - constraints: - nullable: false - primaryKey: true - name: SCHED_NAME - type: VARCHAR(120) - - column: - constraints: - nullable: false - primaryKey: true - name: TRIGGER_GROUP - type: VARCHAR(200) - tableName: QRTZ_PAUSED_TRIGGER_GRPS - - changeSet: - id: 1646818341589-8 - author: timobejan (generated) - changes: - - createTable: - columns: - - column: - constraints: - nullable: false - primaryKey: true - name: SCHED_NAME - type: VARCHAR(120) - - column: - constraints: - nullable: false - primaryKey: true - name: INSTANCE_NAME - type: VARCHAR(200) - - column: - constraints: - nullable: false - name: LAST_CHECKIN_TIME - type: BIGINT - - column: - constraints: - nullable: false - name: CHECKIN_INTERVAL - type: BIGINT - tableName: QRTZ_SCHEDULER_STATE - - changeSet: - id: 1646818341589-9 - author: timobejan (generated) - changes: - - createTable: - columns: - - column: - constraints: - nullable: false - primaryKey: true - name: SCHED_NAME - type: VARCHAR(120) - - column: - constraints: - nullable: false - primaryKey: true - name: TRIGGER_NAME - type: VARCHAR(200) - - column: - constraints: - nullable: false - primaryKey: true - name: TRIGGER_GROUP - type: VARCHAR(200) - - column: - constraints: - nullable: false - name: REPEAT_COUNT - type: BIGINT - - column: - constraints: - nullable: false - name: REPEAT_INTERVAL - type: BIGINT - - column: - constraints: - nullable: false - name: TIMES_TRIGGERED - type: BIGINT - tableName: QRTZ_SIMPLE_TRIGGERS - - changeSet: - id: 1646818341589-10 - author: timobejan (generated) - changes: - - createTable: - columns: - - column: - constraints: - nullable: false - primaryKey: true - name: SCHED_NAME - type: VARCHAR(120) - - column: - constraints: - nullable: false - primaryKey: true - name: TRIGGER_NAME - type: VARCHAR(200) - - column: - constraints: - nullable: false - primaryKey: true - name: TRIGGER_GROUP - type: VARCHAR(200) - - column: - name: STR_PROP_1 - type: VARCHAR(512) - - column: - name: STR_PROP_2 - type: VARCHAR(512) - - column: - name: STR_PROP_3 - type: VARCHAR(512) - - column: - name: INT_PROP_1 - type: INT - - column: - name: INT_PROP_2 - type: INT - - column: - name: LONG_PROP_1 - type: BIGINT - - column: - name: LONG_PROP_2 - type: BIGINT - - column: - name: DEC_PROP_1 - type: DECIMAL(13, 4) - - column: - name: DEC_PROP_2 - type: DECIMAL(13, 4) - - column: - name: BOOL_PROP_1 - type: BOOL - - column: - name: BOOL_PROP_2 - type: BOOL - tableName: QRTZ_SIMPROP_TRIGGERS - - changeSet: - id: 1646818341589-11 - author: timobejan (generated) - changes: - - createTable: - columns: - - column: - constraints: - nullable: false - primaryKey: true - name: SCHED_NAME - type: VARCHAR(120) - - column: - constraints: - nullable: false - primaryKey: true - name: TRIGGER_NAME - type: VARCHAR(200) - - column: - constraints: - nullable: false - primaryKey: true - name: TRIGGER_GROUP - type: VARCHAR(200) - - column: - constraints: - nullable: false - name: JOB_NAME - type: VARCHAR(200) - - column: - constraints: - nullable: false - name: JOB_GROUP - type: VARCHAR(200) - - column: - name: DESCRIPTION - type: VARCHAR(250) - - column: - name: NEXT_FIRE_TIME - type: BIGINT - - column: - name: PREV_FIRE_TIME - type: BIGINT - - column: - name: PRIORITY - type: INT - - column: - constraints: - nullable: false - name: TRIGGER_STATE - type: VARCHAR(16) - - column: - constraints: - nullable: false - name: TRIGGER_TYPE - type: VARCHAR(8) - - column: - constraints: - nullable: false - name: START_TIME - type: BIGINT - - column: - name: END_TIME - type: BIGINT - - column: - name: CALENDAR_NAME - type: VARCHAR(200) - - column: - name: MISFIRE_INSTR - type: SMALLINT - - column: - name: JOB_DATA - type: BYTEA - tableName: QRTZ_TRIGGERS - - changeSet: - id: 1646818341589-95 - author: timobejan (generated) - changes: - - createIndex: - columns: - - column: - name: SCHED_NAME - - column: - name: JOB_NAME - - column: - name: JOB_GROUP - indexName: SCHED_NAME - tableName: QRTZ_TRIGGERS - - changeSet: - id: 1646818341589-218 - author: timobejan (generated) - changes: - - addForeignKeyConstraint: - baseColumnNames: SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP - baseTableName: QRTZ_BLOB_TRIGGERS - constraintName: QRTZ_BLOB_TRIGGERS_ibfk_1 - deferrable: false - initiallyDeferred: false - onDelete: RESTRICT - onUpdate: RESTRICT - referencedColumnNames: SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP - referencedTableName: QRTZ_TRIGGERS - validate: true - - changeSet: - id: 1646818341589-219 - author: timobejan (generated) - changes: - - addForeignKeyConstraint: - baseColumnNames: SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP - baseTableName: QRTZ_CRON_TRIGGERS - constraintName: QRTZ_CRON_TRIGGERS_ibfk_1 - deferrable: false - initiallyDeferred: false - onDelete: RESTRICT - onUpdate: RESTRICT - referencedColumnNames: SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP - referencedTableName: QRTZ_TRIGGERS - validate: true - - changeSet: - id: 1646818341589-220 - author: timobejan (generated) - changes: - - addForeignKeyConstraint: - baseColumnNames: SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP - baseTableName: QRTZ_SIMPLE_TRIGGERS - constraintName: QRTZ_SIMPLE_TRIGGERS_ibfk_1 - deferrable: false - initiallyDeferred: false - onDelete: RESTRICT - onUpdate: RESTRICT - referencedColumnNames: SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP - referencedTableName: QRTZ_TRIGGERS - validate: true - - changeSet: - id: 1646818341589-221 - author: timobejan (generated) - changes: - - addForeignKeyConstraint: - baseColumnNames: SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP - baseTableName: QRTZ_SIMPROP_TRIGGERS - constraintName: QRTZ_SIMPROP_TRIGGERS_ibfk_1 - deferrable: false - initiallyDeferred: false - onDelete: RESTRICT - onUpdate: RESTRICT - referencedColumnNames: SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP - referencedTableName: QRTZ_TRIGGERS - validate: true - - changeSet: - id: 1646818341589-222 - author: timobejan (generated) - changes: - - addForeignKeyConstraint: - baseColumnNames: SCHED_NAME,JOB_NAME,JOB_GROUP - baseTableName: QRTZ_TRIGGERS - constraintName: QRTZ_TRIGGERS_ibfk_1 - deferrable: false - initiallyDeferred: false - onDelete: RESTRICT - onUpdate: RESTRICT - referencedColumnNames: SCHED_NAME,JOB_NAME,JOB_GROUP - referencedTableName: QRTZ_JOB_DETAILS - validate: true diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/3-detailed-db-connection.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/3-detailed-db-connection.changelog.yaml deleted file mode 100644 index aa9ff0b46..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/3-detailed-db-connection.changelog.yaml +++ /dev/null @@ -1,82 +0,0 @@ -databaseChangeLog: - - changeSet: - id: detailed-db-connection - author: dom - changes: - - deleteColumn: - columns: - - column: - name: jdbc_url - tableName: tenant - - addColumn: - columns: - - column: - name: db_driver - type: VARCHAR(255) - - column: - name: db_host - type: VARCHAR(255) - - column: - name: db_port - type: VARCHAR(255) - - column: - name: db_database - type: VARCHAR(255) - - column: - name: db_schema - type: VARCHAR(255) - - column: - name: db_params - type: VARCHAR(255) - - column: - name: db_username - type: VARCHAR(255) - - column: - name: db_password - type: VARCHAR(255) - - column: - name: search_hosts - type: VARCHAR(255) - - column: - name: search_port - type: VARCHAR(255) - - column: - name: search_scheme - type: VARCHAR(255) - - column: - name: search_username - type: VARCHAR(255) - - column: - name: search_password - type: VARCHAR(255) - - column: - name: search_number_of_shards - type: VARCHAR(255) - - column: - name: search_number_of_replicas - type: VARCHAR(255) - - column: - name: storage_azure_connection_string - type: VARCHAR(1024) - - column: - name: storage_azure_container_name - type: VARCHAR(255) - - column: - name: storage_s3_key - type: VARCHAR(255) - - column: - name: storage_s3_secret - type: VARCHAR(255) - - column: - name: storage_s3_signer_type - type: VARCHAR(255) - - column: - name: storage_s3_bucket_name - type: VARCHAR(255) - - column: - name: storage_s3_region - type: VARCHAR(255) - - column: - name: storage_s3_endpoint - type: VARCHAR(255) - tableName: tenant diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/4-add-unique-constraint-for-tenants-table.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/4-add-unique-constraint-for-tenants-table.yaml deleted file mode 100644 index 27baab89c..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/4-add-unique-constraint-for-tenants-table.yaml +++ /dev/null @@ -1,17 +0,0 @@ -databaseChangeLog: - - changeSet: - id: add-unique-constraint-for-tenants-table - author: corinaolariu - changes: - - addUniqueConstraint: - columnNames: db_host, db_schema - constraintName: unique_constraint_tenant_host_shema - tableName: tenant - - addUniqueConstraint: - columnNames: storage_s3_endpoint, storage_s3_region, storage_s3_bucket_name - constraintName: unique_constraint_tenant_s3_storage - tableName: tenant - - addUniqueConstraint: - columnNames: storage_azure_connection_string, storage_azure_container_name - constraintName: unique_constraint_tenant_azure_storage - tableName: tenant diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/13-file-manual-change-date.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/13-file-manual-change-date.changelog.yaml index 1604808f6..aeacd5775 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/13-file-manual-change-date.changelog.yaml +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/13-file-manual-change-date.changelog.yaml @@ -3,9 +3,10 @@ databaseChangeLog: id: add-file-manual-change-date-column author: timo changes: - - removeColumn: + - dropColumn: columns: - - name: last_manual_redaction + - column: + name: last_manual_redaction tableName: file - addColumn: columns: diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/15-dossier-remove-dossier-state.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/15-dossier-remove-dossier-state.changelog.yaml index 9a5896cac..aff74b7c9 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/15-dossier-remove-dossier-state.changelog.yaml +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/15-dossier-remove-dossier-state.changelog.yaml @@ -3,7 +3,7 @@ databaseChangeLog: id: dossier-remove-dossier-state-column author: corina changes: - - removeColumn: + - dropColumn: columns: - name: dossier_status tableName: dossier diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/36-revert-reports-information-column.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/36-revert-reports-information-column.changelog.yaml index b3400dc7c..3cf0e4215 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/36-revert-reports-information-column.changelog.yaml +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/36-revert-reports-information-column.changelog.yaml @@ -3,7 +3,7 @@ databaseChangeLog: id: remove-reports-information-column author: dom changes: - - removeColumn: + - dropColumn: columns: - column: name: generated_reports_information diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/8-remove-old-dossier-status-column.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/8-remove-old-dossier-status-column.changelog.yaml index 16c459e42..a7dd75f92 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/8-remove-old-dossier-status-column.changelog.yaml +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/8-remove-old-dossier-status-column.changelog.yaml @@ -3,7 +3,7 @@ databaseChangeLog: id: remove-dossier-status-numeric-column author: timo changes: - - removeColumn: + - dropColumn: columns: - column: name: status diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/204-big-int-to-serial-for-remaining-tables.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/204-big-int-to-serial-for-remaining-tables.sql new file mode 100644 index 000000000..10c8f49f0 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/204-big-int-to-serial-for-remaining-tables.sql @@ -0,0 +1,13 @@ +ALTER TABLE audit + ALTER record_id ADD GENERATED ALWAYS AS IDENTITY; +ALTER TABLE comment + ALTER id ADD GENERATED ALWAYS AS IDENTITY; +ALTER TABLE migration + ALTER id ADD GENERATED ALWAYS AS IDENTITY; +ALTER TABLE notification + ALTER id ADD GENERATED ALWAYS AS IDENTITY; + +SELECT setval(pg_get_serial_sequence('audit', 'record_id'), (select coalesce(max(record_id) + 1, 1) from audit)); +SELECT setval(pg_get_serial_sequence('comment', 'id'), (select coalesce(max(id) + 1, 1) from comment)); +SELECT setval(pg_get_serial_sequence('migration', 'id'), (select coalesce(max(id) + 1, 1) from migration)); +SELECT setval(pg_get_serial_sequence('notification', 'id'), (select coalesce(max(id) + 1, 1) from notification)); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/test/resources/application.yml b/persistence-service-v1/persistence-service-processor-v1/src/test/resources/application.yml index e69de29bb..719c2c8ba 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/test/resources/application.yml +++ b/persistence-service-v1/persistence-service-processor-v1/src/test/resources/application.yml @@ -0,0 +1,8 @@ +spring: + datasource: + hikari: + validation-timeout: +springdoc: + packages-to-scan: + + diff --git a/persistence-service-v1/persistence-service-server-v1/pom.xml b/persistence-service-v1/persistence-service-server-v1/pom.xml index 83c7df98c..04f582d7b 100644 --- a/persistence-service-v1/persistence-service-server-v1/pom.xml +++ b/persistence-service-v1/persistence-service-server-v1/pom.xml @@ -23,12 +23,7 @@ persistence-service-processor-v1 ${project.version} - - org.keycloak - keycloak-admin-client - ${keycloak.version} - compile - + org.springframework.amqp @@ -43,19 +38,6 @@ - - - com.github.dasniko - testcontainers-keycloak - 2.3.0 - test - - - keycloak-admin-client - org.keycloak - - - org.springframework.security spring-security-test @@ -78,11 +60,6 @@ log4j-slf4j-impl test - - org.liquibase - liquibase-core - 4.3.1 - com.yannbriancon spring-hibernate-query-utils @@ -101,12 +78,6 @@ ${project.version} compile - - org.keycloak - keycloak-common - ${keycloak.version} - compile - @@ -117,7 +88,6 @@ lombok.launch.AnnotationProcessorHider$AnnotationProcessor - com.dslplatform.json.processor.CompiledJsonAnnotationProcessor diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java index 1cbdfc0f9..63175a881 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java @@ -1,14 +1,13 @@ package com.iqser.red.service.peristence.v1.server; -import org.keycloak.adapters.springboot.KeycloakSpringBootProperties; import org.springframework.boot.SpringApplication; import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration; -import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cache.annotation.EnableCaching; @@ -19,22 +18,22 @@ import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -import com.giffing.bucket4j.spring.boot.starter.config.webflux.Bucket4JAutoConfigurationWebfluxFilter; -import com.iqser.red.keycloak.commons.DefaultKeyCloakCommonsConfiguration; -import com.iqser.red.keycloak.commons.KeyCloakSettings; -import com.iqser.red.persistence.service.v1.external.api.impl.PersistenceServiceExternalApiConfiguration; -import com.iqser.red.persistence.service.v1.external.api.impl.swagger.SwaggerAutoConfiguration; import com.iqser.red.service.dictionarymerge.commons.DictionaryMergeService; + +import com.iqser.red.persistence.service.v1.external.api.impl.PersistenceServiceExternalApiConfiguration; import com.iqser.red.service.persistence.management.v1.processor.PersistenceServiceProcessorConfiguration; import com.iqser.red.service.persistence.management.v1.processor.cache.PersistenceServiceExternalApiCacheConfiguration; -import com.iqser.red.service.persistence.management.v1.processor.configuration.CleanupDownloadSchedulerConfiguration; import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; -import com.iqser.red.service.persistence.management.v1.processor.multitenancy.AsyncConfig; -import com.iqser.red.service.persistence.management.v1.processor.multitenancy.MultiTenancyMessagingConfiguration; -import com.iqser.red.service.persistence.management.v1.processor.multitenancy.MultiTenancyWebConfiguration; import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; import com.iqser.red.service.persistence.v1.internal.api.PersistenceServiceInternalApiConfiguration; +import com.iqser.red.storage.commons.StorageAutoConfiguration; +import com.knecon.fforesight.jobscommons.JobsAutoConfiguration; +import com.knecon.fforesight.keycloakcommons.DefaultKeyCloakCommonsAutoConfiguration; +import com.knecon.fforesight.swaggercommons.SpringDocAutoConfiguration; +import com.knecon.fforesight.tenantcommons.AsyncConfig; +import com.knecon.fforesight.tenantcommons.MultiTenancyAutoConfiguration; +import com.knecon.fforesight.tenantcommons.MultiTenancyMessagingConfiguration; +import com.knecon.fforesight.tenantcommons.MultiTenancyWebConfiguration; import io.micrometer.core.aop.TimedAspect; import io.micrometer.core.instrument.MeterRegistry; @@ -45,9 +44,10 @@ import lombok.extern.slf4j.Slf4j; @EnableRetry @EnableScheduling @EnableCaching -@EnableConfigurationProperties({KeyCloakSettings.class, KeycloakSpringBootProperties.class, FileManagementServiceSettings.class}) -@SpringBootApplication(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class, CassandraAutoConfiguration.class, DataSourceAutoConfiguration.class, LiquibaseAutoConfiguration.class, QuartzAutoConfiguration.class, Bucket4JAutoConfigurationWebfluxFilter.class,}) -@Import({PersistenceServiceExternalApiConfiguration.class, PersistenceServiceInternalApiConfiguration.class, SwaggerAutoConfiguration.class, DefaultKeyCloakCommonsConfiguration.class, PersistenceServiceExternalApiCacheConfiguration.class, MultiTenancyWebConfiguration.class, PersistenceServiceProcessorConfiguration.class, MessagingConfiguration.class, CleanupDownloadSchedulerConfiguration.class, AsyncConfig.class, MultiTenancyMessagingConfiguration.class}) +@EnableConfigurationProperties({FileManagementServiceSettings.class}) +@ImportAutoConfiguration({StorageAutoConfiguration.class, JobsAutoConfiguration.class, MultiTenancyAutoConfiguration.class, SpringDocAutoConfiguration.class, DefaultKeyCloakCommonsAutoConfiguration.class}) +@SpringBootApplication(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class, CassandraAutoConfiguration.class, DataSourceAutoConfiguration.class, LiquibaseAutoConfiguration.class}) +@Import({PersistenceServiceExternalApiConfiguration.class, PersistenceServiceInternalApiConfiguration.class, PersistenceServiceExternalApiCacheConfiguration.class, MultiTenancyWebConfiguration.class, PersistenceServiceProcessorConfiguration.class, MessagingConfiguration.class, AsyncConfig.class, MultiTenancyMessagingConfiguration.class}) public class Application { /** @@ -84,6 +84,7 @@ public class Application { }; } + @Bean public DictionaryMergeService dictionaryMergeService() { diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/DevConfiguration.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/DevConfiguration.java deleted file mode 100644 index 13fee5f79..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/DevConfiguration.java +++ /dev/null @@ -1,202 +0,0 @@ -package com.iqser.red.service.peristence.v1.server; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.sql.Connection; -import java.sql.DriverManager; -import java.util.Set; -import java.util.UUID; -import java.util.stream.Stream; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -import javax.annotation.PostConstruct; -import javax.sql.DataSource; - -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.StatementCallback; -import org.springframework.jdbc.datasource.SingleConnectionDataSource; - -import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateImportService; -import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.DatabaseConnection; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.S3StorageConnection; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.SearchConnection; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantRequest; - -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Profile("dev") -@Configuration -public class DevConfiguration { - - @Autowired - private TenantManagementService tenantManagementService; - - @Autowired - @Qualifier("masterDataSource") - private DataSource dataSource; - - @Value("${multitenancy.master.datasource.url:}") - private String masterJDBCURL; - - - @PostConstruct - - public void createDefaultTenant() { - - log.info("Creating Redaction Tenant"); - - if (tenantManagementService.getTenants().isEmpty()) { - - var jdbcUrl = masterJDBCURL.substring(0, masterJDBCURL.lastIndexOf('/') + 1) + "redaction?currentSchema=myschema"; - - createDatabase("redaction", "redaction"); - createSchema(jdbcUrl, "redaction", "redaction"); - - - var tenantRequest = TenantRequest.builder() - .tenantId("redaction") - .displayName("Redaction default") - .guid(UUID.randomUUID().toString()) - .databaseConnection(DatabaseConnection.builder() - .driver("postgresql") - .host("localhost") - .port("5432") - .database("redaction") - .schema("myschema") - .username("redaction") - .password("redaction") - .build()) - .searchConnection(SearchConnection.builder() - .hosts(Set.of("localhost")) - .port(9200) - .scheme("http") - .username("elastic") - .numberOfShards("1") - .numberOfReplicas("5") - .build()) - .s3StorageConnection(S3StorageConnection.builder() - .key("minioadmin") - .secret("minioadmin") - .bucketName("redaction") - .endpoint("http://localhost:9000") - .build()) - .build(); - - tenantManagementService.createTenant(tenantRequest); - - } - - TenantContext.setTenantId("redaction"); - if(dossierTemplateRepository.count() == 0) { - testDossierTemplateImport(); - } - } - - - @Autowired - private DossierTemplateImportService dossierTemplateImportService; - - @Autowired - private DossierTemplateRepository dossierTemplateRepository; - - public byte[] pack(String sourceDirPath) throws IOException { - - var bos = new ByteArrayOutputStream(); - var p = Paths.get(sourceDirPath); - try (ZipOutputStream zs = new ZipOutputStream(bos)) { - Stream paths = Files.walk(p); - { - paths.filter(path -> !Files.isDirectory(path)).forEach(path -> { - ZipEntry zipEntry = new ZipEntry(p.relativize(path).toString()); - try { - zs.putNextEntry(zipEntry); - Files.copy(path, zs); - zs.closeEntry(); - } catch (IOException e) { - System.err.println(e); - } - }); - } - } - - return bos.toByteArray(); - - } - - @SneakyThrows - public void testDossierTemplateImport() { - - var importDir = new File("/Users/timobejan/work/dossier-templates-v2/dev"); - - TenantContext.setTenantId("redaction"); - for (var file : importDir.listFiles()) { - if(file.isDirectory()){ - var archive = pack(file.getAbsolutePath()); - log.info("Importing file: " + file.getName() + " " + " with size: " + archive.length); - var request = new ImportDossierTemplateRequest(); - request.setArchive(archive); - request.setUpdateExistingDossierTemplate(false); - request.setUserId("system"); - dossierTemplateImportService.importDossierTemplate(request); - } - } - } - - @SneakyThrows - public void createSchema(String jdbcUrl, String username, String password) { - - try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password)) { - DataSource tenantDataSource = new SingleConnectionDataSource(connection, false); - JdbcTemplate insert = new JdbcTemplate(tenantDataSource); - try { - insert.execute((StatementCallback) stmt -> stmt.execute("CREATE SCHEMA myschema")); - } catch (Exception e) { - log.warn("schema already exists"); - } - try { - insert.execute((StatementCallback) stmt -> stmt.execute("GRANT USAGE ON SCHEMA myschema TO " + username)); - } catch (Exception e) { - log.warn("grant invalid"); - } - } - } - - - private void createDatabase(String db, String password) { - - var jdbcTemplate = new JdbcTemplate(dataSource); - try { - jdbcTemplate.execute((StatementCallback) stmt -> stmt.execute("CREATE DATABASE " + db)); - } catch (Exception e) { - log.warn("DB already exists"); - } - try { - jdbcTemplate.execute((StatementCallback) stmt -> stmt.execute("CREATE USER " + db + " WITH ENCRYPTED PASSWORD '" + password + "'")); - } catch (Exception e) { - log.warn("user already exists"); - } - try { - jdbcTemplate.execute((StatementCallback) stmt -> stmt.execute("GRANT ALL PRIVILEGES ON DATABASE " + db + " TO " + db)); - } catch (Exception e) { - log.warn("grant invalid"); - } - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/application-dev.yaml b/persistence-service-v1/persistence-service-server-v1/src/main/resources/application-dev.yaml new file mode 100644 index 000000000..c49a6fac7 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/main/resources/application-dev.yaml @@ -0,0 +1,37 @@ +server: + port: 8085 + +redaction-service.url: "http://localhost:8083" +pdftron-redaction-service.url: "http://localhost:8086" +redaction-report-service.url: "http://localhost:8084" +search-service.url: "http://localhost:8088" +tenant-user-management-service.url: "http://localhost:8091/internal" + + +multitenancy: + datasource-cache: + maximumSize: 100 + expireAfterAccess: 1 + tenant: + datasource: + driverClassName: org.postgresql.Driver + hikari: + data-source-properties: + cachePrepStmts: true + prepStmtCacheSize: 1000 + prepStmtCacheSqlLimit: 2048 + liquibase: + changeLog: classpath:db/changelog/db.changelog-tenant.yaml + +monitoring:enabled: true +cors.enabled: true + + +persistence-service: + imageServiceEnabled: false + nerServiceEnabled: false + storeImageFile: false + applicationName: RedactManager +fforesight: + springdoc: + auth-server-url: 'http://localhost:8080/auth' diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/application-dev.yml b/persistence-service-v1/persistence-service-server-v1/src/main/resources/application-dev.yml deleted file mode 100644 index 6132a6dda..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/application-dev.yml +++ /dev/null @@ -1,79 +0,0 @@ -server: - port: 8085 - -redaction-service.url: "http://localhost:8083" -pdftron-redaction-service.url: "http://localhost:8086" -redaction-report-service.url: "http://localhost:8084" -search-service.url: "http://localhost:8088" - -storage: - bucket-name: 'redaction' - endpoint: 'http://localhost:9000' - key: minioadmin - secret: minioadmin - -multitenancy: - datasource-cache: - maximumSize: 100 - expireAfterAccess: 1 - master: - datasource: - url: jdbc:postgresql://${PSQL_HOST:localhost}:${PSQL_PORT:5432}/${PSQL_DATABASE:master}?currentSchema=${PSQL_SCHEMA:public}&cachePrepStmts=true&useServerPrepStmts=true&rewriteBatchedStatements=true - driverClassName: org.postgresql.Driver - username: ${PSQL_USERNAME:redaction} - password: ${PSQL_PASSWORD:redaction} - platform: org.hibernate.dialect.PostgreSQL95Dialect - hikari: - data-source-properties: - cachePrepStmts: true - prepStmtCacheSize: 1000 - prepStmtCacheSqlLimit: 2048 - liquibase: - changeLog: classpath:db/changelog/db.changelog-master.yaml - tenant: - datasource: - driverClassName: org.postgresql.Driver - hikari: - data-source-properties: - cachePrepStmts: true - prepStmtCacheSize: 1000 - prepStmtCacheSqlLimit: 2048 - liquibase: - changeLog: classpath:db/changelog/db.changelog-tenant.yaml - -monitoring:enabled: true - -token.issuer: '' - -keycloak: - enabled: true - sslRequired: none - auth-server-url: http://localhost:8080 - realm: redaction - resource: redaction - disableTrustManager: true - useResourceRoleMappings: true - - - - -commons: - keycloak: - applicationClientId: redaction - clientId: redaction - clientSecret: G5E1qLU8ZNdDv7HY5BNLPdt5nXdeF7cU - realm: redaction - serverUrl: http://localhost:8080 - issuer: '' - - -cors.enabled: true - - -persistence-service: - imageServiceEnabled: false - nerServiceEnabled: false - storeImageFile: false - applicationName: RedactManager -swagger: - enabled: true diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yml b/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yaml similarity index 57% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yml rename to persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yaml index fc2e39edd..4dd7d3dd1 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yml +++ b/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yaml @@ -5,6 +5,7 @@ redaction-service.url: "http://redaction-service-v1:8080" pdftron-redaction-service.url: "http://pdftron-redaction-service-v1:8080" redaction-report-service.url: "http://redaction-report-service-v1:8080" search-service.url: "http://search-service-v1:8080" +tenant-user-management-service.url: "http://tenant-user-management-service:8080/internal" server: port: 8080 @@ -51,24 +52,13 @@ spring: max-attempts: 3 max-interval: 15000 prefetch: 1 - - liquibase: - change-log: classpath:/db/changelog/db.changelog-master.yaml - quartz: - overwrite-existing-jobs: true - jdbc: - initialize-schema: never - properties: - org: - quartz: - jobStore: - class: org.springframework.scheduling.quartz.LocalDataSourceJobStore - clusterCheckinInterval: 1000 - isClustered: true - driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate - scheduler: - instanceId: AUTO - job-store-type: JDBC + application: + name: persistence-service + data: + redis: + host: ${REDIS_HOST:localhost} + port: ${REDIS_PORT:6379} + password: ${REDIS_PASSWORD:} management: endpoint: @@ -77,6 +67,9 @@ management: health.enabled: true endpoints.web.exposure.include: prometheus, health, metrics metrics.export.prometheus.enabled: ${monitoring.enabled:false} + health: + db: + enabled: false metrics: persistence: @@ -89,22 +82,6 @@ multitenancy: datasource-cache: maximumSize: 100 expireAfterAccess: 1 - master: - datasource: - url: jdbc:postgresql://${PSQL_HOST:localhost}:${PSQL_PORT:5432}/${PSQL_DATABASE:master}?currentSchema=${PSQL_SCHEMA:external}&cachePrepStmts=true&useServerPrepStmts=true&rewriteBatchedStatements=true - driverClassName: org.postgresql.Driver - username: ${PSQL_USERNAME:redaction} - password: ${PSQL_PASSWORD:redaction} - platform: org.hibernate.dialect.PostgreSQL95Dialect - hikari: - maximumPoolSize: 2 - minimum-idle: 2 - data-source-properties: - cachePrepStmts: true - prepStmtCacheSize: 1000 - prepStmtCacheSqlLimit: 2048 - liquibase: - changeLog: classpath:db/changelog/db.changelog-master.yaml tenant: datasource: driverClassName: org.postgresql.Driver @@ -132,41 +109,31 @@ bucket4j: unit: seconds -keycloak: - sslRequired: none - auth-server-url: https://red-staging.iqser.cloud/auth - realm: master - resource: redaction - disableTrustManager: true - useResourceRoleMappings: true - enabled: true +springdoc.packages-to-scan: [ 'com.iqser.red.persistence.service.v1.external.api' ] -commons: +fforesight: keycloak: - applicationClientId: ${keycloak.resource:redaction} - clientId: ${keycloak.client.id} - clientSecret: ${keycloak.client.secret} - realm: ${keycloak.realm} - serverUrl: ${keycloak.auth-server-url} - issuer: ${token.issuer} + ignored-endpoints: [ '/redaction-gateway-v1','/actuator/health/**', '/redaction-gateway-v1/async/download/with-ott/**', + '/internal-api/**', + '/redaction-gateway-v1/docs/**','/redaction-gateway-v1/docs','/redaction-gateway-v1/tenants/simple' ] + enabled: true + springdoc: + base-path: '/redaction-gateway-v1' + auth-server-url: ${keycloak.auth-server-url} + enabled: true + default-client-id: 'swagger-ui-client' + tenant-exchange: + name: 'tenants-exchange' + user-exchange: + name: 'users-exchange' + jobs: + datasource: + url: jdbc:postgresql://${PSQL_HOST:localhost}:${PSQL_PORT:5432}/${PSQL_DATABASE:master}?cachePrepStmts=true&useServerPrepStmts=true&rewriteBatchedStatements=true + driverClassName: org.postgresql.Driver + username: ${PSQL_USERNAME:fforesight} + password: ${PSQL_PASSWORD:fforesight} + platform: org.hibernate.dialect.PostgreSQL95Dialect + enabled: true + tenants: + remote: true - - -springdoc: - swagger-ui: - path: /redaction-gateway-v1/docs/swagger-ui - operations-sorter: alpha - tags-sorter: alpha - oauth: - client-id: swagger-ui-client - doc-expansion: none - enabled: ${swagger.enabled} - config-url: /redaction-gateway-v1/docs/swagger-config - api-docs: - path: /redaction-gateway-v1/docs?tenantId=redaction - enabled: ${swagger.enabled} - pre-loading-enabled: true - packages-to-scan: [ 'com.iqser.red.persistence.service.v1.external.api' ] - -swagger: - enabled: true diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/SMTPClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/SMTPClient.java deleted file mode 100644 index 5d4a85e46..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/SMTPClient.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.integration.client; - -import org.springframework.cloud.openfeign.FeignClient; - -import com.iqser.red.service.persistence.service.v1.api.external.resource.SMTPConfigurationResource; - -@FeignClient(name = "SMTPClient", url = "http://localhost:${server.port}") -public interface SMTPClient extends SMTPConfigurationResource { - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/TenantsClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/TenantsClient.java deleted file mode 100644 index e55cfbb3d..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/TenantsClient.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.integration.client; - -import org.springframework.cloud.openfeign.FeignClient; - -import com.iqser.red.service.persistence.service.v1.api.external.resource.TenantsResource; - -@FeignClient(name = "TenantsClient", url = "http://localhost:${server.port}") -public interface TenantsClient extends TenantsResource { - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTesterAndProvider.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTesterAndProvider.java index e3f4b3c02..a0ef0809a 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTesterAndProvider.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTesterAndProvider.java @@ -11,12 +11,12 @@ import org.springframework.stereotype.Service; import com.google.common.collect.Sets; import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierStatusInfo; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/UserProvider.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/UserProvider.java index 9408b1b32..5f86ad90a 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/UserProvider.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/UserProvider.java @@ -3,7 +3,7 @@ package com.iqser.red.service.peristence.v1.server.integration.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.iqser.red.service.persistence.management.v1.processor.service.UserService; +import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; @Service public class UserProvider { @@ -12,24 +12,15 @@ public class UserProvider { private UserService userService; public String getUserId(){ - return this.getUserIdByUsername("manageradmin1"); + return "manageradmin1@test.com"; } public String getAltUserId(){ - return this.getUserIdByUsername("manageradmin2"); + return "manageradmin2@test.com"; } - public String getMemberUserId(){ - return this.getUserIdByUsername("user"); + return "manageradmin3@test.com"; } - private String getUserIdByUsername(String username) { - var userOptional = userService.getOptionalUserByUsername(username); - if(userOptional.isPresent()){ - return userOptional.get().getUserId(); - } - throw new RuntimeException("user " + username + " not created"); - - } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/CustomPermissionTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/CustomPermissionTest.java index af6060b22..7fa88c206 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/CustomPermissionTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/CustomPermissionTest.java @@ -1,6 +1,6 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; -import static com.iqser.red.keycloak.commons.roles.ActionRoles.MANAGE_ACL_PERMISSIONS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.MANAGE_ACL_PERMISSIONS; import static com.iqser.red.service.persistence.service.v1.api.external.resource.CustomPermissionMappingResource.PERMISSION_REST_PATH; import static com.iqser.red.service.persistence.service.v1.api.external.resource.CustomPermissionMappingResource.TARGET_OBJECT_VARIABLE; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DeploymentKeyTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DeploymentKeyTest.java deleted file mode 100644 index 89942b391..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DeploymentKeyTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.integration.tests; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import com.iqser.red.service.peristence.v1.server.integration.client.TenantsClient; -import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; - -public class DeploymentKeyTest extends AbstractPersistenceServerServiceTest { - - @Autowired - private TenantsClient tenantsClient; - - - @Test - public void testGetDeploymentKey() { - - String deploymentKey = tenantsClient.getDeploymentKey("redaction").getValue(); - assertThat(deploymentKey.length()).isEqualTo(16); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java index 5c071ff97..9dbd8d921 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java @@ -18,12 +18,12 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTem import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.TypeProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateTypeValue; import com.iqser.red.service.persistence.service.v1.api.shared.model.Dictionary; import com.iqser.red.service.persistence.service.v1.api.shared.model.TypeValue; import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateTypeValue; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; +import com.knecon.fforesight.tenantcommons.TenantContext; import feign.FeignException; @@ -461,7 +461,7 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { var createdType = dictionaryClient.addType(type); - var entries = createDummyEntries(40_000); + var entries = createDummyEntries(10_000); dictionaryClient.addEntry(createdType.getType(), createdType.getDossierTemplateId(), entries, false, null, DictionaryEntryType.ENTRY); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DigitalSignatureTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DigitalSignatureTest.java index 7410c4447..ff12f12d2 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DigitalSignatureTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DigitalSignatureTest.java @@ -2,6 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.assertj.core.api.Assertions.assertThat; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import org.junit.jupiter.api.Test; @@ -14,6 +15,7 @@ import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPers import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureKms; import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureViewModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignature; +import com.knecon.fforesight.tenantcommons.EncryptionDecryptionService; import feign.FeignException; import lombok.SneakyThrows; @@ -63,6 +65,9 @@ public class DigitalSignatureTest extends AbstractPersistenceServerServiceTest { } + @Autowired + private EncryptionDecryptionService encryptionDecryptionService; + @Test @SneakyThrows public void testDigitalSignatureKms() { @@ -76,6 +81,9 @@ public class DigitalSignatureTest extends AbstractPersistenceServerServiceTest { final String kmsServiceEndpoint = "kmsServiceEndpoint"; final byte[] certificate = Files.readAllBytes(new ClassPathResource("files/TestCert.cer").getFile().toPath()); + var data =encryptionDecryptionService.encrypt(new String(certificate)); + var res = encryptionDecryptionService.decrypt(data); + DigitalSignatureKms digitalSignature = DigitalSignatureKms.builder() .certificateName(certificateName) .kmsKeyId(kmsKeyId) diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatsTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatsTest.java index a40362aa4..bd3af379b 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatsTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatsTest.java @@ -19,11 +19,11 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTem import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierStats; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.knecon.fforesight.tenantcommons.TenantContext; public class DossierStatsTest extends AbstractPersistenceServerServiceTest { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportTest.java index 23a530bde..d35a78cff 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportTest.java @@ -22,10 +22,10 @@ import org.springframework.mock.web.MockMultipartFile; import com.iqser.red.service.peristence.v1.server.integration.client.DossierTemplateClient; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateManagementService; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplate; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateStatsTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateStatsTest.java index e0dbd4afc..108ffb89e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateStatsTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateStatsTest.java @@ -28,7 +28,6 @@ import com.iqser.red.service.peristence.v1.server.integration.service.FileTester import com.iqser.red.service.peristence.v1.server.integration.service.UserProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateTypeValue; import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierStatusRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; @@ -38,6 +37,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionarySummary; +import com.knecon.fforesight.tenantcommons.TenantContext; public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTest { @@ -279,38 +279,38 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe .color("#cccccc") .rank(100) .build()); - for (int j = 0; j < 8; j++) { + for (int j = 0; j < 4; j++) { var dossier = dossierTesterAndProvider.provideTestDossierQuick(template, "test dossier: " + j + " - " + i, j % 2 == 0 ? status : null); - for (int k = 0; k < 12; k++) { + for (int k = 0; k < 6; k++) { var fileId = fileTesterAndProvider.testAndProvideFileQuick(dossier, "file: " + k); - if (k % 2 == 0) { + if (k == 1){ fileStatusPersistenceService.updateProcessingStatus(fileId, k, 0L, 0L, 0L, 0L, 0L, 1, 1); reanalysisClient.excludePages(dossier.getId(), fileId, new PageExclusionRequest(List.of(new PageRange(k, k)))); } - if (k % 3 == 0) { + if (k ==2) { fileManagementClient.deleteFile(dossier.getId(), fileId); } - if (j % 5 == 0) { + if (k == 3){ fileManagementClient.hardDeleteFiles(dossier.getId(), Set.of(fileId)); } - if (j % 7 == 0) { + if (k == 4){ fileClient.setStatusUnderReview(dossier.getId(), fileId, userId); } - if (j % 11 == 0) { + if (k == 5){ fileClient.setStatusUnderApproval(dossier.getId(), fileId, userId); } } - if (j % 3 == 0) { + if (j == 1) { dossierClient.archiveDossiers(Set.of(dossier.getId())); } - if (j % 5 == 0) { + if (j == 2) { dossierClient.deleteDossier(dossier.getId()); } - if (j % 7 == 0) { + if (j == 3) { dossierClient.hardDeleteDossiers(Set.of(dossier.getId())); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java index 200baec4e..3da16c986 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java @@ -1,9 +1,5 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_MANAGER_ROLE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_ROLES; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_USER_ADMIN_ROLE; -import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_USER_ROLE; import static org.assertj.core.api.Assertions.assertThat; import java.io.InputStream; @@ -20,9 +16,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockMultipartFile; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.keycloak.commons.KeycloakSecurity; -import com.iqser.red.keycloak.commons.model.User; -import com.iqser.red.persistence.service.v1.external.api.impl.controller.UserController; import com.iqser.red.service.peristence.v1.server.integration.client.DictionaryClient; import com.iqser.red.service.peristence.v1.server.integration.client.DossierAttributeConfigClient; import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient; @@ -38,7 +31,6 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTes import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.persistence.management.v1.processor.model.DownloadJob; import com.iqser.red.service.persistence.management.v1.processor.service.export.ExportDownloadMessageReceiver; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateTypeValue; import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierAttributesConfig; import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierStatusRequest; @@ -58,6 +50,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; import feign.FeignException; import lombok.SneakyThrows; @@ -510,7 +503,7 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { assertThat(statuses.getDownloadStatus()).isNotEmpty(); var status = statuses.getDownloadStatus().iterator().next(); - exportDownloadReportMessageReceiver.receive(objectMapper.writeValueAsString(new DownloadJob(status.getUserId(), status.getStorageId()))); + exportDownloadReportMessageReceiver.receive(new DownloadJob(status.getUserId(), status.getStorageId())); // add new justifications legalBasisClient.setLegalBasisMapping(List.of(new LegalBasis("nameAgain", "description", "reason")), dossierTemplate.getId()); @@ -539,36 +532,6 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { assertThat(existingLegalBasis.isEmpty()).isTrue(); } - @Test - public void testDeleteDossierTemplate() { - - var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - - var allTemplates = dossierTemplateClient.getAllDossierTemplates(); - assertThat(allTemplates.size()).isEqualTo(1); - assertThat(allTemplates.get(0)).isEqualTo(dossierTemplate); - Optional optionalUser = userService.getOptionalUserByUsername(USERNAME); - if(optionalUser.isPresent()) { - String userId = optionalUser.get().getUserId(); - - userService.setRoles(userId, List.of(RED_USER_ROLE), RED_ROLES.stream().toList()); - Assertions.assertThrows(FeignException.BadRequest.class, () -> dossierTemplateClient.deleteDossierTemplate(dossierTemplate.getId())); - - userService.setRoles(userId, List.of(RED_MANAGER_ROLE), RED_ROLES.stream().toList()); - Assertions.assertThrows(FeignException.BadRequest.class, () -> dossierTemplateClient.deleteDossierTemplate(dossierTemplate.getId())); - - userService.setRoles(userId, List.of(RED_USER_ADMIN_ROLE), RED_ROLES.stream().toList()); - Assertions.assertThrows(FeignException.Forbidden.class, () -> dossierTemplateClient.deleteDossierTemplate(dossierTemplate.getId())); - - userService.setRoles(userId, List.of(RED_USER_ADMIN_ROLE, RED_USER_ROLE), RED_ROLES.stream().toList()); - Assertions.assertThrows(FeignException.BadRequest.class, () -> dossierTemplateClient.deleteDossierTemplate(dossierTemplate.getId())); - - userService.setRoles(userId, RED_ROLES.stream().toList(), RED_ROLES.stream().toList()); - dossierTemplateClient.deleteDossierTemplate(dossierTemplate.getId()); - allTemplates = dossierTemplateClient.getAllDossierTemplates(); - assertThat(allTemplates.size()).isZero(); - } - } @Test @SneakyThrows diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadPreparationTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadPreparationTest.java index 55c723d09..c709e6f16 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadPreparationTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadPreparationTest.java @@ -26,7 +26,6 @@ import com.iqser.red.service.peristence.v1.server.integration.service.FileTester import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.persistence.management.v1.processor.service.download.DownloadReportMessageReceiver; import com.iqser.red.service.persistence.management.v1.processor.service.download.RedactionResultMessageReceiver; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileStatus; @@ -40,6 +39,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.download.Do import com.iqser.red.service.redaction.report.v1.api.model.ReportResultMessage; import com.iqser.red.service.redaction.report.v1.api.model.StoredFileInformation; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.AccessLevel; import lombok.SneakyThrows; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadTest.java index 691b2f14a..3c8fbca2d 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadTest.java @@ -20,12 +20,12 @@ import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPers import com.iqser.red.service.persistence.management.v1.processor.model.DownloadJob; import com.iqser.red.service.persistence.management.v1.processor.service.download.DownloadMessageReceiver; import com.iqser.red.service.persistence.management.v1.processor.service.download.DownloadPreparationService; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.PrepareDownloadRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.PrepareDownloadWithOptionRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.RemoveDownloadRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.knecon.fforesight.tenantcommons.TenantContext; import feign.FeignException; import lombok.SneakyThrows; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EncryptSMTPPasswordsMigrationTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EncryptSMTPPasswordsMigrationTest.java deleted file mode 100644 index 47a6ebde7..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EncryptSMTPPasswordsMigrationTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.integration.tests; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.SMTPConfigurationEntity; -import com.iqser.red.service.persistence.management.v1.processor.migration.migrations.EncryptSMTPPasswordsMigration11; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.MigrationPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.SMTPRepository; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; - -public class EncryptSMTPPasswordsMigrationTest extends AbstractPersistenceServerServiceTest { - - @Autowired - private EncryptSMTPPasswordsMigration11 encryptSMTPPasswordsMigration11; - - @Autowired - private SMTPRepository smtpRepository; - @Autowired - private MigrationPersistenceService migrationPersistenceService; - - - @Test - public void testMigration() { - - TenantContext.setTenantId("redaction"); - migrationPersistenceService.insertMigration("test", 10); - smtpRepository.save(SMTPConfigurationEntity.builder().password("asd").build()); - encryptSMTPPasswordsMigration11.run(true); - var config1 = smtpRepository.findAll().iterator().next(); - assertThat(config1.getPassword()).isNotEqualTo("asd"); - encryptSMTPPasswordsMigration11.run(true); - var config2 = smtpRepository.findAll().iterator().next(); - assertThat(config1.getPassword()).isEqualTo(config2.getPassword()); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java index 72a81316a..62fd76586 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java @@ -27,7 +27,8 @@ import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPers import com.iqser.red.service.peristence.v1.server.integration.utils.MetricValidationUtils; import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateTypeValue; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle; @@ -47,6 +48,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlo import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.ManualRedactionType; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; +import com.knecon.fforesight.tenantcommons.TenantContext; import feign.FeignException; import lombok.SneakyThrows; @@ -394,6 +396,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { @Test @SneakyThrows public void testAddToDictionaryRequiresReanalysis() { + TenantContext.setTenantId("redaction"); var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationPreferencesServiceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationPreferencesServiceTest.java index 02132b5a9..44ad766ba 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationPreferencesServiceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationPreferencesServiceTest.java @@ -9,7 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.peristence.v1.server.integration.utils.MultithreadedTestRunner; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPreferencesPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.AccessLevel; import lombok.SneakyThrows; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationTest.java index 0c1fc5b1e..69f35d58f 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationTest.java @@ -15,11 +15,11 @@ import com.iqser.red.service.peristence.v1.server.integration.service.UserProvid import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.peristence.v1.server.integration.utils.MultithreadedTestRunner; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AddNotificationRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.Notification; import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationType; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -40,7 +40,7 @@ public class NotificationTest extends AbstractPersistenceServerServiceTest { @Autowired private UserProvider userProvider; - private final MultithreadedTestRunner multithreadedTestRunner = new MultithreadedTestRunner(2, 100); + private final MultithreadedTestRunner multithreadedTestRunner = new MultithreadedTestRunner(2, 10); @Test diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReanalysisTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReanalysisTest.java index ad05756d0..eba7943b2 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReanalysisTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReanalysisTest.java @@ -14,9 +14,9 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTes import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileStatus; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.knecon.fforesight.tenantcommons.TenantContext; public class ReanalysisTest extends AbstractPersistenceServerServiceTest { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReduceFileSizeMigrationTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReduceFileSizeMigrationTest.java index 1db7c6598..ec4261f6a 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReduceFileSizeMigrationTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReduceFileSizeMigrationTest.java @@ -11,8 +11,8 @@ import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPers import com.iqser.red.service.persistence.management.v1.processor.migration.migrations.ReduceTextFileSizeMigration10; import com.iqser.red.service.persistence.management.v1.processor.utils.FileUtils; import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.SneakyThrows; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/SMTPTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/SMTPTest.java deleted file mode 100644 index 34322e823..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/SMTPTest.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.integration.tests; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import com.iqser.red.service.peristence.v1.server.integration.client.SMTPClient; -import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.SMTPConfiguration; - -import feign.FeignException; - -public class SMTPTest extends AbstractPersistenceServerServiceTest { - - @Autowired - private SMTPClient smtpClient; - - - @Test - public void testSMTP() { - - SMTPConfiguration configuration = new SMTPConfiguration(); - configuration.setUser("test"); - configuration.setPassword("test"); - configuration.setAuth(true); - configuration.setFrom("from"); - configuration.setEnvelopeFrom("from"); - configuration.setHost("host"); - configuration.setPort(123); - configuration.setReplyTo("reply"); - configuration.setStarttls(true); - smtpClient.updateSMTPConfiguration(configuration); - - assertThat(smtpClient.getCurrentSMTPConfiguration()).isNotNull(); - - try { - smtpClient.testSMTPConfiguration(configuration); - } catch (FeignException.FeignClientException e) { - assertThat(e.status()).isEqualTo(400); - } - - smtpClient.clearSMTPConfiguration(); - - try { - smtpClient.getCurrentSMTPConfiguration(); - } catch (FeignException.FeignClientException e) { - assertThat(e.status()).isEqualTo(404); - } - - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/TenantsTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/TenantsTest.java deleted file mode 100644 index 229f1bba1..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/TenantsTest.java +++ /dev/null @@ -1,207 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.integration.tests; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.List; -import java.util.Set; -import java.util.UUID; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import com.iqser.red.keycloak.commons.roles.ApplicationRoles; -import com.iqser.red.service.peristence.v1.server.integration.client.TenantsClient; -import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.AzureStorageConnection; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.DatabaseConnection; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.RedUser; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.S3StorageConnection; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.SearchConnection; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantResponse; - -import feign.FeignException; - -public class TenantsTest extends AbstractPersistenceServerServiceTest { - - @Autowired - private TenantsClient tenantsClient; - - @Test - public void testCreateTenantWithSameHostAndSchema() { - - TenantResponse firstTenant = tenantsClient.getTenants().get(0); - - var tenantRequest = TenantRequest.builder() - .tenantId("redaction2") - .displayName("Redaction default2") - .guid(UUID.randomUUID().toString()) - .databaseConnection(DatabaseConnection.builder() - .driver("postgresql") - .host("localhost") - .port(firstTenant.getDatabaseConnection().getPort()) - .database("redaction") - .schema("myschema") - .username("redaction") - .password("redaction") - .build()) - .searchConnection(SearchConnection.builder() - .hosts(Set.of("elasticsearchHost2")) - .port(9200) - .scheme("https2") - .username("elastic") - .numberOfShards("1") - .numberOfReplicas("5") - .build()) - .s3StorageConnection(S3StorageConnection.builder() - .key("key") - .secret("secret") - .signerType("signerType") - .bucketName("bucketName2") - .region("eu") - .endpoint("endpoint2") - .build()) - .redUsers(List.of(RedUser.builder().username("user").password("password").redRoles(ApplicationRoles.ROLE_DATA.keySet()).build(), - RedUser.builder().username("manageradmin1@test.com").password("secret").redRoles(ApplicationRoles.ROLE_DATA.keySet()).build(), - RedUser.builder().username("manageradmin2@test.com").password("secret").redRoles(ApplicationRoles.ROLE_DATA.keySet()).build())) - .build(); - - Exception exception = Assertions.assertThrows(FeignException.Conflict.class, () -> { - tenantsClient.createTenant(tenantRequest); - }); - - String expectedMessage = "An object of type tenant already exists"; - String actualMessage = exception.getMessage(); - - assertThat(actualMessage).contains(expectedMessage); - - } - - @Test - public void testCreateTenantWithDuplicateStorageS3() { - - TenantResponse firstTenant = tenantsClient.getTenants().get(0); - - var tenantRequest = TenantRequest.builder() - .tenantId("redaction2") - .displayName("Redaction default2") - .guid(UUID.randomUUID().toString()) - .databaseConnection(DatabaseConnection.builder() - .driver("postgresql") - .host("localhost") - .port(firstTenant.getDatabaseConnection().getPort()) - .database("redaction") - .schema("myschema2") - .username("redaction") - .password("redaction") - .build()) - .searchConnection(SearchConnection.builder() - .hosts(Set.of("elasticsearchHost2")) - .port(9200) - .scheme("https2") - .username("elastic") - .numberOfShards("1") - .numberOfReplicas("5") - .build()) - .s3StorageConnection(S3StorageConnection.builder() - .key("key") - .secret("secret") - .signerType("signerType") - .bucketName("bucketName") - .region("eu") - .endpoint("endpoint") - .build()) - .redUsers(List.of(RedUser.builder().username("user").password("password").redRoles(ApplicationRoles.ROLE_DATA.keySet()).build(), - RedUser.builder().username("manageradmin1@test.com").password("secret").redRoles(ApplicationRoles.ROLE_DATA.keySet()).build(), - RedUser.builder().username("manageradmin2@test.com").password("secret").redRoles(ApplicationRoles.ROLE_DATA.keySet()).build())) - .build(); - - Exception exception = Assertions.assertThrows(FeignException.Conflict.class, () -> { - tenantsClient.createTenant(tenantRequest); - }); - - String expectedMessage = "An object of type tenant already exists"; - String actualMessage = exception.getMessage(); - - assertThat(actualMessage).contains(expectedMessage); - } - - @Test - public void testCreateTenantWithDuplicateAzure() { - - TenantResponse firstTenant = tenantsClient.getTenants().get(0); - - var tenantRequest = TenantRequest.builder() - .tenantId("redaction2") - .displayName("Redaction default2") - .guid(UUID.randomUUID().toString()) - .databaseConnection(DatabaseConnection.builder() - .driver("postgresql") - .host("localhost") - .port(firstTenant.getDatabaseConnection().getPort()) - .database("redaction") - .schema("myschema2") - .username("redaction") - .password("redaction") - .build()) - .searchConnection(SearchConnection.builder() - .hosts(Set.of("elasticsearchHost2")) - .port(9200) - .scheme("https2") - .username("elastic") - .numberOfShards("1") - .numberOfReplicas("5") - .build()) - .azureStorageConnection(AzureStorageConnection.builder() - .connectionString("connection") - .containerName("container") - .build()) - .redUsers(List.of(RedUser.builder().username("user").password("password").redRoles(ApplicationRoles.ROLE_DATA.keySet()).build(), - RedUser.builder().username("manageradmin1@test.com").password("secret").redRoles(ApplicationRoles.ROLE_DATA.keySet()).build(), - RedUser.builder().username("manageradmin2@test.com").password("secret").redRoles(ApplicationRoles.ROLE_DATA.keySet()).build())) - .build(); - - tenantsClient.createTenant(tenantRequest); - assertThat(tenantsClient.getTenants().size()).isEqualTo(2); - - var tenantRequest2 = TenantRequest.builder() - .tenantId("redaction2") - .displayName("Redaction default2") - .guid(UUID.randomUUID().toString()) - .databaseConnection(DatabaseConnection.builder() - .driver("postgresql") - .host("localhost") - .port(firstTenant.getDatabaseConnection().getPort()) - .database("redaction") - .schema("myschema3") - .username("redaction") - .password("redaction") - .build()) - .searchConnection(SearchConnection.builder() - .hosts(Set.of("elasticsearchHost2")) - .port(9200) - .scheme("https2") - .username("elastic") - .numberOfShards("1") - .numberOfReplicas("5") - .build()) - .azureStorageConnection(AzureStorageConnection.builder() - .connectionString("connection") - .containerName("container") - .build()) - .redUsers(List.of(RedUser.builder().username("user").password("password").redRoles(ApplicationRoles.ROLE_DATA.keySet()).build(), - RedUser.builder().username("manageradmin1@test.com").password("secret").redRoles(ApplicationRoles.ROLE_DATA.keySet()).build(), - RedUser.builder().username("manageradmin2@test.com").password("secret").redRoles(ApplicationRoles.ROLE_DATA.keySet()).build())) - .build(); - - Exception exception = Assertions.assertThrows(FeignException.Conflict.class, () -> { - tenantsClient.createTenant(tenantRequest); - }); - - String expectedMessage = "An object of type tenant already exists"; - String actualMessage = exception.getMessage(); - - assertThat(actualMessage).contains(expectedMessage); - } -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/EntityPerformanceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/EntityPerformanceTest.java index c80ec4019..279428af1 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/EntityPerformanceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/EntityPerformanceTest.java @@ -17,9 +17,9 @@ import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPers import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DictionaryEntryEntity; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.EntryRepository; import com.iqser.red.service.persistence.management.v1.processor.utils.jdbc.JDBCWriteUtils; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CloneDossierTemplateRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/FilePerformanceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/FilePerformanceTest.java index 56d9638a8..951ac17a1 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/FilePerformanceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/FilePerformanceTest.java @@ -2,15 +2,8 @@ package com.iqser.red.service.peristence.v1.server.integration.tests.performance import static org.assertj.core.api.Assertions.assertThat; -import java.time.OffsetDateTime; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; import java.util.stream.Collectors; -import org.assertj.core.util.Sets; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -18,23 +11,9 @@ import org.springframework.beans.factory.annotation.Autowired; import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient; import com.iqser.red.service.peristence.v1.server.integration.client.DossierStatsClient; import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; -import com.iqser.red.service.peristence.v1.server.integration.client.WatermarkClient; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DictionaryEntryEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; -import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.WatermarkOrientation; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeType; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.extern.slf4j.Slf4j; @@ -59,6 +38,7 @@ public class FilePerformanceTest extends AbstractPersistenceServerServiceTest { @BeforeEach public void setupTest() { + TenantContext.setTenantId("redaction"); performanceTestService.doSetup(); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/PerformanceTestService.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/PerformanceTestService.java index cb6b4765e..9fd81b952 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/PerformanceTestService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/PerformanceTestService.java @@ -7,7 +7,7 @@ import java.util.List; import java.util.Set; import java.util.UUID; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.assertj.core.util.Sets; import org.springframework.beans.factory.annotation.Autowired; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java index 4db784c4e..b1e8c377e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java @@ -2,24 +2,22 @@ package com.iqser.red.service.peristence.v1.server.integration.utils; import static org.mockito.Mockito.when; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; -import java.util.UUID; - -import javax.annotation.PostConstruct; -import javax.sql.DataSource; +import java.util.stream.Collectors; import org.assertj.core.util.Lists; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; -import org.keycloak.adapters.springboot.KeycloakSpringBootProperties; -import org.keycloak.representations.idm.ClientRepresentation; import org.mockito.Mockito; +import org.quartz.Scheduler; import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; @@ -35,25 +33,32 @@ import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Primary; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.StatementCallback; +import org.springframework.jdbc.datasource.SingleConnectionDataSource; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; -import com.iqser.red.keycloak.commons.KeyCloakAdminClientService; -import com.iqser.red.keycloak.commons.KeyCloakSettings; -import com.iqser.red.keycloak.commons.roles.ApplicationRoles; import com.iqser.red.service.peristence.v1.server.Application; import com.iqser.red.service.peristence.v1.server.integration.client.ApplicationConfigClient; import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; -import com.iqser.red.service.peristence.v1.server.integration.client.TenantsClient; import com.iqser.red.service.peristence.v1.server.utils.MetricsPrinterService; import com.iqser.red.service.persistence.management.v1.processor.client.pdftronredactionservice.PDFTronClient; import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.RedactionClient; import com.iqser.red.service.persistence.management.v1.processor.client.searchservice.SearchClient; +import com.iqser.red.service.persistence.management.v1.processor.client.tenantusermanagementservice.UsersClient; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ApplicationConfigurationEntity; +import com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles; import com.iqser.red.service.persistence.management.v1.processor.service.ApplicationConfigService; -import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.UserService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.TenantManagementService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ApplicationConfigRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.AuditRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DigitalSignatureRepository; @@ -73,7 +78,6 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.NotificationRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ReportTemplateRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.RuleSetRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.SMTPRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.TypeRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ViewedPagesRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.WatermarkRepository; @@ -86,18 +90,23 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.FalsePositiveEntryRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.FalseRecommendationEntryRepository; import com.iqser.red.service.persistence.management.v1.processor.service.redactionlog.RedactionLogMergeService; +import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; +import com.iqser.red.service.persistence.management.v1.processor.service.users.events.TenantCreatedEvent; import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.ApplicationConfig; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.DatabaseConnection; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.RedUser; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.S3StorageConnection; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.SearchConnection; -import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; -import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.EncryptionDecryptionService; +import com.knecon.fforesight.tenantcommons.TenantContext; +import com.knecon.fforesight.tenantcommons.TenantProvider; +import com.knecon.fforesight.tenantcommons.TenantsClient; +import com.knecon.fforesight.tenantcommons.model.AuthDetails; +import com.knecon.fforesight.tenantcommons.model.DatabaseConnection; +import com.knecon.fforesight.tenantcommons.model.S3StorageConnection; +import com.knecon.fforesight.tenantcommons.model.SearchConnection; +import com.knecon.fforesight.tenantcommons.model.TenantResponse; +import io.lettuce.core.RedisClient; import io.micrometer.prometheus.PrometheusMeterRegistry; import lombok.extern.slf4j.Slf4j; @@ -108,8 +117,9 @@ import lombok.extern.slf4j.Slf4j; @ContextConfiguration(initializers = {AbstractPersistenceServerServiceTest.Initializer.class}) @SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT, properties = "spring-hibernate-query-utils.n-plus-one-queries-detection.error-level=INFO") public abstract class AbstractPersistenceServerServiceTest { - protected final String USERNAME = "manageradmin1@test.com"; + @MockBean + protected Scheduler scheduler; @MockBean protected RabbitTemplate rabbitTemplate; @MockBean @@ -149,8 +159,6 @@ public abstract class AbstractPersistenceServerServiceTest { @Autowired protected WatermarkRepository watermarkRepository; @Autowired - protected SMTPRepository smtpRepository; - @Autowired protected RuleSetRepository ruleSetRepository; @Autowired protected LegalBasisMappingRepository legalBasisMappingRepository; @@ -184,31 +192,38 @@ public abstract class AbstractPersistenceServerServiceTest { protected FalseRecommendationEntryRepository falseRecommendationEntryRepository; @Autowired protected ApplicationConfigRepository applicationConfigRepository; - @Autowired - protected TenantsClient tenantsClient; - @Autowired - protected TenantRepository tenantRepository; @MockBean private RedactionClient redactionClient; @Autowired - @Qualifier("masterDataSource") - private DataSource masterDataSource; - @Autowired protected PrometheusMeterRegistry prometheusMeterRegistry; @MockBean private AmqpAdmin amqpAdmin; @Autowired private DossierStatusRepository dossierStatusRepository; @Autowired - private TenantManagementService tenantManagementService; - @Autowired private ApplicationConfigService applicationConfigService; @Autowired protected UserService userService; @Autowired private TokenService tokenService; + @MockBean + private TenantsClient tenantsClient; + @MockBean + private UsersClient usersClient; @Autowired - private KeyCloakSettings keyCloakSettings; + private EncryptionDecryptionService encryptionDecryptionService; + @Autowired + private TenantManagementService tenantManagementService; + + + private static String[] getAllRoles() { + + var allRoles = ApplicationRoles.ROLE_DATA.entrySet().stream().flatMap(entry -> entry.getValue().stream()).collect(Collectors.toSet()); + allRoles.addAll(ApplicationRoles.UNMAPPED_ACTION_ROLES); + allRoles.addAll(ApplicationRoles.ROLE_DATA.keySet()); + var rolesArray = allRoles.toArray(new String[0]); + return rolesArray; + } @BeforeEach @@ -225,29 +240,6 @@ public abstract class AbstractPersistenceServerServiceTest { } - public void createUsers() { - - TenantContext.setTenantId("redaction"); - - userService.evictUserCache(); - - var redactionSystemClient = new ClientRepresentation(); - redactionSystemClient.setEnabled(true); - redactionSystemClient.setName(keyCloakSettings.getClientId()); - redactionSystemClient.setClientId(keyCloakSettings.getClientId()); - redactionSystemClient.setSecret(keyCloakSettings.getClientSecret()); - redactionSystemClient.setDirectAccessGrantsEnabled(true); - redactionSystemClient.setServiceAccountsEnabled(true); - - KeyCloakTestContainer.getInstance().getKeycloakAdminClient().realm("redaction").clients().create(redactionSystemClient); - - tokenService.setUser(USERNAME, "secret"); - - TenantContext.clear(); - - } - - @BeforeEach public void setupOptimize() { @@ -258,76 +250,97 @@ public abstract class AbstractPersistenceServerServiceTest { ApplicationConfig appConfig = ApplicationConfig.builder().downloadCleanupDownloadFilesHours(8).downloadCleanupNotDownloadFilesHours(72).softDeleteCleanupTime(96).build(); applicationConfigService.saveApplicationConfiguration(MagicConverter.convert(appConfig, ApplicationConfigurationEntity.class)); - TenantContext.clear(); - - createUsers(); - -// when(appConfigClient.getCurrentApplicationConfig()).thenReturn(ApplicationConfig.builder() -// .downloadCleanupDownloadFilesHours(8) -// .downloadCleanupNotDownloadFilesHours(72) -// .softDeleteCleanupTime(96) + tokenService.setUser("manageradmin1@test.com", "secret"); + var allUsers = new ArrayList(); + allUsers.add(com.iqser.red.service.persistence.management.v1.processor.service.users.model.User.builder() + .userId("manageradmin1@test.com") + .email("manageradmin1@test.com") + .isActive(true) + .roles(Set.of(getAllRoles())) + .build()); + allUsers.add(com.iqser.red.service.persistence.management.v1.processor.service.users.model.User.builder() + .userId("manageradmin2@test.com") + .email("manageradmin2@test.com") + .isActive(true) + .roles(Set.of(getAllRoles())) + .build()); + allUsers.add(com.iqser.red.service.persistence.management.v1.processor.service.users.model.User.builder() + .userId("manageradmin3@test.com") + .email("manageradmin3@test.com") + .isActive(true) + .roles(Set.of(getAllRoles())) + .build()); + when(usersClient.getAllUsers(false)).thenReturn(allUsers); + when(usersClient.getAllUsers(true)).thenReturn(allUsers); // doNothing().when(pdfTronRedactionClient).testDigitalCurrentSignature(Mockito.any()); when(amqpAdmin.getQueueInfo(Mockito.any())).thenReturn(null); - when(redactionLogMergeService.provideRedactionLog(Mockito.any())).thenReturn(new RedactionLog(1, 1, Lists.newArrayList(), null, 0, 0, 0, 0)); } private void createDefaultTenant() { - if (tenantRepository.findById("redaction").isEmpty()) { - var postgreSQLContainerMaster = SpringPostgreSQLTestContainer.getInstance().withDatabaseName("integration-tests-db-master").withUsername("sa").withPassword("sa"); + var postgreSQLContainerMaster = SpringPostgreSQLTestContainer.getInstance().withDatabaseName("integration-tests-db-master").withUsername("sa").withPassword("sa"); - String jdbcUrl = postgreSQLContainerMaster.getJdbcUrl().substring(0, postgreSQLContainerMaster.getJdbcUrl().lastIndexOf('/') + 1) + "redaction?currentSchema=myschema"; - var port = postgreSQLContainerMaster.getJdbcUrl().substring(0, postgreSQLContainerMaster.getJdbcUrl().lastIndexOf('/')).split(":")[3]; + var port = postgreSQLContainerMaster.getJdbcUrl().substring(0, postgreSQLContainerMaster.getJdbcUrl().lastIndexOf('/')).split(":")[3]; - createDatabase("redaction", "redaction"); + if (tenantsClient.getTenants() == null || tenantsClient.getTenants().isEmpty()) { - var tenantRequest = TenantRequest.builder() - .tenantId("redaction") - .displayName("Redaction default") - .guid(UUID.randomUUID().toString()) - .databaseConnection(DatabaseConnection.builder() - .driver("postgresql") - .host("localhost") - .port(port) - .database("redaction") - .schema("myschema") - .username("redaction") - .password("redaction") - .build()) - .searchConnection(SearchConnection.builder() - .hosts(Set.of("elasticsearchHost")) - .port(9200) - .scheme("https") - .username("elastic") - .numberOfShards("1") - .numberOfReplicas("5") - .build()) - .s3StorageConnection(S3StorageConnection.builder() - .key("key") - .secret("secret") - .signerType("signerType") - .bucketName("bucketName") - .region("eu") - .endpoint("endpoint") - .build()) - .redUsers(List.of(RedUser.builder().username("user").password("password").redRoles(ApplicationRoles.ROLE_DATA.keySet()).build(), - RedUser.builder().username("manageradmin1@test.com").password("secret").redRoles(ApplicationRoles.ROLE_DATA.keySet()).build(), - RedUser.builder().username("manageradmin2@test.com").password("secret").redRoles(ApplicationRoles.ROLE_DATA.keySet()).build())) - .build(); + var redactionTenant = new TenantResponse(); + redactionTenant.setTenantId("redaction"); + redactionTenant.setGuid("redaction"); + redactionTenant.setDisplayName("redaction"); + redactionTenant.setAuthDetails(new AuthDetails()); + redactionTenant.setDatabaseConnection(DatabaseConnection.builder() + .driver("postgresql") + .host(postgreSQLContainerMaster.getHost()) + .port(port) + .database("integration-tests-db-master") + .schema("public") + .username("sa") + .password(encryptionDecryptionService.encrypt("sa")) + .build()); - tenantManagementService.createTenant(tenantRequest); + redactionTenant.setSearchConnection(SearchConnection.builder() + .hosts(Set.of("elasticsearchHost")) + .port(9200) + .scheme("https") + .username("elastic") + .numberOfShards("1") + .numberOfReplicas("5") + .build()); + redactionTenant.setS3StorageConnection(S3StorageConnection.builder() + .key("key") + .secret("secret") + .signerType("signerType") + .bucketName("bucketName") + .region("eu") + .endpoint("endpoint") + .build()); + when(tenantsClient.getTenant("redaction")).thenReturn(redactionTenant); + when(tenantsClient.getTenants()).thenReturn(List.of(redactionTenant)); + try { + tenantManagementService.createTenant(new TenantCreatedEvent("redaction")); + } catch (Exception e) { + + e.printStackTrace(); + } } + } - private void createDatabase(String db, String password) { + private void createDatabase(String db, String jdbcUrl, String password) { - var jdbcTemplate = new JdbcTemplate(masterDataSource); + var ds = new SingleConnectionDataSource(); + ds.setUsername("sa"); + ds.setPassword("sa"); + ds.setUrl(jdbcUrl); + ds.setDriverClassName("org.postgresql.Driver"); + var jdbcTemplate = new JdbcTemplate(ds); jdbcTemplate.execute((StatementCallback) stmt -> stmt.execute("CREATE DATABASE " + db)); jdbcTemplate.execute((StatementCallback) stmt -> stmt.execute("CREATE USER " + db + " WITH ENCRYPTED PASSWORD '" + password + "'")); jdbcTemplate.execute((StatementCallback) stmt -> stmt.execute("GRANT ALL PRIVILEGES ON DATABASE " + db + " TO " + db)); @@ -351,7 +364,7 @@ public abstract class AbstractPersistenceServerServiceTest { @AfterEach public void afterTests() { - tenantRepository.findAll().forEach(tenant -> { + tenantsClient.getTenants().forEach(tenant -> { TenantContext.setTenantId(tenant.getTenantId()); @@ -362,7 +375,6 @@ public abstract class AbstractPersistenceServerServiceTest { dossierAttributeConfigRepository.deleteAll(); downloadStatusRepository.deleteAll(); fileAttributesRepository.deleteAll(); - smtpRepository.deleteAll(); digitalSignatureRepository.deleteAll(); fileAttributesGeneralConfigurationRepository.deleteAll(); fileAttributeConfigRepository.deleteAll(); @@ -378,7 +390,6 @@ public abstract class AbstractPersistenceServerServiceTest { imageRecategorizationRepository.deleteAll(); legalBasisMappingRepository.deleteAll(); ruleSetRepository.deleteAll(); - smtpRepository.deleteAll(); fileRepository.deleteAll(); dossierRepository.deleteAll(); dossierStatusRepository.deleteAll(); @@ -392,6 +403,7 @@ public abstract class AbstractPersistenceServerServiceTest { } + @Slf4j static class Initializer implements ApplicationContextInitializer { public void initialize(ConfigurableApplicationContext configurableApplicationContext) { @@ -403,45 +415,49 @@ public abstract class AbstractPersistenceServerServiceTest { var redisContainer = RedisTestContainer.getInstance(); redisContainer.start(); - var connectionStringDetails = "?serverTimezone=UTC&cachePrepStmts=true&useServerPrepStmts=true&rewriteBatchedStatements=true"; - - var kcInstance = KeyCloakTestContainer.getInstance(); + log.info("Hosts are - Redis: {}, Postgres: {}", redisContainer.getHost(), postgreSQLContainerMaster.getHost()); TestPropertyValues.of("spring.redis.port=" + redisContainer.getFirstMappedPort(), - "multitenancy.master.datasource.url=" + postgreSQLContainerMaster.getJdbcUrl() + connectionStringDetails, - "multitenancy.master.datasource.username=" + postgreSQLContainerMaster.getUsername(), - "multitenancy.master.datasource.password=" + postgreSQLContainerMaster.getPassword(), - "keycloak.auth-server-url=" + kcInstance.getAuthServerUrl(), - "commons.keycloak.serverUrl=" + kcInstance.getAuthServerUrl()).applyTo(configurableApplicationContext.getEnvironment()); + "spring.redis.host=" + redisContainer.getHost(), + "spring.data.redis.port=" + redisContainer.getFirstMappedPort(), + "spring.data.redis.host=" + redisContainer.getHost(), + "fforesight.jobs.enabled=false", + "fforesight.keycloak.enabled=false").applyTo(configurableApplicationContext.getEnvironment()); } } @Configuration - @EnableAutoConfiguration(exclude = {StorageAutoConfiguration.class, RabbitAutoConfiguration.class}) + @EnableWebSecurity + @EnableMethodSecurity + @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class}) @ComponentScan("com.iqser.red.service.persistence") public static class TestConfiguration { - @Autowired - private KeyCloakAdminClientService cloakAdminClientService; + @Bean + public InMemoryUserDetailsManager userDetailsService(PasswordEncoder passwordEncoder) { - @Autowired - private KeycloakSpringBootProperties keycloakSpringBootProperties; - - @Autowired - private KeyCloakSettings keyCloakSettings; + UserDetails user = User.withUsername("manageradmin1@test.com").password(passwordEncoder.encode("secret")).roles(getAllRoles()).authorities(getAllRoles()).build(); + return new InMemoryUserDetailsManager(user); + } - @PostConstruct - protected void pc() { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - var instance = KeyCloakTestContainer.getInstance(); + http.authorizeHttpRequests().anyRequest().authenticated(); + http.httpBasic(); + http.csrf().disable(); + http.cors(); + return http.build(); + } -// when(cloakAdminClientService.getAdminClient()).thenReturn(instance.getKeycloakAdminClient()); - keycloakSpringBootProperties.setAuthServerUrl(instance.getAuthServerUrl()); - keyCloakSettings.setServerUrl(instance.getAuthServerUrl()); + @Bean + public BCryptPasswordEncoder passwordEncoder() { + + return new BCryptPasswordEncoder(); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/FeignRequestInterceptor.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/FeignRequestInterceptor.java index 185ba16b0..2a1c258d5 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/FeignRequestInterceptor.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/FeignRequestInterceptor.java @@ -12,12 +12,15 @@ public class FeignRequestInterceptor implements RequestInterceptor { private final TokenService tokenService; + public static final String TENANT_HEADER_NAME = "X-TENANT-ID"; + @Override public void apply(RequestTemplate requestTemplate) { var token = tokenService.getToken(); - requestTemplate.header("Authorization", "bearer " + token); + requestTemplate.header("Authorization", "basic " + token); + requestTemplate.header(TENANT_HEADER_NAME, "redaction"); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/KeyCloakTestContainer.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/KeyCloakTestContainer.java deleted file mode 100644 index 844214775..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/KeyCloakTestContainer.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.integration.utils; - -import java.util.ArrayList; -import java.util.List; - -import org.keycloak.admin.client.resource.RealmResource; -import org.keycloak.admin.client.resource.UserResource; -import org.keycloak.representations.idm.ClientRepresentation; -import org.keycloak.representations.idm.RoleRepresentation; - -import dasniko.testcontainers.keycloak.KeycloakContainer; - -public class KeyCloakTestContainer { - - private static final String IMAGE_VERSION = "quay.io/keycloak/keycloak:20.0.0"; - private static KeycloakContainer keycloak = null; - - - private KeyCloakTestContainer() { - - } - - - public static KeycloakContainer getInstance() { - - if (keycloak == null) { - keycloak = new KeycloakContainer(IMAGE_VERSION).withAdminUsername("admin").withAdminPassword("admin"); - - keycloak.start(); - - var adminClient = keycloak.getKeycloakAdminClient(); - var redaction = adminClient.realm("master"); - - var redactionClient = new ClientRepresentation(); - - redactionClient.setId("redaction"); - redactionClient.setEnabled(true); - redactionClient.setName("redaction"); - redactionClient.setSecret("redaction"); - redactionClient.setServiceAccountsEnabled(true); - redactionClient.setDirectAccessGrantsEnabled(true); - redactionClient.setStandardFlowEnabled(true); - redactionClient.setImplicitFlowEnabled(true); - redactionClient.setDirectAccessGrantsEnabled(true); - redaction.clients().create(redactionClient); - redaction.clients().create(redactionClient); - - RealmResource myRealm = adminClient.realm("master"); - String userId = myRealm.clients().get("redaction").getServiceAccountUser().getId(); - UserResource serviceAccountUser = myRealm.users().get(userId); - - ClientRepresentation clientThatOwnsRole = myRealm.clients().findByClientId("master-realm").get(0); - - String clientIdOfRoleOwner = clientThatOwnsRole.getId(); - - List roles = new ArrayList<>(); - roles.addAll(myRealm.clients().get(clientIdOfRoleOwner).roles().list()); - serviceAccountUser.roles().clientLevel(clientIdOfRoleOwner).add(roles); - serviceAccountUser.roles().realmLevel().add(List.of(myRealm.roles().get("create-realm").toRepresentation())); - - } - - return keycloak; - - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/KneconRedisTestContainer.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/KneconRedisTestContainer.java new file mode 100644 index 000000000..e654f05d4 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/KneconRedisTestContainer.java @@ -0,0 +1,26 @@ +package com.iqser.red.service.peristence.v1.server.integration.utils; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; + +public class KneconRedisTestContainer extends GenericContainer { + + private static final String IMAGE_VERSION = "nexus.knecon.com:5001/bitnami/redis:7.0.5-debian-11-r7"; + private static KneconRedisTestContainer container; + + + private KneconRedisTestContainer() { + + super(DockerImageName.parse(IMAGE_VERSION)); + } + + + public static KneconRedisTestContainer getInstance() { + + if (container == null) { + container = new KneconRedisTestContainer().withExposedPorts(6379); + } + return container; + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/KneconSpringPostgreSQLTestContainer.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/KneconSpringPostgreSQLTestContainer.java new file mode 100644 index 000000000..f4809b532 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/KneconSpringPostgreSQLTestContainer.java @@ -0,0 +1,132 @@ +package com.iqser.red.service.peristence.v1.server.integration.utils; + +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import java.util.Collections; +import java.util.Set; + +import org.jetbrains.annotations.NotNull; +import org.testcontainers.containers.JdbcDatabaseContainer; +import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; +import org.testcontainers.utility.DockerImageName; + +public class KneconSpringPostgreSQLTestContainer extends JdbcDatabaseContainer { + + private static final String IMAGE_VERSION = "nexus.knecon.com:5001/bitnami/postgresql:14.5.0-debian-11-r31"; + private static KneconSpringPostgreSQLTestContainer container; + + + private KneconSpringPostgreSQLTestContainer() { + + super(IMAGE_VERSION); + } + + + public static KneconSpringPostgreSQLTestContainer getInstance() { + + if (container == null) { + container = new KneconSpringPostgreSQLTestContainer(DockerImageName.parse(IMAGE_VERSION)); + } + return container; + } + + + public static final Integer POSTGRESQL_PORT = 5432; + private String databaseName; + private String username; + private String password; + + + public KneconSpringPostgreSQLTestContainer(DockerImageName dockerImageName) { + + super(dockerImageName); + this.databaseName = "test"; + this.username = "test"; + this.password = "test"; + this.waitStrategy = (new LogMessageWaitStrategy()).withRegEx(".*database system is ready to accept connections.*") + .withTimes(1) + .withStartupTimeout(Duration.of(60L, ChronoUnit.SECONDS)); + this.addExposedPort(POSTGRESQL_PORT); + configure(); + } + + + + protected @NotNull Set getLivenessCheckPorts() { + + return Collections.singleton(this.getMappedPort(POSTGRESQL_PORT)); + } + + + protected void configure() { + + this.addEnv("POSTGRESQL_DATABASE", this.databaseName); + this.addEnv("POSTGRESQL_USERNAME", this.username); + this.addEnv("POSTGRESQL_PASSWORD", this.password); + } + + + public String getDriverClassName() { + + return "org.postgresql.Driver"; + } + + + public String getJdbcUrl() { + + String additionalUrlParams = this.constructUrlParameters("?", "&"); + return "jdbc:postgresql://" + this.getContainerIpAddress() + ":" + this.getMappedPort(POSTGRESQL_PORT) + "/" + this.databaseName + additionalUrlParams; + } + + + public String getDatabaseName() { + + return this.databaseName; + } + + + public String getUsername() { + + return this.username; + } + + + public String getPassword() { + + return this.password; + } + + + public String getTestQueryString() { + + return "SELECT 1"; + } + + + public KneconSpringPostgreSQLTestContainer withDatabaseName(String databaseName) { + + this.databaseName = databaseName; + return this.self(); + } + + + public KneconSpringPostgreSQLTestContainer withUsername(String username) { + + this.username = username; + return this.self(); + } + + + public KneconSpringPostgreSQLTestContainer withPassword(String password) { + + this.password = password; + return this.self(); + } + + + protected void waitUntilContainerStarted() { + + this.getWaitStrategy().waitUntilReady(this); + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/TokenService.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/TokenService.java index 5596c1912..01a0ccfea 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/TokenService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/TokenService.java @@ -1,64 +1,25 @@ package com.iqser.red.service.peristence.v1.server.integration.utils; -import java.util.concurrent.TimeUnit; - -import javax.ws.rs.BadRequestException; -import javax.ws.rs.NotAuthorizedException; - -import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; -import org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl; -import org.keycloak.OAuth2Constants; -import org.keycloak.admin.client.KeycloakBuilder; -import org.springframework.beans.factory.annotation.Autowired; +import org.apache.commons.codec.binary.Base64; import org.springframework.stereotype.Service; -import com.iqser.red.keycloak.commons.KeyCloakSettings; -import com.iqser.red.service.persistence.management.v1.processor.exception.AuthenticationFailedException; -import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; - @Service public class TokenService { - @Autowired - private KeyCloakSettings keyCloakSettings; private String username; private String password; - public void setUser(String username, String password){ + + public void setUser(String username, String password) { + this.username = username; this.password = password; } + public String getToken() { - var tokenClient = KeycloakBuilder.builder() - - .serverUrl(keyCloakSettings.getServerUrl()) - .realm(TenantContext.getTenantId()) - .username(username) - .password(password) - .clientId(keyCloakSettings.getClientId()) - .clientSecret(keyCloakSettings.getClientSecret()) - .grantType(OAuth2Constants.PASSWORD) - .resteasyClient(new ResteasyClientBuilderImpl().connectionTTL(2, TimeUnit.SECONDS) - .hostnameVerification(ResteasyClientBuilder.HostnameVerificationPolicy.ANY) - .connectionPoolSize(keyCloakSettings.getConnectionPoolSize()) - .disableTrustManager() - .build()) - .build(); - - try { - return tokenClient.tokenManager().getAccessTokenString(); - } catch (BadRequestException e) { - var response = e.getResponse().getEntity(); - System.out.println(response); - return null; - } catch (NotAuthorizedException e) { - throw new AuthenticationFailedException(e); - } finally { - tokenClient.close(); - } - + return Base64.encodeBase64String((this.username+":"+this.password).getBytes()); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml b/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yaml similarity index 63% rename from persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml rename to persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yaml index d61dfe710..29a77796b 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml +++ b/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yaml @@ -1,21 +1,6 @@ monitoring.enabled: true spring: - quartz: - overwrite-existing-jobs: true - jdbc: - initialize-schema: never - properties: - org: - quartz: - jobStore: - class: org.springframework.scheduling.quartz.LocalDataSourceJobStore - clusterCheckinInterval: 1000 - isClustered: true - driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate - scheduler: - instanceId: AUTO - job-store-type: JDBC main: allow-circular-references: true # FIXME jpa: @@ -59,7 +44,7 @@ configuration-service.url: "http://configuration-service-v1:8080" pdftron-redaction-service.url: "http://pdftron-redaction-service-v1:8080" redaction-report-service.url: "http://redaction-report-service-v1:8080" search-service.url: "http://search-service-v1:8080" - +tenant-user-management-service.url: "http://tenant-user-management-service:8080" storage: backend: 's3' @@ -79,10 +64,16 @@ metrics: management: endpoint: metrics.enabled: true - prometheus.enabled: true health.enabled: true + prometheus: + enabled: true endpoints.web.exposure.include: prometheus, health, metrics - metrics.export.prometheus.enabled: true + prometheus: + metrics: + export: + enabled: true + + logging.level.root: info @@ -90,19 +81,6 @@ multitenancy: datasource-cache: maximumSize: 100 expireAfterAccess: 1 - master: - datasource: - driverClassName: org.postgresql.Driver - platform: org.hibernate.dialect.PostgreSQL95Dialect - hikari: - maximumPoolSize: 5 - minimum-idle: 5 - data-source-properties: - cachePrepStmts: true - prepStmtCacheSize: 1000 - prepStmtCacheSqlLimit: 2048 - liquibase: - changeLog: classpath:db/changelog/db.changelog-master.yaml tenant: datasource: driverClassName: org.postgresql.Driver @@ -118,24 +96,20 @@ multitenancy: changeLog: classpath:db/changelog/db.changelog-tenant.yaml -keycloak: - enabled: true - sslRequired: none - realm: master - resource: redaction - disableTrustManager: true - useResourceRoleMappings: true -commons: - keycloak: - application-client-id: redaction - realm: master - client-id: redaction - client-secret: redaction feign: client: config: DossierTemplateClient: connectTimeout: 10000 - readTimeout: 200000 \ No newline at end of file + readTimeout: 200000 +fforesight: + jobs: + enabled: false + tenant-exchange: + name: 'tenants-exchange' + user-exchange: + name: 'users-exchange' + keycloak: + enabled: false diff --git a/persistence-service-v1/persistence-service-shared-api-v1/pom.xml b/persistence-service-v1/persistence-service-shared-api-v1/pom.xml index c1e2a6a03..767f4a0c7 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/pom.xml +++ b/persistence-service-v1/persistence-service-shared-api-v1/pom.xml @@ -12,20 +12,9 @@ 4.0.0 persistence-service-shared-api-v1 - - 1.9.9 - - - - com.dslplatform - dsl-json-java8 - ${dsljson.version} - - - org.springdoc springdoc-openapi-ui @@ -57,11 +46,6 @@ provided - - org.springframework.boot - spring-boot-starter-security - - org.springframework.boot spring-boot-starter-validation @@ -87,19 +71,4 @@ - - - - org.apache.maven.plugins - maven-compiler-plugin - - - lombok.launch.AnnotationProcessorHider$AnnotationProcessor - com.dslplatform.json.processor.CompiledJsonAnnotationProcessor - - - - - - diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuditResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuditResponse.java index d97a514cb..3a0020845 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuditResponse.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuditResponse.java @@ -6,10 +6,12 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.Audit import com.iqser.red.service.persistence.service.v1.api.shared.model.common.Page; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; @Data @NoArgsConstructor +@EqualsAndHashCode(callSuper = true) public class AuditResponse extends Page { public AuditResponse(List elements, long totalHits, int page, int pageSize) { diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/CreateTypeValue.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/CreateTypeValue.java index 988440e74..cc173b71a 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/CreateTypeValue.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/CreateTypeValue.java @@ -1,9 +1,9 @@ package com.iqser.red.service.persistence.service.v1.api.shared.model; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.Pattern; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Pattern; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PrepareDownloadWithOptionRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PrepareDownloadWithOptionRequest.java index 811139038..24206d209 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PrepareDownloadWithOptionRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PrepareDownloadWithOptionRequest.java @@ -5,12 +5,11 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.validation.constraints.NotNull; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AccessLevel; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/UpdateMyProfileRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/UpdateMyProfileRequest.java index 74f0d1fd4..53c4da6c0 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/UpdateMyProfileRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/UpdateMyProfileRequest.java @@ -1,9 +1,9 @@ package com.iqser.red.service.persistence.service.v1.api.shared.model; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotEmpty; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotEmpty; import lombok.Data; @Data diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/ApplicationConfig.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/ApplicationConfig.java index 413669721..6aa2ae3d0 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/ApplicationConfig.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/ApplicationConfig.java @@ -1,7 +1,7 @@ package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration; -import javax.validation.constraints.Min; +import jakarta.validation.constraints.Min; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/AzureStorageConnection.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/AzureStorageConnection.java deleted file mode 100644 index 04bc8caad..000000000 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/AzureStorageConnection.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class AzureStorageConnection { - - private String connectionString; - private String containerName; - -} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/DatabaseConnection.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/DatabaseConnection.java deleted file mode 100644 index 5f8a84b48..000000000 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/DatabaseConnection.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy; - -import java.util.HashMap; -import java.util.Map; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class DatabaseConnection { - - private String driver; - private String host; - private String port; - private String database; - private String schema; - private String username; - private String password; - - @Builder.Default - private Map params = new HashMap<>(); - -} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/RedUser.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/RedUser.java deleted file mode 100644 index e84ee9957..000000000 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/RedUser.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy; - -import java.util.HashSet; -import java.util.Set; - -import lombok.Builder; -import lombok.Data; - -@Data -@Builder -public class RedUser { - - private String username; - private String password; - private String email; - private String firstName; - private String lastName; - - @Builder.Default - private Set redRoles = new HashSet<>(); - -} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/S3StorageConnection.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/S3StorageConnection.java deleted file mode 100644 index 6a8d6f4f5..000000000 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/S3StorageConnection.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class S3StorageConnection { - - private String key; - private String secret; - private String signerType; - private String bucketName; - private String region; - private String endpoint; - -} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/SearchConnection.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/SearchConnection.java deleted file mode 100644 index 8c7448fdd..000000000 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/SearchConnection.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy; - -import java.util.Set; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class SearchConnection { - - private Set hosts; - private int port = 9300; - private String scheme; - private String username; - private String password; - private String numberOfShards; - private String numberOfReplicas; - -} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/SimpleTenantResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/SimpleTenantResponse.java deleted file mode 100644 index b90dfe359..000000000 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/SimpleTenantResponse.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class SimpleTenantResponse { - - private String tenantId; - private String displayName; - private String guid; - -} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/TenantRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/TenantRequest.java deleted file mode 100644 index 373683519..000000000 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/TenantRequest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy; - -import java.util.ArrayList; -import java.util.List; - -import javax.validation.constraints.NotBlank; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class TenantRequest { - - @NotBlank - private String tenantId; - @NotBlank - private String displayName; - private String guid; - - private DatabaseConnection databaseConnection; - private SearchConnection searchConnection; - private AzureStorageConnection azureStorageConnection; - private S3StorageConnection s3StorageConnection; - - @Builder.Default - private List redUsers = new ArrayList<>(); - -} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/TenantResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/TenantResponse.java deleted file mode 100644 index 8f75511fa..000000000 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/TenantResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class TenantResponse { - - private String tenantId; - private String displayName; - private String guid; - - private DatabaseConnection databaseConnection; - private SearchConnection searchConnection; - private AzureStorageConnection azureStorageConnection; - private S3StorageConnection s3StorageConnection; - -} diff --git a/persistence-service-v1/pom.xml b/persistence-service-v1/pom.xml index 2f36fe125..928813a33 100755 --- a/persistence-service-v1/pom.xml +++ b/persistence-service-v1/pom.xml @@ -6,7 +6,7 @@ com.iqser.red platform-dependency - 1.17.0 + 2.2.0 @@ -19,7 +19,6 @@ pom - keycloak-commons persistence-service-shared-api-v1 persistence-service-internal-api-v1 persistence-service-external-api-v1 @@ -30,11 +29,10 @@ - 4.0.0 - 4.0.0 - 4.11.0 - 4.0.0 - 20.0.1 + 4.30.0 + 2.71.0 + 4.18.0 + 4.13.0 @@ -42,7 +40,7 @@ com.iqser.red platform-commons-dependency - 1.22.0 + 2.1.0 import pom