/*
* JBoss, Home of Professional Open Source
* Copyright 2012 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @authors tag. All rights reserved.
*/
package org.searchisko.api.rest;
import javax.annotation.PostConstruct;
import javax.annotation.security.RolesAllowed;
import javax.ejb.ObjectNotFoundException;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.elasticsearch.action.search.SearchResponse;
import org.searchisko.api.audit.annotation.Audit;
import org.searchisko.api.audit.annotation.AuditContent;
import org.searchisko.api.audit.annotation.AuditId;
import org.searchisko.api.audit.annotation.AuditIgnore;
import org.searchisko.api.rest.exception.RequiredFieldException;
import org.searchisko.api.security.Role;
import org.searchisko.api.service.ContributorService;
import org.searchisko.api.util.SearchUtils;
/**
* Contributor REST API
*
* @author Libor Krzyzanek
* @author Vlastimil Elias (velias at redhat dot com)
*/
@RequestScoped
@Path("/contributor")
@RolesAllowed({Role.ADMIN, Role.CONTRIBUTORS_MANAGER})
@Audit
public class ContributorRestService extends RestEntityServiceBase {
public static final String PARAM_EMAIL = "email";
public static final String PARAM_CODE = "code";
public static final String PARAM_NAME = "name";
@Inject
protected ContributorService contributorService;
@PostConstruct
public void init() {
setEntityService(contributorService);
}
@GET
@Path("/search")
@Produces(MediaType.APPLICATION_JSON)
@AuditIgnore
public Object search(@Context UriInfo uriInfo) {
if (uriInfo == null || uriInfo.getQueryParameters().isEmpty() || uriInfo.getQueryParameters().size() > 1) {
return Response.status(Response.Status.BAD_REQUEST).entity("One request parameter is expected").build();
}
SearchResponse response = null;
String codeName = uriInfo.getQueryParameters().keySet().iterator().next();
String codeValue = uriInfo.getQueryParameters().getFirst(codeName);
if (SearchUtils.isBlank(codeValue)) {
return Response.status(Response.Status.BAD_REQUEST)
.entity("Value for request parameter " + codeName + " must be provided").build();
}
if (PARAM_CODE.equals(codeName)) {
response = contributorService.findByCode(codeValue);
} else if (PARAM_EMAIL.equals(codeName)) {
response = contributorService.findByEmail(codeValue);
} else if (PARAM_NAME.equals(codeName)) {
response = contributorService.findByName(codeValue, false);
} else {
response = contributorService.findByTypeSpecificCode(codeName, codeValue);
}
return new ESDataOnlyResponse(response);
}
@POST
@Path("/{id}/code/{code}")
@Produces(MediaType.APPLICATION_JSON)
public Object codeChange(@PathParam("id") @AuditId String id, @AuditContent @PathParam("code") String code) throws ObjectNotFoundException {
if ((id = SearchUtils.trimToNull(id)) == null) {
throw new RequiredFieldException("id");
}
if ((code = SearchUtils.trimToNull(code)) == null) {
throw new RequiredFieldException("code");
}
return contributorService.changeContributorCode(id, code);
}
@POST
@Path("/{idFrom}/mergeTo/{idTo}")
@Produces(MediaType.APPLICATION_JSON)
public Object mergeContributors(@PathParam("idFrom") @AuditId String idFrom, @AuditContent @PathParam("idTo") String idTo)
throws ObjectNotFoundException {
if ((idFrom = SearchUtils.trimToNull(idFrom)) == null) {
throw new RequiredFieldException("idFrom");
}
if ((idTo = SearchUtils.trimToNull(idTo)) == null) {
throw new RequiredFieldException("id");
}
return contributorService.mergeContributors(idFrom, idTo);
}
}