package com.dbg.cloud.acheron.consumers.service; import com.datastax.driver.core.utils.UUIDs; import com.dbg.cloud.acheron.consumers.Consumer; import com.dbg.cloud.acheron.exception.TechnicalException; import com.dbg.cloud.acheron.exception.ValidationException; import com.dbg.cloud.acheron.consumers.store.ConsumerStore; import com.dbg.cloud.acheron.pluginconfig.PluginConfig; import com.dbg.cloud.acheron.pluginconfig.service.PluginConfigService; import com.dbg.cloud.acheron.plugins.apikey.store.APIKey; import com.dbg.cloud.acheron.plugins.apikey.store.APIKeyStore; import lombok.AllArgsConstructor; import lombok.NonNull; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; import java.util.Optional; import java.util.UUID; public interface ConsumerService { List<Consumer> getAllConsumers() throws TechnicalException; Optional<Consumer> getConsumer(@NonNull UUID consumerId) throws TechnicalException; Consumer addNewConsumer(@NonNull Consumer consumer) throws ValidationException, TechnicalException; void deleteConsumer(@NonNull UUID consumerId) throws TechnicalException; @Service @AllArgsConstructor class ConsumerServiceImpl implements ConsumerService { private final ConsumerStore consumerStore; private final PluginConfigService pluginConfigService; private final APIKeyStore apiKeyStore; // TODO Replace with service @Override public List<Consumer> getAllConsumers() throws TechnicalException { try { return consumerStore.findAll(); } catch (final RuntimeException e) { throw new TechnicalException(e); } } @Override public Optional<Consumer> getConsumer(final @NonNull UUID consumerId) throws TechnicalException { try { return consumerStore.findById(consumerId); } catch (final RuntimeException e) { throw new TechnicalException(e); } } @Override public Consumer addNewConsumer(final @NonNull Consumer consumer) throws ValidationException, TechnicalException { validateConsumer(consumer); try { final UUID consumerId = UUIDs.random(); final Date createdAt = new Date(); return consumerStore.add(new Consumer.Smart(consumerId, consumer.getName(), createdAt)); } catch (final RuntimeException e) { throw new TechnicalException(e); } } @Override public void deleteConsumer(final @NonNull UUID consumerId) { try { consumerStore.deleteById(consumerId); // Delete all plugin configs linked to the consumer final List<PluginConfig> consumerPluginConfigs = pluginConfigService.getPluginConfigsOfConsumer(consumerId); consumerPluginConfigs.forEach( consumerPluginConfig -> pluginConfigService.deletePluginConfig(consumerPluginConfig.getId())); // Delete API Keys final List<APIKey> consumerAPIKeys = apiKeyStore.findByConsumer(consumerId); consumerAPIKeys.forEach(consumerAPIKey -> apiKeyStore.deleteById(consumerAPIKey.getId())); } catch (final RuntimeException e) { throw new TechnicalException(e); } } private void validateConsumer(final Consumer consumer) throws ValidationException { if (consumer.getName() == null || consumer.getName().isEmpty()) { throw new ValidationException("consumer name cannot be empty"); } } } }