class ConfigPropertyServiceImpl implements ConfigPropertyService {

	@Override
	@Transactional
	public List<ConfigProperty> addUpdateProperties(ConfigPropertyRequest configPropertyRequest, String user,
			String userMessage, String timeNow, boolean partOfRollbackOperation) {
		List<ConfigProperty> configPropertyList = new ArrayList<>();
		List<ConfigPropertyAudit> configPropertyAuditList = new ArrayList<>();

		configPropertyRequest.getConfigProperties().forEach(configPropertyItem -> {
			ConfigPropertyKey configPropertyKey = new ConfigPropertyKey();
			configPropertyKey.setApplication(configPropertyItem.getApplication());
			configPropertyKey.setProfile(activeProfile);
			configPropertyKey.setLabel(AdminConstants.LATEST);
			configPropertyKey.setCfkey(configPropertyItem.getConfigKey());

			if (configPropertyRepository.existsByConfigKeyParams(configPropertyKey)) {
				ConfigProperty existingConfigProperty = configPropertyRepository
						.findByConfigKeyParams(configPropertyKey);

				ConfigPropertyAudit configPropertyAudit = new ConfigPropertyAudit();
				configPropertyAudit.setId(UUID.randomUUID().toString());
				configPropertyAudit.setCfkey(existingConfigProperty.getConfigKeyParams().getCfkey());
				configPropertyAudit.setApplication(existingConfigProperty.getConfigKeyParams().getApplication());
				configPropertyAudit.setProfile(existingConfigProperty.getConfigKeyParams().getProfile());
				configPropertyAudit.setLabel(existingConfigProperty.getConfigKeyParams().getLabel());
				configPropertyAudit.setOldvalue(existingConfigProperty.getValue());
				configPropertyAudit.setNewvalue(configPropertyItem.getConfigValue());
				configPropertyAudit.setModifiedBy(user);
				configPropertyAudit.setModifiedDate(timeNow);
				configPropertyAudit.setUserMessage(userMessage);
				configPropertyAudit.setSystemMessage("PUT operation through API invocation");
				if (partOfRollbackOperation) {
					configPropertyAudit.setSystemMessage(AdminConstants.CONFIG_ROLLBACK_MSG);
				}
				configPropertyAuditList.add(configPropertyAudit);

				existingConfigProperty.setValue(configPropertyItem.getConfigValue());
				existingConfigProperty.setModifiedBy(user);
				existingConfigProperty.setModifiedDate(timeNow);
				configPropertyList.add(existingConfigProperty);

			} else {
				ConfigProperty configProperty = new ConfigProperty();
				configProperty.setConfigKeyParams(configPropertyKey);
				configProperty.setValue(configPropertyItem.getConfigValue());
				configProperty.setCreatedBy(user);
				configProperty.setCreatedDate(timeNow);
				configPropertyList.add(configProperty);

				ConfigPropertyAudit configPropertyAudit = new ConfigPropertyAudit();
				configPropertyAudit.setId(UUID.randomUUID().toString());
				configPropertyAudit.setCfkey(configPropertyKey.getCfkey());
				configPropertyAudit.setApplication(configPropertyKey.getApplication());
				configPropertyAudit.setProfile(configPropertyKey.getProfile());
				configPropertyAudit.setLabel(configPropertyKey.getLabel());
				configPropertyAudit.setNewvalue(configPropertyItem.getConfigValue());
				configPropertyAudit.setModifiedBy(user);
				configPropertyAudit.setModifiedDate(timeNow);
				configPropertyAudit.setUserMessage(userMessage);
				configPropertyAudit.setSystemMessage("POST operation through API invocation");
				if (partOfRollbackOperation) {
					configPropertyAudit.setSystemMessage(AdminConstants.CONFIG_ROLLBACK_MSG);
				}
				configPropertyAuditList.add(configPropertyAudit);
			}
		});

		List<ConfigProperty> configPropertyResult = configPropertyRepository.saveAll(configPropertyList);
		configPropertyAuditRepository.saveAll(configPropertyAuditList);
		return configPropertyResult;
	}

}