package com.sequenceiq.cloudbreak.service.smartsense; import java.util.Iterator; import java.util.List; import java.util.Optional; import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Service; import com.sequenceiq.cloudbreak.common.type.CbUserRole; import com.sequenceiq.cloudbreak.controller.BadRequestException; import com.sequenceiq.cloudbreak.domain.CbUser; import com.sequenceiq.cloudbreak.domain.SmartSenseSubscription; import com.sequenceiq.cloudbreak.repository.SmartSenseSubscriptionRepository; import com.sequenceiq.cloudbreak.service.CloudbreakServiceException; @Service public class SmartSenseSubscriptionService { private static final Logger LOGGER = LoggerFactory.getLogger(SmartSenseSubscriptionService.class); @Inject private SmartSenseSubscriptionRepository repository; public SmartSenseSubscription create(SmartSenseSubscription subscription) { Iterable<SmartSenseSubscription> subs = repository.findAll(); if (subs.iterator().hasNext()) { throw new BadRequestException("Only one SmartSense subscription is allowed by deployment."); } try { subscription = repository.save(subscription); LOGGER.info("SmartSense subscription has been created: {}", subscription); return subscription; } catch (DataIntegrityViolationException dex) { String msg = String.format("The subscription id: '%s' has already taken by an other SmartSenseSubscription.", subscription.getSubscriptionId()); throw new CloudbreakServiceException(msg, dex); } } public SmartSenseSubscription update(SmartSenseSubscription subscription) { return repository.save(subscription); } public void delete(SmartSenseSubscription subscription, CbUser cbUser) { if (subscription != null) { boolean owner = cbUser.getUserId().equals(subscription.getOwner()); boolean adminInTheAccount = cbUser.getRoles().contains(CbUserRole.ADMIN) && subscription.getAccount().equals(cbUser.getAccount()); if (owner || adminInTheAccount) { try { repository.delete(subscription); LOGGER.info("SmartSense subscription has been deleted: {}", subscription); } catch (DataIntegrityViolationException divex) { throw new CloudbreakServiceException("Subscription could not be deleted, because it is assigned to Flex subscription(s).", divex); } } else { String msg = "Only the owner or the account admin has access to delete SmartSense subscription with id: %s"; throw new CloudbreakServiceException(String.format(msg, subscription.getId())); } } else { throw new CloudbreakServiceException(String.format("SmartSense subscription could not be found with id: %s", subscription.getId())); } } public void delete(Long id, CbUser cbUser) { SmartSenseSubscription subscription = repository.findOneById(id); delete(subscription, cbUser); } public SmartSenseSubscription findById(Long id) { LOGGER.info("Looking for SmartSense subscription with id: {}", id); return repository.findOne(id); } public SmartSenseSubscription findOneById(Long id) { LOGGER.info("Looking for one SmartSense subscription with id: {}", id); return repository.findOneById(id); } public SmartSenseSubscription findBySubscriptionId(String subscriptionId, String account) { LOGGER.info("Looking for SmartSense subscription with subscription id: {} in account: {}", subscriptionId, account); return repository.findBySubscriptionId(subscriptionId, account); } public Optional<SmartSenseSubscription> getOne() { LOGGER.info("Get the SmartSense subscription"); Iterator<SmartSenseSubscription> subscriptions = repository.findAll().iterator(); if (subscriptions.hasNext()) { return Optional.of(subscriptions.next()); } else { return Optional.empty(); } } public List<SmartSenseSubscription> findByOwner(String owner) { LOGGER.info("Looking for SmartSense subscriptions for owner: {}", owner); return repository.findByOwner(owner); } }