package com.sequenceiq.cloudbreak.service.flex;
import java.util.List;
import java.util.function.BiConsumer;
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.domain.CbUser;
import com.sequenceiq.cloudbreak.domain.FlexSubscription;
import com.sequenceiq.cloudbreak.repository.FlexSubscriptionRepository;
import com.sequenceiq.cloudbreak.service.CloudbreakServiceException;
@Service
public class FlexSubscriptionService {
private static final Logger LOGGER = LoggerFactory.getLogger(FlexSubscriptionService.class);
@Inject
private FlexSubscriptionRepository flexRepo;
public FlexSubscription create(FlexSubscription subscription) {
try {
subscription = flexRepo.save(subscription);
LOGGER.info("Flex subscription has been created: {}", subscription);
return subscription;
} catch (DataIntegrityViolationException dex) {
String msg = String.format("The name: '%s' has already taken by an other FlexSubscription.", subscription.getName());
throw new CloudbreakServiceException(msg, dex);
}
}
public void delete(FlexSubscription subscription, CbUser user) {
if (subscription != null) {
boolean owner = user.getUserId().equals(subscription.getOwner());
boolean adminInTheAccount = user.getRoles().contains(CbUserRole.ADMIN) && subscription.getAccount().equals(user.getAccount());
if (owner || adminInTheAccount) {
flexRepo.delete(subscription);
LOGGER.info("Flex subscription has been deleted: {}", subscription);
} else {
String msg = "Only the owner or the account admin has access to delete Flex subscription with id: %s";
throw new CloudbreakServiceException(String.format(msg, subscription.getId()));
}
} else {
throw new CloudbreakServiceException(String.format("Flex subscription could not be found with id: %s", subscription.getId()));
}
}
public void delete(Long id, CbUser user) {
FlexSubscription subscription = flexRepo.findOneById(id);
delete(subscription, user);
}
public FlexSubscription findById(Long id) {
LOGGER.info("Looking for Flex subscription with id: {}", id);
return flexRepo.findOne(id);
}
public FlexSubscription findOneById(Long id) {
LOGGER.info("Looking for one Flex subscription with id: {}", id);
return flexRepo.findOneById(id);
}
public List<FlexSubscription> findByOwner(String owner) {
LOGGER.info("Looking for Flex subscriptions for owner: {}", owner);
return flexRepo.findByOwner(owner);
}
public FlexSubscription findOneByName(String name) {
LOGGER.info("Looking for Flex subscription name id: {}", name);
return flexRepo.findOneByName(name);
}
public FlexSubscription findByNameInAccount(String name, String owner, String account) {
LOGGER.info("Looking for Flex subscription with name: {}, in account: {}", name, account);
return flexRepo.findOneByNameInAccount(name, owner, account);
}
public List<FlexSubscription> findPublicInAccountForUser(CbUser user) {
LOGGER.info("Looking for public Flex subscriptions for user: {}", user.getUsername());
if (user.getRoles().contains(CbUserRole.ADMIN)) {
return flexRepo.findAllInAccount(user.getAccount());
} else {
return flexRepo.findPublicInAccountForUser(user.getUserId(), user.getAccount());
}
}
public void setDefaultFlexSubscription(String name, CbUser cbUser) {
setFlexSubscriptionFlag(name, cbUser, (flex, flag) -> flex.setDefault(flag));
}
public void setUsedForControllerFlexSubscription(String name, CbUser cbUser) {
setFlexSubscriptionFlag(name, cbUser, (flex, flag) -> flex.setUsedForController(flag));
}
private void setFlexSubscriptionFlag(String name, CbUser cbUser, BiConsumer<FlexSubscription, Boolean> setter) {
List<FlexSubscription> allInAccount = flexRepo.findAllInAccount(cbUser.getAccount());
for (FlexSubscription flex : allInAccount) {
if (name.equals(flex.getSubscriptionId())) {
setter.accept(flex, true);
} else {
setter.accept(flex, false);
}
}
flexRepo.save(allInAccount);
}
}