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.stereotype.Component;
import com.sequenceiq.cloudbreak.api.endpoint.ClusterTemplateEndpoint;
import com.sequenceiq.cloudbreak.api.model.ClusterTemplateRequest;
import com.sequenceiq.cloudbreak.api.model.ClusterTemplateResponse;
import com.sequenceiq.cloudbreak.domain.CbUser;
import com.sequenceiq.cloudbreak.domain.ClusterTemplate;
import com.sequenceiq.cloudbreak.logger.MDCBuilder;
import com.sequenceiq.cloudbreak.service.clustertemplate.ClusterTemplateService;
@Component
public class ClusterTemplateController implements ClusterTemplateEndpoint {
@Autowired
private ClusterTemplateService clusterTemplateService;
@Autowired
private AuthenticatedUserService authenticatedUserService;
@Autowired
@Qualifier("conversionService")
private ConversionService conversionService;
@Override
public ClusterTemplateResponse postPrivate(ClusterTemplateRequest clusterTemplateRequest) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
return createClusterTemplateRequest(user, clusterTemplateRequest, false);
}
@Override
public ClusterTemplateResponse postPublic(ClusterTemplateRequest clusterTemplateRequest) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
return createClusterTemplateRequest(user, clusterTemplateRequest, true);
}
@Override
public Set<ClusterTemplateResponse> getPrivates() {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
Set<ClusterTemplate> clusterTemplates = clusterTemplateService.retrievePrivateClusterTemplates(user);
return toJsonList(clusterTemplates);
}
@Override
public ClusterTemplateResponse getPrivate(String name) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
ClusterTemplate clusterTemplate = clusterTemplateService.getPrivateClusterTemplate(name, user);
return conversionService.convert(clusterTemplate, ClusterTemplateResponse.class);
}
@Override
public ClusterTemplateResponse getPublic(String name) {
CbUser user = authenticatedUserService.getCbUser();
ClusterTemplate clusterTemplate = clusterTemplateService.getPublicClusterTemplate(name, user);
return conversionService.convert(clusterTemplate, ClusterTemplateResponse.class);
}
@Override
public Set<ClusterTemplateResponse> getPublics() {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
Set<ClusterTemplate> clusterTemplates = clusterTemplateService.retrieveAccountClusterTemplates(user);
return toJsonList(clusterTemplates);
}
@Override
public ClusterTemplateResponse get(Long id) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
ClusterTemplate clusterTemplate = clusterTemplateService.get(id);
return conversionService.convert(clusterTemplate, ClusterTemplateResponse.class);
}
@Override
public void delete(Long id) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
clusterTemplateService.delete(id, user);
}
@Override
public void deletePublic(String name) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
clusterTemplateService.delete(name, user);
}
@Override
public void deletePrivate(String name) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
clusterTemplateService.delete(name, user);
}
private ClusterTemplateResponse createClusterTemplateRequest(CbUser user, ClusterTemplateRequest clusterTemplateRequest, boolean publicInAccount) {
ClusterTemplate clusterTemplate = conversionService.convert(clusterTemplateRequest, ClusterTemplate.class);
clusterTemplate.setPublicInAccount(publicInAccount);
clusterTemplate = clusterTemplateService.create(user, clusterTemplate);
return conversionService.convert(clusterTemplate, ClusterTemplateResponse.class);
}
private Set<ClusterTemplateResponse> toJsonList(Set<ClusterTemplate> clusterTemplates) {
return (Set<ClusterTemplateResponse>) conversionService.convert(clusterTemplates,
TypeDescriptor.forObject(clusterTemplates),
TypeDescriptor.collection(Set.class, TypeDescriptor.valueOf(ClusterTemplateResponse.class)));
}
}