package br.com.dextra.dextranet.conteudo.post.curtida;
import java.util.ArrayList;
import java.util.List;
import br.com.dextra.dextranet.persistencia.EntidadeNaoEncontradaException;
import br.com.dextra.dextranet.persistencia.EntidadeOrdenacao;
import br.com.dextra.dextranet.persistencia.EntidadeRepository;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.EntityNotFoundException;
import com.google.appengine.api.datastore.PreparedQuery;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.CompositeFilterOperator;
import com.google.appengine.api.datastore.Query.Filter;
import com.google.appengine.api.datastore.Query.FilterOperator;
import com.google.appengine.api.datastore.Query.SortDirection;
public class CurtidaRepository extends EntidadeRepository {
public Curtida persiste(Curtida curtida) {
return super.persiste(curtida);
}
public void remove(String id) {
super.remove(id, Curtida.class);
}
public void remove(String conteudoId, String username) {
Curtida curtida = obtemPorConteudoEUsuario(conteudoId, username);
this.remove(curtida.getId());
}
public Curtida obtemPorId(String id) throws EntityNotFoundException {
Entity curtida = super.obtemPorId(id, Curtida.class);
return new Curtida(curtida);
}
public List<Curtida> lista(EntidadeOrdenacao... criterioOrdenacao) {
List<Curtida> curtidas = new ArrayList<Curtida>();
Iterable<Entity> entidades = super.lista(Curtida.class, criterioOrdenacao);
for (Entity entidade : entidades) {
curtidas.add(new Curtida(entidade));
}
return curtidas;
}
public List<Curtida> listaPorConteudo(String conteudoId) {
Filter filtroPorConteudoId = new Query.FilterPredicate(CurtidaFields.conteudoId.name(), FilterOperator.EQUAL,
conteudoId);
Query query = new Query(Curtida.class.getName());
query.setFilter(filtroPorConteudoId);
query.addSort(CurtidaFields.data.name(), SortDirection.DESCENDING);
PreparedQuery pquery = this.datastore.prepare(query);
List<Curtida> curtidas = new ArrayList<Curtida>();
Iterable<Entity> entidades = pquery.asIterable();
for (Entity entidade : entidades) {
curtidas.add(new Curtida(entidade));
}
return curtidas;
}
protected Curtida obtemPorConteudoEUsuario(String conteudoId, String usuario) {
Filter filtroPorConteudoId = new Query.FilterPredicate(CurtidaFields.conteudoId.name(), FilterOperator.EQUAL,
conteudoId);
Filter filtroPorUsername = new Query.FilterPredicate(CurtidaFields.usuario.name(), FilterOperator.EQUAL,
usuario);
List<Filter> filtros = new ArrayList<Filter>();
filtros.add(filtroPorConteudoId);
filtros.add(filtroPorUsername);
Filter filtro = new Query.CompositeFilter(CompositeFilterOperator.AND, filtros);
Query query = new Query(Curtida.class.getName());
query.setFilter(filtro);
PreparedQuery pquery = this.datastore.prepare(query);
Entity entidadeEncontrada = pquery.asSingleEntity();
if (entidadeEncontrada == null) {
throw new EntidadeNaoEncontradaException(Curtida.class.getName(), "conteudoId | usuario", conteudoId
+ " | " + usuario);
}
return new Curtida(entidadeEncontrada);
}
}