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.ConstraintTemplateEndpoint;
import com.sequenceiq.cloudbreak.api.model.ConstraintTemplateRequest;
import com.sequenceiq.cloudbreak.api.model.ConstraintTemplateResponse;
import com.sequenceiq.cloudbreak.domain.CbUser;
import com.sequenceiq.cloudbreak.domain.ConstraintTemplate;
import com.sequenceiq.cloudbreak.logger.MDCBuilder;
import com.sequenceiq.cloudbreak.service.constraint.ConstraintTemplateService;
@Component
public class ConstraintTemplateController implements ConstraintTemplateEndpoint {
@Autowired
private ConstraintTemplateService constraintTemplateService;
@Autowired
private AuthenticatedUserService authenticatedUserService;
@Autowired
@Qualifier("conversionService")
private ConversionService conversionService;
@Override
public ConstraintTemplateResponse postPrivate(ConstraintTemplateRequest constraintTemplateRequest) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
return createConstraintTemplate(user, constraintTemplateRequest, false);
}
@Override
public ConstraintTemplateResponse postPublic(ConstraintTemplateRequest constraintTemplateRequest) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
return createConstraintTemplate(user, constraintTemplateRequest, true);
}
@Override
public Set<ConstraintTemplateResponse> getPrivates() {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
Set<ConstraintTemplate> constraintTemplates = constraintTemplateService.retrievePrivateConstraintTemplates(user);
return convert(constraintTemplates);
}
@Override
public Set<ConstraintTemplateResponse> getPublics() {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
Set<ConstraintTemplate> templates = constraintTemplateService.retrieveAccountConstraintTemplates(user);
return convert(templates);
}
@Override
public ConstraintTemplateResponse get(Long id) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
ConstraintTemplate template = constraintTemplateService.get(id);
return convert(template);
}
@Override
public ConstraintTemplateResponse getPrivate(String name) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
ConstraintTemplate template = constraintTemplateService.getPrivateTemplate(name, user);
return convert(template);
}
@Override
public ConstraintTemplateResponse getPublic(@PathVariable String name) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
ConstraintTemplate template = constraintTemplateService.getPublicTemplate(name, user);
return convert(template);
}
@Override
public void delete(Long id) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
constraintTemplateService.delete(id, user);
}
@Override
public void deletePublic(String name) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
constraintTemplateService.delete(name, user);
}
@Override
public void deletePrivate(String name) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
constraintTemplateService.delete(name, user);
}
private ConstraintTemplateResponse createConstraintTemplate(CbUser user, ConstraintTemplateRequest constraintTemplateRequest, boolean publicInAccount) {
ConstraintTemplate constraintTemplate = convert(constraintTemplateRequest, publicInAccount);
constraintTemplate = constraintTemplateService.create(user, constraintTemplate);
return conversionService.convert(constraintTemplate, ConstraintTemplateResponse.class);
}
private ConstraintTemplate convert(ConstraintTemplateRequest constraintTemplateRequest, boolean publicInAccount) {
ConstraintTemplate converted = conversionService.convert(constraintTemplateRequest, ConstraintTemplate.class);
converted.setPublicInAccount(publicInAccount);
return converted;
}
private ConstraintTemplateResponse convert(ConstraintTemplate constraintTemplate) {
return conversionService.convert(constraintTemplate, ConstraintTemplateResponse.class);
}
private Set<ConstraintTemplateResponse> convert(Set<ConstraintTemplate> constraintTemplates) {
Set<ConstraintTemplateResponse> jsons = new HashSet<>();
for (ConstraintTemplate constraintTemplate: constraintTemplates) {
jsons.add(convert(constraintTemplate));
}
return jsons;
}
}