package br.com.dextra.dextranet.microblog;
import java.util.Date;
import java.util.List;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
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.Response;
import javax.ws.rs.core.Response.Status;
import br.com.dextra.dextranet.persistencia.EntidadeBusca;
import br.com.dextra.dextranet.persistencia.EntidadeOrdenacao;
import br.com.dextra.dextranet.rest.config.Application;
import br.com.dextra.dextranet.usuario.Usuario;
import br.com.dextra.dextranet.usuario.UsuarioRepository;
import br.com.dextra.dextranet.utils.ConteudoHTML;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.EntityNotFoundException;
import com.google.appengine.api.datastore.Query.FilterOperator;
import com.google.appengine.api.datastore.Query.SortDirection;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
@Path("/microblog")
public class MicroBlogRS {
private MicroBlogRepository microBlogRepository = new MicroBlogRepository();
@Path("/post")
@POST
public void post(@FormParam("texto") String text) {
ConteudoHTML conteudoHTML = new ConteudoHTML(text);
text = conteudoHTML.removeJavaScript();
MicroPost micropost = new MicroPost(text, obtemUsuarioLogado());
MicroBlogRepository repository = getMicroBlogRepository();
repository.salvar(micropost);
}
protected Usuario obtemUsuarioLogado() {
return new UsuarioRepository().obtemUsuarioLogado();
}
protected MicroBlogRepository getMicroBlogRepository() {
return new MicroBlogRepository();
}
@Path("/post")
@GET
public Response get() {
MicroBlogRepository repository = getMicroBlogRepository();
JsonArray microPosts = new JsonArray();
for (MicroPost microPost : repository.buscarMicroPosts()) {
JsonObject microPostJson = new JsonObject();
microPostJson.addProperty("texto", microPost.getTexto());
microPostJson.addProperty("autor", microPost.getAutor().getUsername());
microPosts.add(microPostJson);
}
return Response.ok(microPosts.toString()).build();
}
@Path("/post")
@GET
@Produces(Application.JSON_UTF8)
public Response listar(@QueryParam("r") @DefaultValue(Application.REGISTROS_POR_PAGINA_MICROPOSTS) Integer registrosPorPagina, @QueryParam("p") @DefaultValue("1") Integer pagina) {
List<MicroPost> microPosts = this.listarMicroPostsOrdenados(registrosPorPagina, pagina);
return Response.ok().entity(microPosts).build();
}
protected List<MicroPost> listarMicroPostsOrdenados(Integer registrosPorPagina, Integer pagina) {
EntidadeOrdenacao dataDeAtualizacaoDecrescente = new EntidadeOrdenacao(MicroBlogFields.DATA.getField(), SortDirection.DESCENDING);
List<MicroPost> microPosts = microBlogRepository.lista(registrosPorPagina, pagina, dataDeAtualizacaoDecrescente);
return microPosts;
}
@Path("/count/")
@GET
@Produces(Application.JSON_UTF8)
public Response verificaNovosMicroPosts(@QueryParam("d") Date data) {
MicroBlogRepository microBlogRepository = new MicroBlogRepository();
EntidadeBusca entidadeBusca = new EntidadeBusca();
entidadeBusca.setData(data);
entidadeBusca.setCampo(MicroBlogFields.DATA.getField());
entidadeBusca.setClazz(MicroPost.class.getName());
entidadeBusca.setFiltro(FilterOperator.GREATER_THAN);
entidadeBusca.setDirecaoOrdenacao(SortDirection.DESCENDING);
Iterable<Entity> total = microBlogRepository.paginar(entidadeBusca);
List<MicroPost> novosMicroPosts = microBlogRepository.toMicroPosts(total);
return Response.ok().entity(novosMicroPosts).build();
}
@Path("/{id}")
@DELETE
@Produces(Application.JSON_UTF8)
public Response deletar(@PathParam("id") String id) throws EntityNotFoundException {
MicroPost microPost = microBlogRepository.obtemPorId(id);
if (microPost.getAutor().equals(obtemUsuarioLogado())) {
microBlogRepository.remove(id);
return Response.ok().build();
} else {
return Response.status(Status.FORBIDDEN).build();
}
}
@Path("/paginar/")
@GET
@Produces(Application.JSON_UTF8)
public Response paginar(@QueryParam("u") Date data) {
MicroBlogRepository microBlogRepository = new MicroBlogRepository();
EntidadeBusca entidadeBusca = new EntidadeBusca();
entidadeBusca.setData(data);
entidadeBusca.setCampo(MicroBlogFields.DATA.getField());
entidadeBusca.setClazz(MicroPost.class.getName());
entidadeBusca.setDirecaoOrdenacao(SortDirection.DESCENDING);
entidadeBusca.setLimite(Integer.parseInt(Application.REGISTROS_POR_PAGINA));
entidadeBusca.setFiltro(FilterOperator.LESS_THAN);
Iterable<Entity> total = microBlogRepository.paginar(entidadeBusca);
List<MicroPost> novosMicroPosts = microBlogRepository.toMicroPosts(total);
return Response.ok().entity(novosMicroPosts).build();
}
}