/*
* Copyright 2014-2016 Hewlett-Packard Development Company, L.P.
* Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License.
*/
package com.hp.autonomy.frontend.find.idol.configuration;
import com.autonomy.aci.client.transport.AciServerDetails;
import com.hp.autonomy.frontend.configuration.ConfigException;
import com.hp.autonomy.frontend.configuration.ConfigFileService;
import com.hp.autonomy.frontend.configuration.LoginTypes;
import com.hp.autonomy.frontend.configuration.aci.CommunityService;
import com.hp.autonomy.frontend.configuration.validation.ConfigValidationException;
import com.hp.autonomy.frontend.configuration.validation.ValidationResult;
import com.hp.autonomy.frontend.configuration.validation.ValidationResults;
import com.hp.autonomy.frontend.logging.Markers;
import com.hp.autonomy.types.idol.responses.SecurityType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@RestController
@Slf4j
@RequestMapping({"/api/admin/config", "/api/config/config"})
public class IdolConfigurationController {
private final CommunityService communityService;
private final ConfigFileService<IdolFindConfig> configService;
@Autowired
public IdolConfigurationController(final CommunityService communityService, final ConfigFileService<IdolFindConfig> configService) {
this.communityService = communityService;
this.configService = configService;
}
@RequestMapping(value = "/config", method = RequestMethod.GET)
public Object config() {
return configService.getConfigResponse();
}
@SuppressWarnings("ProhibitedExceptionDeclared")
@RequestMapping(value = "/config", method = {RequestMethod.POST, RequestMethod.PUT})
public ResponseEntity<?> saveConfig(@RequestBody final IdolFindConfigWrapper configResponse) throws Exception {
log.info(Markers.AUDIT, "REQUESTED UPDATE CONFIGURATION");
//TODO: move this to CommunityAuthentication validator once FIND-1254 is complete
if (LoginTypes.DEFAULT.equals(configResponse.getConfig().getAuthentication().getMethod())) {
final ValidationResults validationResults = new ValidationResults.Builder()
.put("login", new ValidationResult<>(false, CommunityAuthenticationValidation.DEFAULT_LOGIN))
.build();
return new ResponseEntity<>(Collections.singletonMap("validation", validationResults), HttpStatus.NOT_ACCEPTABLE);
}
try {
configService.updateConfig(configResponse.getConfig());
final Object response = configService.getConfigResponse();
log.info(Markers.AUDIT, "UPDATED CONFIGURATION");
return new ResponseEntity<>(response, HttpStatus.OK);
} catch (final ConfigException ce) {
return new ResponseEntity<>(Collections.singletonMap("exception", ce.getMessage()), HttpStatus.NOT_ACCEPTABLE);
} catch (final ConfigValidationException cve) {
return new ResponseEntity<>(Collections.singletonMap("validation", cve.getValidationErrors()), HttpStatus.NOT_ACCEPTABLE);
}
}
@RequestMapping(value = "/securitytypes", method = RequestMethod.GET)
public Map<String, List<String>> getSecurityTypes(@RequestParam final int port, @RequestParam final String host, @RequestParam final AciServerDetails.TransportProtocol protocol) {
if (port <= 0 || host == null || protocol == null) {
throw new IllegalArgumentException("Host, port and protocol must be supplied.");
}
final List<SecurityType> types = communityService.getSecurityTypes(new AciServerDetails(protocol, host, port));
final List<String> typeNames = types.stream().map(SecurityType::getName).collect(Collectors.toList());
return Collections.singletonMap("securityTypes", typeNames);
}
private enum CommunityAuthenticationValidation {
DEFAULT_LOGIN
}
}