blob: 3f861ae50e783df15367658bcc3e31d631f3ef72 [file] [log] [blame]
package de.ids_mannheim.korap.web.controller;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import de.ids_mannheim.korap.constant.OAuth2Scope;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.exceptions.StatusCodes;
import de.ids_mannheim.korap.oauth2.service.OAuth2ScopeService;
import de.ids_mannheim.korap.security.context.TokenContext;
import de.ids_mannheim.korap.service.DefaultSettingService;
import de.ids_mannheim.korap.web.KustvaktResponseHandler;
import de.ids_mannheim.korap.web.filter.APIVersionFilter;
import de.ids_mannheim.korap.web.filter.AuthenticationFilter;
import de.ids_mannheim.korap.web.filter.BlockingFilter;
import de.ids_mannheim.korap.web.utils.ResourceFilters;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.PUT;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.SecurityContext;
/**
* UserSettingController defines web APIs related to user default
* setting.
*
* All the APIs in this class are only available to logged-in users.
*
* @author margaretha
*
*/
@Controller
@Path("{version}/{username: ~[a-zA-Z0-9_.]+}/setting")
@ResourceFilters({APIVersionFilter.class, BlockingFilter.class,
AuthenticationFilter.class})
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public class UserSettingController {
@Autowired
private DefaultSettingService settingService;
@Autowired
private KustvaktResponseHandler kustvaktResponseHandler;
@Autowired
private OAuth2ScopeService scopeService;
/**
* Creates a default setting of the given username.
* The setting inputs should be represented as pairs of keys and
* values (a map). The keys must only contains alphabets, numbers,
* hypens or underscores.
*
*
* @param context
* security context
* @param username
* username
* @param map
* the default setting
* @return status code 201 if a new resource is created, or 200 if
* an existing resource is edited.
*/
@PUT
@Consumes(MediaType.APPLICATION_JSON)
public Response createDefaultSetting (@Context SecurityContext context,
@PathParam("username") String username, Map<String, Object> map) {
TokenContext tokenContext = (TokenContext) context.getUserPrincipal();
try {
scopeService.verifyScope(tokenContext,
OAuth2Scope.CREATE_DEFAULT_SETTING);
int statusCode = settingService.handlePutRequest(username, map,
tokenContext.getUsername());
return Response.status(statusCode).build();
}
catch (KustvaktException e) {
throw kustvaktResponseHandler.throwit(e);
}
}
/**
* Retrieves the default setting of the given username.
*
* @param context
* a security context
* @param username
* a username
* @return the default setting of the given username
*/
@GET
public Response retrieveDefaultSetting (@Context SecurityContext context,
@PathParam("username") String username) {
TokenContext tokenContext = (TokenContext) context.getUserPrincipal();
try {
scopeService.verifyScope(tokenContext,
OAuth2Scope.READ_DEFAULT_SETTING);
String settings = settingService.retrieveDefaultSettings(username,
tokenContext.getUsername());
if (settings == null) {
username = tokenContext.getUsername();
throw new KustvaktException(StatusCodes.NO_RESOURCE_FOUND,
"No default setting for username: " + username
+ " is found",
username);
}
return Response.ok(settings).build();
}
catch (KustvaktException e) {
throw kustvaktResponseHandler.throwit(e);
}
}
/**
* Deletes an entry of a default setting of a user by the given
* key.
*
* @param context
* a security context
* @param username
* a username
* @param key
* the key of the default setting entry to be deleted
* @return
*/
@DELETE
@Path("{key}")
@Consumes(MediaType.APPLICATION_JSON)
public Response deleteDefaultSettingEntry (@Context SecurityContext context,
@PathParam("username") String username,
@PathParam("key") String key) {
TokenContext tokenContext = (TokenContext) context.getUserPrincipal();
try {
scopeService.verifyScope(tokenContext,
OAuth2Scope.DELETE_DEFAULT_SETTING);
settingService.deleteKey(username, tokenContext.getUsername(), key);
return Response.ok().build();
}
catch (KustvaktException e) {
throw kustvaktResponseHandler.throwit(e);
}
}
/**
* Deletes the default setting of the given username. If such a
* setting does not exists, no error will be thrown and response
* status 200 will be returned since the purpose of the request
* has been achieved.
*
* @param context
* @param username
* a username
* @return 200 if the request is successful
*/
@DELETE
public Response deleteDefaultSetting (@Context SecurityContext context,
@PathParam("username") String username) {
TokenContext tokenContext = (TokenContext) context.getUserPrincipal();
try {
scopeService.verifyScope(tokenContext,
OAuth2Scope.DELETE_DEFAULT_SETTING);
settingService.deleteSetting(username, tokenContext.getUsername());
return Response.ok().build();
}
catch (KustvaktException e) {
throw kustvaktResponseHandler.throwit(e);
}
}
}