package com.sequenceiq.cloudbreak.controller;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.annotation.Resource;
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 com.sequenceiq.cloudbreak.api.endpoint.CredentialEndpoint;
import com.sequenceiq.cloudbreak.api.model.CredentialRequest;
import com.sequenceiq.cloudbreak.api.model.CredentialResponse;
import com.sequenceiq.cloudbreak.domain.CbUser;
import com.sequenceiq.cloudbreak.domain.Credential;
import com.sequenceiq.cloudbreak.logger.MDCBuilder;
import com.sequenceiq.cloudbreak.service.credential.CredentialService;
@Component
public class CredentialController implements CredentialEndpoint {
@Resource
@Qualifier("conversionService")
private ConversionService conversionService;
@Autowired
private CredentialService credentialService;
@Autowired
private AuthenticatedUserService authenticatedUserService;
@Override
public CredentialResponse postPrivate(CredentialRequest credentialRequest) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
return createCredential(user, credentialRequest, false);
}
@Override
public CredentialResponse postPublic(CredentialRequest credentialRequest) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
return createCredential(user, credentialRequest, true);
}
@Override
public Set<CredentialResponse> getPrivates() {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
Set<Credential> credentials = credentialService.retrievePrivateCredentials(user);
return convertCredentials(credentials);
}
@Override
public Set<CredentialResponse> getPublics() {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
Set<Credential> credentials = credentialService.retrieveAccountCredentials(user);
return convertCredentials(credentials);
}
@Override
public CredentialResponse getPrivate(String name) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
Credential credentials = credentialService.getPrivateCredential(name, user);
return convert(credentials);
}
@Override
public CredentialResponse getPublic(String name) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
Credential credentials = credentialService.getPublicCredential(name, user);
return convert(credentials);
}
@Override
public CredentialResponse get(Long id) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
Credential credential = credentialService.get(id);
return convert(credential);
}
@Override
public void delete(Long id) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
credentialService.delete(id, user);
}
@Override
public void deletePublic(String name) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
credentialService.delete(name, user);
}
@Override
public void deletePrivate(String name) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
credentialService.delete(name, user);
}
@Override
public Map<String, String> privateInteractiveLogin(CredentialRequest credentialRequest) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
return interactiveLogin(user, credentialRequest, false);
}
@Override
public Map<String, String> publicInteractiveLogin(CredentialRequest credentialRequest) {
CbUser user = authenticatedUserService.getCbUser();
MDCBuilder.buildUserMdcContext(user);
return interactiveLogin(user, credentialRequest, true);
}
private Map<String, String> interactiveLogin(CbUser user, CredentialRequest credentialRequest, boolean publicInAccount) {
Credential credential = convert(credentialRequest, publicInAccount);
return credentialService.interactiveLogin(user, credential);
}
private CredentialResponse createCredential(CbUser user, CredentialRequest credentialRequest, boolean publicInAccount) {
Credential credential = convert(credentialRequest, publicInAccount);
credential = credentialService.create(user, credential);
return conversionService.convert(credential, CredentialResponse.class);
}
private Credential convert(CredentialRequest json, boolean publicInAccount) {
Credential converted = conversionService.convert(json, Credential.class);
converted.setPublicInAccount(publicInAccount);
return converted;
}
private CredentialResponse convert(Credential credential) {
return conversionService.convert(credential, CredentialResponse.class);
}
private Set<CredentialResponse> convertCredentials(Set<Credential> credentials) {
Set<CredentialResponse> jsonSet = new HashSet<>();
for (Credential credential : credentials) {
jsonSet.add(convert(credential));
}
return jsonSet;
}
}