/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.sa.api;
import static com.emc.sa.api.mapper.CatalogPreferencesMapper.map;
import static com.emc.sa.api.mapper.CatalogPreferencesMapper.updateObject;
import static com.emc.storageos.db.client.URIUtil.uri;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import javax.annotation.PostConstruct;
import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import com.emc.sa.api.utils.ValidationUtils;
import com.emc.sa.catalog.CatalogPreferenceManager;
import com.emc.storageos.db.client.model.uimodels.TenantPreferences;
import com.emc.storageos.security.authentication.StorageOSUser;
import com.emc.storageos.security.authorization.CheckPermission;
import com.emc.storageos.security.authorization.Role;
import com.emc.storageos.services.OperationTypeEnum;
import com.emc.storageos.svcs.errorhandling.resources.APIException;
import com.emc.vipr.client.catalog.impl.SearchConstants;
import com.emc.vipr.model.catalog.CatalogPreferencesRestRep;
import com.emc.vipr.model.catalog.CatalogPreferencesUpdateParam;
@Path("/catalog/preferences")
public class CatalogPreferenceService extends CatalogResourceService {
private static final Logger log = Logger.getLogger(CatalogPreferenceService.class);
private static final String EVENT_SERVICE_TYPE = "catalog-preferences";
@Autowired
private CatalogPreferenceManager catalogPreferenceManager;
@PostConstruct
public void init() {
log.info("Initializing CatalogPreferenceService");
}
@Override
public String getServiceType() {
return EVENT_SERVICE_TYPE;
}
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Path("")
public CatalogPreferencesRestRep get(@DefaultValue("") @QueryParam(SearchConstants.TENANT_ID_PARAM) String tenantId) {
StorageOSUser user = getUserFromContext();
if (StringUtils.isBlank(tenantId)) {
tenantId = user.getTenantId();
}
verifyAuthorizedInTenantOrg(uri(tenantId), user);
TenantPreferences catalogPreferences = catalogPreferenceManager.getPreferencesByTenant(tenantId);
return map(catalogPreferences);
}
@PUT
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Path("")
@CheckPermission(roles = { Role.TENANT_ADMIN })
public CatalogPreferencesRestRep update(CatalogPreferencesUpdateParam param) {
String tenantId = param.getTenantId();
StorageOSUser user = getUserFromContext();
if (StringUtils.isBlank(tenantId)) {
tenantId = user.getTenantId();
}
verifyAuthorizedInTenantOrg(uri(tenantId), user);
TenantPreferences tenantPreferences = catalogPreferenceManager.getPreferencesByTenant(tenantId);
validateParam(uri(tenantId), param, tenantPreferences);
updateObject(tenantPreferences, param);
catalogPreferenceManager.updatePreferences(tenantPreferences);
auditOpSuccess(OperationTypeEnum.UPDATE_CATALOG_PREFERENCES, tenantPreferences.auditParameters());
tenantPreferences = catalogPreferenceManager.getPreferences(tenantPreferences.getId());
return map(tenantPreferences);
}
private void validateParam(URI tenantId, CatalogPreferencesUpdateParam input, TenantPreferences existing) {
if (StringUtils.isNotBlank(input.getApproverEmail())) {
for (String email : StringUtils.split(input.getApproverEmail(), ",")) {
email = StringUtils.trim(email);
if (ValidationUtils.isValidEmail(email) == false) {
throw APIException.badRequests.propertyValueTypeIsInvalid("approver_email", "email");
}
}
}
if (StringUtils.isNotBlank(input.getApprovalUrl())) {
try {
URL url = new URL(input.getApprovalUrl());
if (!"http".equalsIgnoreCase(url.getProtocol()) && !"https".equalsIgnoreCase(url.getProtocol())) {
throw APIException.badRequests.propertyValueTypeIsInvalid("approval_url", "url");
}
else if (!ValidationUtils.isValidHostNameOrIp(url.getHost())) {
throw APIException.badRequests.propertyValueTypeIsInvalid("approval_url", "url");
}
} catch (MalformedURLException e) {
throw APIException.badRequests.propertyValueTypeIsInvalid("approval_url", "url");
}
}
}
}