208 lines
10 KiB
Java
208 lines
10 KiB
Java
package gr.cite.annotation.service.tenantconfiguration;
|
|
|
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
import gr.cite.commons.web.authz.service.AuthorizationService;
|
|
import gr.cite.annotation.authorization.Permission;
|
|
import gr.cite.annotation.common.JsonHandlingService;
|
|
import gr.cite.annotation.common.enums.IsActive;
|
|
import gr.cite.annotation.common.enums.TenantConfigurationType;
|
|
import gr.cite.annotation.common.types.tenantconfiguration.DefaultUserLocaleConfigurationDataContainer;
|
|
import gr.cite.annotation.common.types.tenantconfiguration.EmailClientConfigurationDataContainer;
|
|
import gr.cite.annotation.convention.ConventionService;
|
|
import gr.cite.annotation.data.TenantConfigurationEntity;
|
|
import gr.cite.annotation.data.TenantEntityManager;
|
|
import gr.cite.annotation.errorcode.ErrorThesaurusProperties;
|
|
import gr.cite.annotation.model.TenantConfiguration;
|
|
import gr.cite.annotation.model.builder.TenantConfigurationBuilder;
|
|
import gr.cite.annotation.model.deleter.TenantConfigurationDeleter;
|
|
import gr.cite.annotation.model.persist.tenantconfiguration.TenantConfigurationEmailClientPersist;
|
|
import gr.cite.annotation.model.persist.tenantconfiguration.TenantConfigurationUserLocaleIntegrationPersist;
|
|
import gr.cite.annotation.query.TenantConfigurationQuery;
|
|
import gr.cite.tools.data.builder.BuilderFactory;
|
|
import gr.cite.tools.data.deleter.DeleterFactory;
|
|
import gr.cite.tools.exception.MyNotFoundException;
|
|
import gr.cite.tools.exception.MyValidationException;
|
|
import gr.cite.tools.fieldset.BaseFieldSet;
|
|
import gr.cite.tools.fieldset.FieldSet;
|
|
import gr.cite.tools.logging.LoggerService;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.context.ApplicationContext;
|
|
import org.springframework.context.MessageSource;
|
|
import org.springframework.context.i18n.LocaleContextHolder;
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.web.context.annotation.RequestScope;
|
|
|
|
import javax.management.InvalidApplicationException;
|
|
import java.time.Instant;
|
|
import java.util.List;
|
|
import java.util.UUID;
|
|
|
|
@Component
|
|
@RequestScope
|
|
public class TenantConfigurationServiceImpl implements TenantConfigurationService {
|
|
private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(TenantConfigurationServiceImpl.class));
|
|
|
|
private final ApplicationContext applicationContext;
|
|
private final JsonHandlingService jsonHandlingService;
|
|
private final AuthorizationService authorizationService;
|
|
private final ConventionService conventionService;
|
|
private final ErrorThesaurusProperties errors;
|
|
private final MessageSource messageSource;
|
|
private final BuilderFactory builderFactory;
|
|
|
|
private final TenantEntityManager dbContext;
|
|
private final DeleterFactory deleterFactory;
|
|
|
|
@Autowired
|
|
public TenantConfigurationServiceImpl(ApplicationContext applicationContext, JsonHandlingService jsonHandlingService, AuthorizationService authorizationService, ConventionService conventionService, ErrorThesaurusProperties errors, MessageSource messageSource, BuilderFactory builderFactory, TenantEntityManager dbContext, DeleterFactory deleterFactory) {
|
|
this.applicationContext = applicationContext;
|
|
this.jsonHandlingService = jsonHandlingService;
|
|
this.authorizationService = authorizationService;
|
|
this.conventionService = conventionService;
|
|
this.errors = errors;
|
|
this.messageSource = messageSource;
|
|
this.builderFactory = builderFactory;
|
|
this.dbContext = dbContext;
|
|
this.deleterFactory = deleterFactory;
|
|
}
|
|
|
|
@Override
|
|
public EmailClientConfigurationDataContainer collectTenantEmailClient() {
|
|
TenantConfigurationQuery query = applicationContext.getBean(TenantConfigurationQuery.class);
|
|
String data = query.isActive(IsActive.Active).type(TenantConfigurationType.EMAIL_CLIENT_CONFIGURATION).first().getValue();
|
|
if (data == null) return null;
|
|
|
|
try {
|
|
EmailClientConfigurationDataContainer emailClientData = this.jsonHandlingService.fromJson(EmailClientConfigurationDataContainer.class, data);
|
|
return emailClientData;
|
|
} catch (JsonProcessingException e) {
|
|
logger.error(e.getMessage(), e);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public DefaultUserLocaleConfigurationDataContainer collectTenantUserLocale() {
|
|
TenantConfigurationQuery query = applicationContext.getBean(TenantConfigurationQuery.class);
|
|
TenantConfigurationEntity entity = query.isActive(IsActive.Active).type(TenantConfigurationType.DEFAULT_USER_LOCALE).first();
|
|
if(entity == null){
|
|
return null;
|
|
}
|
|
String data = entity.getValue();
|
|
if (data == null) return null;
|
|
|
|
try {
|
|
DefaultUserLocaleConfigurationDataContainer userLocaleData = this.jsonHandlingService.fromJson(DefaultUserLocaleConfigurationDataContainer.class, data);
|
|
return userLocaleData;
|
|
} catch (JsonProcessingException e) {
|
|
logger.error(e.getMessage(), e);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public TenantConfiguration persist(TenantConfigurationEmailClientPersist emailClientPersist, FieldSet fieldSet) {
|
|
EmailClientConfigurationDataContainer container = new EmailClientConfigurationDataContainer();
|
|
container.setEnableSSL(emailClientPersist.getEnableSSL());
|
|
container.setRequireCredentials(emailClientPersist.getRequireCredentials());
|
|
container.setHostServer(emailClientPersist.getHostServer());
|
|
container.setHostPortNo(emailClientPersist.getHostPortNo());
|
|
container.setCertificatePath(emailClientPersist.getCertificatePath());
|
|
container.setEmailAddress(emailClientPersist.getEmailAddress());
|
|
container.setEmailUserName(emailClientPersist.getEmailUserName());
|
|
container.setEmailPassword(emailClientPersist.getEmailPassword());
|
|
try {
|
|
String value = jsonHandlingService.toJson(container);
|
|
return this.persist(emailClientPersist.getId(), emailClientPersist.getHash(), TenantConfigurationType.EMAIL_CLIENT_CONFIGURATION, value, fieldSet);
|
|
} catch (JsonProcessingException e) {
|
|
logger.error(e.getMessage(), e);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public TenantConfiguration persist(TenantConfigurationUserLocaleIntegrationPersist userLocaleIntegrationPersist, FieldSet fieldSet) {
|
|
this.authorizationService.authorizeForce(Permission.EditTenantConfiguration);
|
|
|
|
TenantConfigurationQuery tenantConfigurationQuery = applicationContext.getBean(TenantConfigurationQuery.class);
|
|
TenantConfigurationEntity data = tenantConfigurationQuery.isActive(IsActive.Active).type(TenantConfigurationType.DEFAULT_USER_LOCALE).first();
|
|
Boolean isUpdate = data != null;
|
|
if (!isUpdate) {
|
|
|
|
data = new TenantConfigurationEntity();
|
|
data.setCreatedAt(Instant.now());
|
|
data.setIsActive(IsActive.Active);
|
|
data.setType(TenantConfigurationType.DEFAULT_USER_LOCALE);
|
|
}
|
|
try {
|
|
DefaultUserLocaleConfigurationDataContainer container = new DefaultUserLocaleConfigurationDataContainer();
|
|
container.setCulture(userLocaleIntegrationPersist.getCulture());
|
|
container.setTimeZone(userLocaleIntegrationPersist.getTimeZone());
|
|
container.setLanguage(userLocaleIntegrationPersist.getLanguage());
|
|
String value = jsonHandlingService.toJson(container);
|
|
|
|
data.setValue(value);
|
|
data.setUpdatedAt(Instant.now());
|
|
this.dbContext.merge(data);
|
|
} catch (InvalidApplicationException | JsonProcessingException e) {
|
|
logger.error(e.getMessage(), e);
|
|
}
|
|
|
|
//this._eventBroker.EmitTenantConfigurationTouched(this._scope.Tenant, type);
|
|
|
|
TenantConfiguration persisted = this.builderFactory.builder(TenantConfigurationBuilder.class).build(fieldSet.merge(new BaseFieldSet(TenantConfiguration._id, TenantConfiguration._hash)), data);
|
|
return persisted;
|
|
}
|
|
|
|
@Override
|
|
public void deleteAndSave(UUID id) throws InvalidApplicationException {
|
|
logger.debug("deleting tenant Configuration: {}", id);
|
|
this.authorizationService.authorizeForce(Permission.EditTenantConfiguration);
|
|
this.deleterFactory.deleter(TenantConfigurationDeleter.class).deleteAndSaveByIds(List.of(id));
|
|
}
|
|
|
|
private TenantConfiguration persist(UUID modelId, String modelHash, TenantConfigurationType type, String value, FieldSet fieldSet) {
|
|
this.authorizationService.authorizeForce(Permission.EditTenantConfiguration);
|
|
|
|
Boolean isUpdate = this.conventionService.isValidGuid(modelId);
|
|
|
|
TenantConfigurationQuery tenantConfigurationQuery = applicationContext.getBean(TenantConfigurationQuery.class);
|
|
List<UUID> existingConfigIds = tenantConfigurationQuery.isActive(IsActive.Active).type(type).collectAs(new BaseFieldSet(TenantConfigurationEntity._id)).stream().map(TenantConfigurationEntity::getId).toList();
|
|
TenantConfigurationEntity data = null;
|
|
if (isUpdate) {
|
|
if (!existingConfigIds.contains(modelId)) throw new MyValidationException(this.errors.getSingleTenantConfigurationPerTypeSupported().getCode(), this.errors.getSingleTenantConfigurationPerTypeSupported().getMessage());
|
|
if (existingConfigIds.size() > 1) throw new MyValidationException(this.errors.getSingleTenantConfigurationPerTypeSupported().getCode(), this.errors.getSingleTenantConfigurationPerTypeSupported().getMessage());
|
|
|
|
|
|
data = tenantConfigurationQuery.ids(modelId).first();
|
|
if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{modelId, TenantConfigurationEntity.class.getSimpleName()}, LocaleContextHolder.getLocale()));
|
|
if (!modelHash.equals(this.conventionService.hashValue(data.getUpdatedAt()))) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage());
|
|
if (!data.getType().equals(type)) throw new MyValidationException(this.errors.getIncompatibleTenantConfigurationTypes().getCode(), this.errors.getIncompatibleTenantConfigurationTypes().getMessage());
|
|
} else {
|
|
if (!existingConfigIds.isEmpty()) throw new MyValidationException(this.errors.getSingleTenantConfigurationPerTypeSupported().getCode(), this.errors.getSingleTenantConfigurationPerTypeSupported().getMessage());
|
|
|
|
data = new TenantConfigurationEntity();
|
|
data.setCreatedAt(Instant.now());
|
|
data.setIsActive(IsActive.Active);
|
|
data.setType(type);
|
|
}
|
|
|
|
data.setValue(value);
|
|
data.setUpdatedAt(Instant.now());
|
|
|
|
try {
|
|
this.dbContext.merge(data);
|
|
} catch (InvalidApplicationException e) {
|
|
logger.error(e.getMessage(), e);
|
|
}
|
|
|
|
//this._eventBroker.EmitTenantConfigurationTouched(this._scope.Tenant, type);
|
|
|
|
TenantConfiguration persisted = this.builderFactory.builder(TenantConfigurationBuilder.class).build(fieldSet.merge(new BaseFieldSet(TenantConfiguration._id, TenantConfiguration._hash)), data);
|
|
return persisted;
|
|
//return null;
|
|
|
|
}
|
|
}
|