Merge branch 'RED-6686-2' into 'master'

Resolve RED-6686 "2"

Closes RED-6686

See merge request redactmanager/persistence-service!33
This commit is contained in:
Timo Bejan 2023-06-27 13:54:52 +02:00
commit 1157ed353e
10 changed files with 86 additions and 27 deletions

View File

@ -1,22 +1,40 @@
package com.iqser.red.service.persistence.management.v1.processor.migration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import com.iqser.red.service.persistence.management.v1.processor.acl.custom.initializer.ACLInitializer;
import com.iqser.red.service.persistence.management.v1.processor.service.job.AutomaticAnalysisJob;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.DevDataProvider;
import com.knecon.fforesight.tenantcommons.TenantProvider;
import com.knecon.fforesight.tenantcommons.model.UpdateDetailsRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
@RequiredArgsConstructor
public class AsyncMigrationStarterService {
private final AutomaticAnalysisJob automaticAnalysisJob;
private final MigrationStarterService migrationStarterService;
private final ACLInitializer aclInitializer;
private final TenantProvider tenantProvider;
private final DevDataProvider devDataProvider;
public AsyncMigrationStarterService(AutomaticAnalysisJob automaticAnalysisJob,
MigrationStarterService migrationStarterService,
ACLInitializer aclInitializer,
TenantProvider tenantProvider,
@Autowired(required = false) DevDataProvider devDataProvider) {
this.automaticAnalysisJob = automaticAnalysisJob;
this.migrationStarterService = migrationStarterService;
this.aclInitializer = aclInitializer;
this.tenantProvider = tenantProvider;
this.devDataProvider = devDataProvider;
}
@Async
@ -27,6 +45,13 @@ public class AsyncMigrationStarterService {
migrationStarterService.runForTenant(tenantId);
aclInitializer.run();
automaticAnalysisJob.setSchedulingStopped(false);
tenantProvider.updateDetails(tenantId, UpdateDetailsRequest.builder().key("persistence-service-ready").value(true).build());
if (devDataProvider != null) {
devDataProvider.importDossierTemplatesToTenant(tenantId);
}
} catch (Exception e) {
automaticAnalysisJob.setSchedulingStopped(false);
throw e;

View File

@ -11,6 +11,7 @@ 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.settings.FileManagementServiceSettings;
import com.iqser.red.service.persistence.management.v1.processor.utils.TenantUtils;
import com.knecon.fforesight.tenantcommons.TenantContext;
import com.knecon.fforesight.tenantcommons.TenantProvider;
@ -29,11 +30,15 @@ public class MigrationStarterService {
private final TenantProvider tenantProvider;
@EventListener(ApplicationReadyEvent.class)
@EventListener(ApplicationReadyEvent.class)
public void migrate() {
tenantProvider.getTenants().forEach(tenant -> {
if (!TenantUtils.isTenantReadyForPersistence(tenant)) {
return;
}
TenantContext.setTenantId(tenant.getTenantId());
//This is always running on startup
@ -45,6 +50,10 @@ public class MigrationStarterService {
tenantProvider.getTenants().forEach(tenant -> {
if (!TenantUtils.isTenantReadyForPersistence(tenant)) {
return;
}
runForTenant(tenant.getTenantId());
});

View File

@ -9,6 +9,7 @@ import com.iqser.red.service.persistence.management.v1.processor.acl.custom.doss
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.iqser.red.service.persistence.management.v1.processor.utils.TenantUtils;
import com.knecon.fforesight.tenantcommons.TenantContext;
import com.knecon.fforesight.tenantcommons.TenantProvider;
@ -30,6 +31,10 @@ public class KeyCloakUserSyncService {
public void syncUsersWithKC() {
tenantProvider.getTenants().forEach(tenant -> {
if(!TenantUtils.isTenantReadyForPersistence(tenant)){
return;
}
TenantContext.setTenantId(tenant.getTenantId());
var allUsers = usersClient.getAllUsers(true);

View File

@ -11,6 +11,7 @@ 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.settings.FileManagementServiceSettings;
import com.iqser.red.service.persistence.management.v1.processor.utils.TenantUtils;
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;
@ -43,7 +44,10 @@ public class AutomaticAnalysisJob implements Job {
}
tenantProvider.getTenants().forEach(tenant -> {
tenantProvider.updateDetails(tenant.getTenantId(), UpdateDetailsRequest.builder().key("persistence-service-ready").value(true).build());
if(!TenantUtils.isTenantReadyForPersistence(tenant)){
return;
}
TenantContext.setTenantId(tenant.getTenantId());

View File

@ -12,6 +12,7 @@ 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.utils.TenantUtils;
import com.knecon.fforesight.tenantcommons.TenantContext;
import com.knecon.fforesight.tenantcommons.TenantProvider;
@ -35,6 +36,10 @@ public class DeletedFilesCleanupJob implements Job {
tenantProvider.getTenants().forEach(tenant -> {
if(!TenantUtils.isTenantReadyForPersistence(tenant)){
return;
}
TenantContext.setTenantId(tenant.getTenantId());
var now = OffsetDateTime.now();

View File

@ -11,6 +11,7 @@ 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.persistence.DownloadStatusPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.utils.TenantUtils;
import com.iqser.red.storage.commons.service.StorageService;
import com.knecon.fforesight.tenantcommons.TenantContext;
import com.knecon.fforesight.tenantcommons.TenantProvider;
@ -34,6 +35,10 @@ public class DownloadCleanupJob implements Job {
tenantProvider.getTenants().forEach(tenant -> {
if(!TenantUtils.isTenantReadyForPersistence(tenant)){
return;
}
TenantContext.setTenantId(tenant.getTenantId());
var now = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS);

View File

@ -11,6 +11,7 @@ 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.utils.TenantUtils;
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;
@ -34,6 +35,10 @@ public class SendNotificationEmailJob implements Job {
tenantProvider.getTenants().forEach(tenant -> {
if(!TenantUtils.isTenantReadyForPersistence(tenant)){
return;
}
TenantContext.setTenantId(tenant.getTenantId());
var allConfiguredPreferences = notificationPreferencesPersistenceService.findAll();

View File

@ -20,32 +20,30 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest;
import com.knecon.fforesight.tenantcommons.TenantContext;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
@Profile("dev")
@RequiredArgsConstructor
public class DevDataProvider {
@Autowired
private AsyncMigrationStarterService asyncMigrationStarterService;
private final DossierTemplateImportService dossierTemplateImportService;
private final DossierTemplateRepository dossierTemplateRepository;
public void importDossierTemplatesToTenant(String tenantId){
public void importDossierTemplatesToTenant(String tenantId) {
TenantContext.setTenantId(tenantId);
asyncMigrationStarterService.runForTenant(tenantId);
if(dossierTemplateRepository.count() == 0) {
if (dossierTemplateRepository.count() == 0) {
executeImport();
}
TenantContext.clear();
}
@Autowired
private DossierTemplateImportService dossierTemplateImportService;
@Autowired
private DossierTemplateRepository dossierTemplateRepository;
public byte[] pack(String sourceDirPath) throws IOException {
@ -71,14 +69,14 @@ public class DevDataProvider {
}
@SneakyThrows
private void executeImport() {
var importDir = new File("/Users/timobejan/work/dossier-templates-v2/dev");
for (var file : importDir.listFiles()) {
if(file.isDirectory()){
if (file.isDirectory()) {
var archive = pack(file.getAbsolutePath());
log.info("Importing file: " + file.getName() + " " + " with size: " + archive.length);
var request = new ImportDossierTemplateRequest();
@ -89,4 +87,5 @@ public class DevDataProvider {
}
}
}
}

View File

@ -59,21 +59,18 @@ public class TenantManagementService {
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){
TenantProvider tenantProvider){
this.liquibaseProperties = liquibaseProperties;
this.resourceLoader = resourceLoader;
this.encryptionDecryptionService = encryptionDecryptionService;
this.asyncMigrationStarterService = asyncMigrationStarterService;
this.tenantProvider = tenantProvider;
this.devDataProvider = devDataProvider;
}
@ -98,13 +95,6 @@ public class TenantManagementService {
asyncMigrationStarterService.runForTenant(tenantRequest.getTenantId());
tenantProvider.updateDetails(tenantRequest.getTenantId(), UpdateDetailsRequest.builder().key("persistence-service-ready").value(true).build());
if(devDataProvider!=null) {
devDataProvider.importDossierTemplatesToTenant(tenantRequest.getTenantId());
}
}

View File

@ -0,0 +1,12 @@
package com.iqser.red.service.persistence.management.v1.processor.utils;
import com.knecon.fforesight.tenantcommons.model.TenantResponse;
public class TenantUtils {
public static boolean isTenantReadyForPersistence(TenantResponse tenantResponse){
return tenantResponse.getDetails()!=null &&
tenantResponse.getDetails().getOrDefault("persistence-service-ready",false).equals(true);
}
}