package com.sequenceiq.cloudbreak.controller; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Component; import com.sequenceiq.cloudbreak.api.endpoint.RdsConfigEndpoint; import com.sequenceiq.cloudbreak.api.model.RDSConfigRequest; import com.sequenceiq.cloudbreak.api.model.RDSConfigResponse; import com.sequenceiq.cloudbreak.common.type.APIResourceType; import com.sequenceiq.cloudbreak.controller.validation.rds.RdsConnectionValidator; import com.sequenceiq.cloudbreak.domain.CbUser; import com.sequenceiq.cloudbreak.domain.RDSConfig; import com.sequenceiq.cloudbreak.logger.MDCBuilder; import com.sequenceiq.cloudbreak.service.DuplicateKeyValueException; import com.sequenceiq.cloudbreak.service.rdsconfig.RdsConfigService; @Component public class RdsConfigController implements RdsConfigEndpoint { @Autowired private RdsConfigService rdsConfigService; @Autowired private AuthenticatedUserService authenticatedUserService; @Autowired private RdsConnectionValidator rdsConnectionValidator; @Autowired @Qualifier("conversionService") private ConversionService conversionService; @Override public RDSConfigResponse postPrivate(RDSConfigRequest rdsConfigRequest) { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); return createRdsConfig(user, rdsConfigRequest, false); } @Override public RDSConfigResponse postPublic(RDSConfigRequest rdsConfigRequest) { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); return createRdsConfig(user, rdsConfigRequest, true); } @Override public Set<RDSConfigResponse> getPrivates() { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); Set<RDSConfig> rdsConfigs = rdsConfigService.retrievePrivateRdsConfigs(user); return toJsonList(rdsConfigs); } @Override public RDSConfigResponse getPrivate(String name) { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); RDSConfig rdsConfig = rdsConfigService.getPrivateRdsConfig(name, user); return conversionService.convert(rdsConfig, RDSConfigResponse.class); } @Override public RDSConfigResponse getPublic(String name) { CbUser user = authenticatedUserService.getCbUser(); RDSConfig rdsConfig = rdsConfigService.getPublicRdsConfig(name, user); return conversionService.convert(rdsConfig, RDSConfigResponse.class); } @Override public Set<RDSConfigResponse> getPublics() { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); Set<RDSConfig> rdsConfigs = rdsConfigService.retrieveAccountRdsConfigs(user); return toJsonList(rdsConfigs); } @Override public RDSConfigResponse get(Long id) { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); RDSConfig rdsConfig = rdsConfigService.get(id); return conversionService.convert(rdsConfig, RDSConfigResponse.class); } @Override public void delete(Long id) { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); rdsConfigService.delete(id, user); } @Override public void deletePublic(String name) { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); rdsConfigService.delete(name, user); } @Override public void deletePrivate(String name) { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); rdsConfigService.delete(name, user); } private RDSConfigResponse createRdsConfig(CbUser user, RDSConfigRequest rdsConfigJson, boolean publicInAccount) { if (rdsConfigJson.isValidated()) { rdsConnectionValidator.validateRdsConnection(rdsConfigJson.getConnectionURL(), rdsConfigJson.getConnectionUserName(), rdsConfigJson.getConnectionPassword()); } RDSConfig rdsConfig = conversionService.convert(rdsConfigJson, RDSConfig.class); rdsConfig.setPublicInAccount(publicInAccount); try { rdsConfig = rdsConfigService.create(user, rdsConfig); } catch (DataIntegrityViolationException e) { throw new DuplicateKeyValueException(APIResourceType.RDS_CONFIG, rdsConfig.getName(), e); } return conversionService.convert(rdsConfig, RDSConfigResponse.class); } private Set<RDSConfigResponse> toJsonList(Set<RDSConfig> rdsConfigs) { return (Set<RDSConfigResponse>) conversionService.convert(rdsConfigs, TypeDescriptor.forObject(rdsConfigs), TypeDescriptor.collection(Set.class, TypeDescriptor.valueOf(RDSConfigResponse.class))); } }