/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.api.user.server;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.eclipse.che.api.core.BadRequestException;
import org.eclipse.che.api.core.ServerException;
import org.eclipse.che.api.core.rest.Service;
import org.eclipse.che.api.core.rest.annotations.GenerateLink;
import org.eclipse.che.commons.env.EnvironmentContext;
import javax.annotation.security.RolesAllowed;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import java.util.List;
import java.util.Map;
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
import static org.eclipse.che.api.user.server.Constants.LINK_REL_PREFERENCES;
/**
* Preferences REST API.
*
* @author Yevhenii Voevodin
*/
@Path("/preferences")
@Api(value = "/preferences", description = "Preferences REST API")
public class PreferencesService extends Service {
@Inject
private PreferenceManager preferenceManager;
@GET
@Produces(APPLICATION_JSON)
@GenerateLink(rel = LINK_REL_PREFERENCES)
@ApiOperation(value = "Gets preferences of logged in user",
notes = "If not all the preferences needed then 'filter' may be used, " +
"basically it is regex for filtering preferences by names")
@ApiResponses({@ApiResponse(code = 200, message = "Preferences successfully fetched"),
@ApiResponse(code = 500, message = "Internal Server Error")})
public Map<String, String> find(@ApiParam("Regex for filtering preferences by names, e.g. '.*github.*' " +
"will return all the preferences which name contains github")
@QueryParam("filter")
String filter) throws ServerException {
if (filter == null) {
return preferenceManager.find(userId());
}
return preferenceManager.find(userId(), filter);
}
@POST
@Consumes(APPLICATION_JSON)
@GenerateLink(rel = LINK_REL_PREFERENCES)
@ApiOperation(value = "Saves preferences of logged in user",
notes = "All the existing user's preferences will be override by this method")
@ApiResponses({@ApiResponse(code = 204, message = "Preferences successfully saved"),
@ApiResponse(code = 400, message = "Request doesn't contain new preferences"),
@ApiResponse(code = 500, message = "Couldn't save preferences due to internal server error")})
public void save(Map<String, String> preferences) throws BadRequestException, ServerException {
if (preferences == null) {
throw new BadRequestException("Required non-null new preferences");
}
preferenceManager.save(userId(), preferences);
}
@PUT
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
@GenerateLink(rel = LINK_REL_PREFERENCES)
@ApiOperation(value = "Updates preferences of logged in user",
notes = "The merge strategy is used for update, which means that " +
"existing preferences with keys equal to update preference keys will " +
"be replaces with new values, and new preferences will be added")
@ApiResponses({@ApiResponse(code = 200, message = "Preferences successfully updated, response contains " +
"all the user preferences"),
@ApiResponse(code = 400, message = "Request doesn't contain preferences update"),
@ApiResponse(code = 500, message = "Couldn't update preferences due to internal server error")})
public Map<String, String> update(Map<String, String> preferences) throws ServerException, BadRequestException {
if (preferences == null) {
throw new BadRequestException("Required non-null preferences update");
}
return preferenceManager.update(userId(), preferences);
}
@DELETE
@Consumes(APPLICATION_JSON)
@GenerateLink(rel = LINK_REL_PREFERENCES)
@ApiOperation(value = "Remove preferences of logged in user.",
notes = "If names are not specified, then all the user's preferences will be removed, " +
"otherwise only the preferences which names are listed")
@ApiResponses({@ApiResponse(code = 204, message = "Preferences successfully removed"),
@ApiResponse(code = 500, message = "Couldn't remove preferences due to internal server error")})
public void removePreferences(@ApiParam("Preferences to remove") List<String> names) throws ServerException {
if (names == null || names.isEmpty()) {
preferenceManager.remove(userId());
} else {
preferenceManager.remove(userId(), names);
}
}
private static String userId() {
return EnvironmentContext.getCurrent().getSubject().getUserId();
}
}