package com.sequenceiq.cloudbreak.controller;
import java.util.HashSet;
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.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;
import com.sequenceiq.cloudbreak.api.endpoint.TemplateEndpoint;
import com.sequenceiq.cloudbreak.api.model.TemplateRequest;
import com.sequenceiq.cloudbreak.api.model.TemplateResponse;
import com.sequenceiq.cloudbreak.controller.validation.template.TemplateValidator;
import com.sequenceiq.cloudbreak.domain.CbUser;
import com.sequenceiq.cloudbreak.domain.Template;
import com.sequenceiq.cloudbreak.logger.MDCBuilder;
import com.sequenceiq.cloudbreak.service.decorator.Decorator;
import com.sequenceiq.cloudbreak.service.template.DefaultTemplateLoaderService;
import com.sequenceiq.cloudbreak.service.template.TemplateService;
@Component
public class TemplateController implements TemplateEndpoint {
@Autowired
private TemplateService templateService;
@Autowired
private DefaultTemplateLoaderService defaultTemplateLoaderService;
@Autowired
private AuthenticatedUserService authenticatedUserService;
@Autowired
private TemplateValidator templateValidator;
@Autowired
private Decorator<Template> templateDecorator;
@Autowired
@Qualifier("conversionService")
private ConversionService conversionService;
@Override
public TemplateResponse postPrivate(TemplateRequest templateRequest) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
return createTemplate(user, templateRequest, false);
}
@Override
public TemplateResponse postPublic(TemplateRequest templateRequest) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
return createTemplate(user, templateRequest, true);
}
@Override
public Set<TemplateResponse> getPrivates() {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
defaultTemplateLoaderService.createDefaultTemplates(user);
Set<Template> templates = templateService.retrievePrivateTemplates(user);
return convert(templates);
}
@Override
public Set<TemplateResponse> getPublics() {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
defaultTemplateLoaderService.createDefaultTemplates(user);
Set<Template> templates = templateService.retrieveAccountTemplates(user);
return convert(templates);
}
@Override
public TemplateResponse get(Long id) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
Template template = templateService.get(id);
return convert(template);
}
@Override
public TemplateResponse getPrivate(String name) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
Template template = templateService.getPrivateTemplate(name, user);
return convert(template);
}
@Override
public TemplateResponse getPublic(@PathVariable String name) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
Template template = templateService.getPublicTemplate(name, user);
return convert(template);
}
@Override
public void delete(Long id) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
templateService.delete(id, user);
}
@Override
public void deletePublic(String name) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
templateService.delete(name, user);
}
@Override
public void deletePrivate(String name) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
templateService.delete(name, user);
}
private TemplateResponse createTemplate(CbUser user, TemplateRequest templateRequest, boolean publicInAccount) {
Template template = convert(templateRequest, publicInAccount);
templateValidator.validateTemplateRequest(template);
template = templateDecorator.decorate(template);
template = templateService.create(user, template);
return conversionService.convert(template, TemplateResponse.class);
}
private Template convert(TemplateRequest templateRequest, boolean publicInAccount) {
Template converted = conversionService.convert(templateRequest, Template.class);
converted.setPublicInAccount(publicInAccount);
return converted;
}
private TemplateResponse convert(Template template) {
return conversionService.convert(template, TemplateResponse.class);
}
private Set<TemplateResponse> convert(Set<Template> templates) {
Set<TemplateResponse> jsons = new HashSet<>();
for (Template template : templates) {
jsons.add(convert(template));
}
return jsons;
}
}