package br.com.dextra.dextranet.banner;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
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.Context;
import javax.ws.rs.core.Response;
import br.com.dextra.dextranet.persistencia.EntidadeOrdenacao;
import br.com.dextra.dextranet.rest.config.Application;
import br.com.dextra.dextranet.seguranca.AutenticacaoService;
import br.com.dextra.dextranet.utils.TimeMachine;
import com.google.appengine.api.blobstore.BlobKey;
import com.google.appengine.api.blobstore.BlobstoreService;
import com.google.appengine.api.blobstore.BlobstoreServiceFactory;
import com.google.appengine.api.datastore.EntityNotFoundException;
import com.google.appengine.api.datastore.Query.SortDirection;
import com.google.gson.JsonObject;
@Path("/banner")
public class BannerRS {
private BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
private BannerRepository repositorio = new BannerRepository();
private TimeMachine timeMachine = new TimeMachine();
@Path("/")
@POST
@Produces(Application.JSON_UTF8)
public Response inserir(@FormParam("titulo") String titulo, @FormParam("dataInicio") String dataInicio,
@FormParam("dataFim") String dataFim, @FormParam("link") String link, @FormParam("imagem") String imagem,
@Context HttpServletRequest request) {
Banner banner = new Banner(titulo, link, timeMachine.transformaEmData(dataInicio),
timeMachine.transformaEmData(dataFim), AutenticacaoService.identificacaoDoUsuarioLogado());
banner.adicionaImagem(this.obtemBlobKeyDaImagem(request));
repositorio.persiste(banner);
return Response.ok().entity(banner).build();
}
@Path("/url-upload")
@GET
@Produces(Application.JSON_UTF8)
public Response uploadURL() throws EntityNotFoundException {
JsonObject json = new JsonObject();
json.addProperty("url", blobstoreService.createUploadUrl("/s/banner/"));
return Response.ok().entity(json.toString()).build();
}
@Path("/{id}")
@GET
@Produces(Application.JSON_UTF8)
public Response obter(@PathParam("id") String id) throws EntityNotFoundException {
Banner banner = repositorio.obtemPorId(id);
return Response.ok().entity(banner).build();
}
@Path("/")
@GET
@Produces(Application.JSON_UTF8)
public Response listar() {
List<Banner> banners = this.listarBannersOrdenados();
return Response.ok().entity(banners).build();
}
@Path("/vigentes")
@GET
@Produces(Application.JSON_UTF8)
public Response listarVigentes(@DefaultValue("2") @QueryParam("max") int quantidadeMaxima) {
List<Banner> bannersVigentes = this.listarBannersVigentesOrdenados(quantidadeMaxima);
return Response.ok().entity(bannersVigentes).build();
}
@Path("/{id}")
@DELETE
@Produces(Application.JSON_UTF8)
public Response apagar(@PathParam(value = "id") String id) {
repositorio.remove(id);
return Response.ok().build();
}
private BlobKey obtemBlobKeyDaImagem(HttpServletRequest request) {
Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(request);
List<BlobKey> listBlobs = blobs.get("imagem");
BlobKey blobKey = null;
if (!listBlobs.isEmpty()) {
blobKey = listBlobs.get(0);
}
return blobKey;
}
protected List<Banner> listarBannersVigentesOrdenados(int quantidadeMaxima) {
EntidadeOrdenacao dataInicioCrescente = new EntidadeOrdenacao(BannerFields.dataInicio.name(),
SortDirection.ASCENDING);
EntidadeOrdenacao dataFimCrescente = new EntidadeOrdenacao(BannerFields.dataFim.name(), SortDirection.ASCENDING);
List<Banner> banners = repositorio.lista(dataInicioCrescente, dataFimCrescente);
List<Banner> bannersVigentes = filtraBannersVigentes(banners);
if (quantidadeMaxima > 0 && bannersVigentes.size() > quantidadeMaxima) {
bannersVigentes = bannersVigentes.subList(0, quantidadeMaxima);
}
return bannersVigentes;
}
private List<Banner> filtraBannersVigentes(List<Banner> banners) {
List<Banner> bannersVigentes = new ArrayList<Banner>();
for (Banner banner : banners) {
if (banner.estaVigente()) {
bannersVigentes.add(banner);
}
}
return bannersVigentes;
}
protected List<Banner> listarBannersOrdenados() {
EntidadeOrdenacao dataInicioDecrescente = new EntidadeOrdenacao(BannerFields.dataInicio.name(),
SortDirection.DESCENDING);
EntidadeOrdenacao dataFimDecrescente = new EntidadeOrdenacao(BannerFields.dataFim.name(),
SortDirection.DESCENDING);
List<Banner> banners = repositorio.lista(dataInicioDecrescente, dataFimDecrescente);
return banners;
}
}