mirror of https://github.com/sismics/docs.git
231 lines
7.6 KiB
Java
231 lines
7.6 KiB
Java
package com.sismics.docs.rest.resource;
|
|
|
|
import java.text.MessageFormat;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import javax.persistence.NoResultException;
|
|
import javax.ws.rs.DELETE;
|
|
import javax.ws.rs.FormParam;
|
|
import javax.ws.rs.GET;
|
|
import javax.ws.rs.POST;
|
|
import javax.ws.rs.PUT;
|
|
import javax.ws.rs.Path;
|
|
import javax.ws.rs.PathParam;
|
|
import javax.ws.rs.Produces;
|
|
import javax.ws.rs.QueryParam;
|
|
import javax.ws.rs.core.MediaType;
|
|
import javax.ws.rs.core.Response;
|
|
|
|
import org.codehaus.jettison.json.JSONException;
|
|
import org.codehaus.jettison.json.JSONObject;
|
|
|
|
import com.sismics.docs.core.dao.jpa.DocumentDao;
|
|
import com.sismics.docs.core.dao.jpa.criteria.DocumentCriteria;
|
|
import com.sismics.docs.core.dao.jpa.dto.DocumentDto;
|
|
import com.sismics.docs.core.model.jpa.Document;
|
|
import com.sismics.docs.core.util.jpa.PaginatedList;
|
|
import com.sismics.docs.core.util.jpa.PaginatedLists;
|
|
import com.sismics.docs.core.util.jpa.SortCriteria;
|
|
import com.sismics.rest.exception.ClientException;
|
|
import com.sismics.rest.exception.ForbiddenClientException;
|
|
import com.sismics.rest.util.ValidationUtil;
|
|
|
|
/**
|
|
* Document REST resources.
|
|
*
|
|
* @author bgamard
|
|
*/
|
|
@Path("/document")
|
|
public class DocumentResource extends BaseResource {
|
|
/**
|
|
* Returns a document.
|
|
*
|
|
* @param id Document ID
|
|
* @return Response
|
|
* @throws JSONException
|
|
*/
|
|
@GET
|
|
@Produces(MediaType.APPLICATION_JSON)
|
|
public Response get(
|
|
@QueryParam("id") String id) throws JSONException {
|
|
if (!authenticate()) {
|
|
throw new ForbiddenClientException();
|
|
}
|
|
|
|
DocumentDao documentDao = new DocumentDao();
|
|
Document documentDb = null;
|
|
try {
|
|
documentDb = documentDao.getDocument(id, principal.getId());
|
|
} catch (NoResultException e) {
|
|
throw new ClientException("DocumentNotFound", MessageFormat.format("Document not found: {0}", id));
|
|
}
|
|
|
|
JSONObject document = new JSONObject();
|
|
document.put("id", documentDb.getId());
|
|
document.put("title", documentDb.getTitle());
|
|
document.put("description", documentDb.getDescription());
|
|
document.put("create_date", documentDb.getCreateDate().getTime());
|
|
|
|
return Response.ok().entity(document).build();
|
|
}
|
|
|
|
/**
|
|
* Returns all documents.
|
|
*
|
|
* @param limit Page limit
|
|
* @param offset Page offset
|
|
* @return Response
|
|
* @throws JSONException
|
|
*/
|
|
@GET
|
|
@Path("list")
|
|
@Produces(MediaType.APPLICATION_JSON)
|
|
public Response list(
|
|
@QueryParam("limit") Integer limit,
|
|
@QueryParam("offset") Integer offset,
|
|
@QueryParam("sort_column") Integer sortColumn,
|
|
@QueryParam("asc") Boolean asc) throws JSONException {
|
|
if (!authenticate()) {
|
|
throw new ForbiddenClientException();
|
|
}
|
|
|
|
JSONObject response = new JSONObject();
|
|
List<JSONObject> documents = new ArrayList<JSONObject>();
|
|
|
|
DocumentDao documentDao = new DocumentDao();
|
|
PaginatedList<DocumentDto> paginatedList = PaginatedLists.create(limit, offset);
|
|
SortCriteria sortCriteria = new SortCriteria(sortColumn, asc);
|
|
DocumentCriteria documentCriteria = new DocumentCriteria();
|
|
documentCriteria.setUserId(principal.getId());
|
|
documentDao.findByCriteria(paginatedList, documentCriteria, sortCriteria);
|
|
|
|
for (DocumentDto documentDto : paginatedList.getResultList()) {
|
|
JSONObject document = new JSONObject();
|
|
document.put("id", documentDto.getId());
|
|
document.put("title", documentDto.getTitle());
|
|
document.put("description", documentDto.getDescription());
|
|
document.put("create_date", documentDto.getCreateTimestamp());
|
|
documents.add(document);
|
|
}
|
|
response.put("total", paginatedList.getResultCount());
|
|
response.put("documents", documents);
|
|
|
|
return Response.ok().entity(response).build();
|
|
}
|
|
|
|
/**
|
|
* Creates a new document.
|
|
*
|
|
* @param title Title
|
|
* @param description Description
|
|
* @return Response
|
|
* @throws JSONException
|
|
*/
|
|
@PUT
|
|
@Produces(MediaType.APPLICATION_JSON)
|
|
public Response add(
|
|
@FormParam("title") String title,
|
|
@FormParam("description") String description) throws JSONException {
|
|
if (!authenticate()) {
|
|
throw new ForbiddenClientException();
|
|
}
|
|
|
|
// Validate input data
|
|
title = ValidationUtil.validateLength(title, "title", 1, 100, false);
|
|
description = ValidationUtil.validateLength(description, "description", 0, 4000, true);
|
|
|
|
// Create the document
|
|
DocumentDao documentDao = new DocumentDao();
|
|
Document document = new Document();
|
|
document.setUserId(principal.getId());
|
|
document.setTitle(title);
|
|
document.setDescription(description);
|
|
String documentId = documentDao.create(document);
|
|
|
|
JSONObject response = new JSONObject();
|
|
response.put("id", documentId);
|
|
return Response.ok().entity(response).build();
|
|
}
|
|
|
|
/**
|
|
* Updates the document.
|
|
*
|
|
* @param title Title
|
|
* @param description Description
|
|
* @return Response
|
|
* @throws JSONException
|
|
*/
|
|
@POST
|
|
@Path("{id: [a-z0-9\\-]+}")
|
|
@Produces(MediaType.APPLICATION_JSON)
|
|
public Response update(
|
|
@PathParam("id") String id,
|
|
@FormParam("title") String title,
|
|
@FormParam("description") String description) throws JSONException {
|
|
if (!authenticate()) {
|
|
throw new ForbiddenClientException();
|
|
}
|
|
|
|
// Validate input data
|
|
title = ValidationUtil.validateLength(title, "title", 1, 100, false);
|
|
description = ValidationUtil.validateLength(description, "description", 0, 4000, true);
|
|
|
|
// Get the document
|
|
DocumentDao documentDao = new DocumentDao();
|
|
Document document = null;
|
|
try {
|
|
document = documentDao.getDocument(id, principal.getId());
|
|
} catch (NoResultException e) {
|
|
throw new ClientException("DocumentNotFound", MessageFormat.format("Document not found: {0}", id));
|
|
}
|
|
|
|
// Update the document
|
|
if (title != null) {
|
|
document.setTitle(title);
|
|
}
|
|
if (description != null) {
|
|
document.setDescription(description);
|
|
}
|
|
|
|
// Always return ok
|
|
JSONObject response = new JSONObject();
|
|
response.put("status", "ok");
|
|
return Response.ok().entity(response).build();
|
|
}
|
|
|
|
/**
|
|
* Deletes a document.
|
|
*
|
|
* @param id Document ID
|
|
* @return Response
|
|
* @throws JSONException
|
|
*/
|
|
@DELETE
|
|
@Path("{id: [a-z0-9\\-]+}")
|
|
@Produces(MediaType.APPLICATION_JSON)
|
|
public Response delete(
|
|
@PathParam("id") String id) throws JSONException {
|
|
if (!authenticate()) {
|
|
throw new ForbiddenClientException();
|
|
}
|
|
|
|
// Get the document
|
|
DocumentDao documentDao = new DocumentDao();
|
|
Document document = null;
|
|
try {
|
|
document = documentDao.getDocument(id, principal.getId());
|
|
} catch (NoResultException e) {
|
|
throw new ClientException("DocumentNotFound", MessageFormat.format("Document not found: {0}", id));
|
|
}
|
|
|
|
// Delete the document
|
|
documentDao.delete(document.getId());
|
|
|
|
// Always return ok
|
|
JSONObject response = new JSONObject();
|
|
response.put("status", "ok");
|
|
return Response.ok().entity(response).build();
|
|
}
|
|
}
|