org.davidmendoza.esu.service.impl.ArticuloServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.davidmendoza.esu.service.impl.ArticuloServiceImpl.java

Source

/*
 * The MIT License
 *
 * Copyright 2015 J. David Mendoza.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
package org.davidmendoza.esu.service.impl;

import com.sendgrid.SendGrid;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.apache.commons.lang.StringUtils;
import org.davidmendoza.esu.dao.ArticuloRepository;
import org.davidmendoza.esu.dao.PublicacionRepository;
import org.davidmendoza.esu.dao.UsuarioRepository;
import org.davidmendoza.esu.model.Articulo;
import org.davidmendoza.esu.model.ReporteArticulo;
import org.davidmendoza.esu.model.Usuario;
import org.davidmendoza.esu.service.ArticuloService;
import org.davidmendoza.esu.service.BaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author J. David Mendoza <jdmendoza@swau.edu>
 */
@Service
@Transactional
public class ArticuloServiceImpl extends BaseService implements ArticuloService {

    @Autowired
    private ArticuloRepository articuloRepository;
    @Autowired
    private PublicacionRepository publicacionRepository;
    @Autowired
    private SendGrid sendgrid;
    @Autowired
    private UsuarioRepository usuarioRepository;

    @Override
    @Transactional(readOnly = true)
    public Page<Articulo> lista(PageRequest pageRequest) {
        return articuloRepository.findAll(pageRequest);
    }

    @Override
    @Transactional(readOnly = true)
    public Page<Articulo> busca(String filtro, PageRequest pageRequest) {
        StringBuilder sb = new StringBuilder();
        sb.append("%");
        sb.append(filtro);
        sb.append("%");
        return articuloRepository
                .findByTituloLikeIgnoreCaseOrDescripcionLikeIgnoreCaseOrAutor_ApellidoLikeIgnoreCaseOrAutor_NombreLikeIgnoreCase(
                        sb.toString(), sb.toString(), sb.toString(), sb.toString(), pageRequest);
    }

    @Override
    @CacheEvict(value = { "diaCache", "inicioCache" }, allEntries = true)
    public Articulo obtiene(Long articuloId) {
        return articuloRepository.findOne(articuloId);
    }

    @Override
    @CacheEvict(value = { "diaCache", "inicioCache" }, allEntries = true)
    public Articulo elimina(Long articuloId) {
        Articulo articulo = articuloRepository.findOne(articuloId);
        articuloRepository.delete(articulo);
        return articulo;
    }

    @Override
    @CacheEvict(value = { "diaCache", "inicioCache" }, allEntries = true)
    public void crea(Articulo articulo) {
        Date date = new Date();
        articulo.setDateCreated(date);
        articulo.setLastUpdated(date);
        articulo.setVistas(0);
        articuloRepository.save(articulo);
    }

    @Override
    @CacheEvict(value = { "diaCache", "inicioCache" }, allEntries = true)
    public void actualiza(Articulo articulo) {
        Articulo old = articuloRepository.dateCreated(articulo.getId());
        Date date = new Date();
        articulo.setDateCreated(old.getDateCreated());
        articulo.setLastUpdated(date);
        articulo.setVistas(old.getVistas());
        articuloRepository.save(articulo);
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<ReporteArticulo> articulosDelMes(Date date) {
        List<Map<String, Object>> x = publicacionRepository.todas();
        Map<Long, Object> publicaciones = new HashMap<>();
        Long articuloId = 0l;
        for (Map<String, Object> a : x) {
            if (!Objects.equals(articuloId, a.get("articuloId"))) {
                articuloId = (Long) a.get("articuloId");
                if (a.get("estatus").equals("PUBLICADO")
                        && (a.get("tipo").equals("dialoga") || a.get("tipo").equals("comunica"))) {
                    publicaciones.put(articuloId, a);
                }
            }
        }

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DAY_OF_YEAR, -1);
        Date fecha1 = cal.getTime();

        List<Map<String, Object>> lista = articuloRepository.articulosDelDia(fecha1, date);

        log.debug("Lista: {}", lista.size());
        List<ReporteArticulo> articulos = new ArrayList<>();
        Map<Long, ReporteArticulo> mapa = new HashMap<>();
        for (Map<String, Object> a : lista) {
            log.debug("Agregando {}", a.get("articulo"));
            Map<String, Object> c = (Map) publicaciones.get((Long) a.get("articuloId"));
            if (c != null) {
                ReporteArticulo b = new ReporteArticulo((Long) a.get("articuloId"), (String) a.get("articulo"),
                        (String) a.get("nombre") + " " + (String) a.get("apellido"), (Integer) a.get("vistas"));
                b.setUrl("http://escuelasabaticauniversitaria.org/"
                        + (c.get("tipo").equals("dialoga") ? "profundiza/" : "comparte/") + c.get("anio") + "/"
                        + c.get("trimestre") + "/" + c.get("leccion") + "/" + c.get("tema"));

                articulos.add(b);
                mapa.put(b.getArticuloId(), b);
            }
        }

        cal.setTime(date);
        cal.add(Calendar.MONTH, -1);
        Date fecha2 = cal.getTime();
        cal.add(Calendar.DAY_OF_YEAR, -1);
        fecha1 = cal.getTime();

        lista = articuloRepository.articulosDelDia(fecha1, fecha2);
        for (Map<String, Object> a : lista) {
            if (publicaciones.get((Long) a.get("articuloId")) != null) {
                ReporteArticulo b = mapa.get((Long) a.get("articuloId"));
                if (b != null) {
                    b.setVistas2((Integer) a.get("vistas"));
                }
            }
        }

        cal.setTime(date);
        cal.add(Calendar.MONTH, -2);
        fecha2 = cal.getTime();
        cal.add(Calendar.DAY_OF_YEAR, -1);
        fecha1 = cal.getTime();

        lista = articuloRepository.articulosDelDia(fecha1, fecha2);
        for (Map<String, Object> a : lista) {
            if (publicaciones.get((Long) a.get("articuloId")) != null) {
                ReporteArticulo b = mapa.get((Long) a.get("articuloId"));
                if (b != null) {
                    b.setVistas3((Integer) a.get("vistas"));
                }
            }
        }

        cal.setTime(date);
        cal.add(Calendar.MONTH, -3);
        fecha2 = cal.getTime();
        cal.add(Calendar.DAY_OF_YEAR, -1);
        fecha1 = cal.getTime();

        lista = articuloRepository.articulosDelDia(fecha1, fecha2);
        for (Map<String, Object> a : lista) {
            if (publicaciones.get((Long) a.get("articuloId")) != null) {
                ReporteArticulo b = mapa.get((Long) a.get("articuloId"));
                if (b != null) {
                    b.setVistas4((Integer) a.get("vistas"));
                }
            }
        }

        return articulos;
    }

    @Override
    public void enviarArticulosDelMes(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        List<ReporteArticulo> articulos = this.articulosDelMes(date);

        StringBuilder sb = new StringBuilder();
        sb.append("<style>");
        sb.append("@import url(http://fonts.googleapis.com/css?family=Ubuntu);");
        sb.append("body {");
        sb.append("font: 16px/1.625em 'Ubuntu',Tahoma,sans-serif;");
        sb.append("font-size-adjust:none;");
        sb.append("font-style:normal;");
        sb.append("font-variant:normal;");
        sb.append("font-weight:normal;");
        sb.append("text-rendering: optimizeLegibility;");
        sb.append("}");
        sb.append("tbody tr:nth-child(odd) {background-color: #f9f9f9;}");
        sb.append("thead tr th, tbody tr td {padding: 8px;}");
        sb.append("tbody tr td{border-top: 1px solid #ddd;}");
        sb.append("</style>");
        sb.append("<h1>Vista de articulos hasta el ").append(sdf.format(date)).append("</h1>");
        sb.append("<p>Gracias por contribuir con uno o algunos de los ").append(articulos.size()).append(
                " artculos. Debajo encontrar una lista de cada artculo con cuntas vistas del mismo tenemos registradas a la fecha y 3 meses anteriores para que pueda ver el comportamiento que ha tenido ltimamente su artculo.</p>");
        sb.append(
                "<p>Los instamos a seguir contribuyendo con nuevos artculos, promocionar los artculos ya existentes en facebook, twitter, instagram, etc. y, con la ayuda del Espritu Santo, estos seguirn ayudando a difundir el mensaje de la Segunda Venida de nuestro Seor Jesucristo.</p>");
        sb.append(
                "<p>Si no desea recibir estos correos, al final del correo hay una liga para ser eliminado de la lista.</p>");
        sb.append("<table>");
        sb.append("<thead>");
        sb.append("<tr>");
        sb.append("<th style='text-align:left;'>").append("Artculo").append("</th>");
        sb.append("<th style='text-align:left;'>").append("Autor").append("</th>");
        sb.append("<th style='text-align:right;'>").append("Vistas").append("</th>");
        sb.append("<th style='text-align:right;'>").append("Hace 1 mes").append("</th>");
        sb.append("<th style='text-align:right;'>").append("Hace 2 meses").append("</th>");
        sb.append("<th style='text-align:right;'>").append("Hace 3 meses").append("</th>");
        sb.append("</tr>");
        sb.append("</thead>");
        sb.append("<tbody>");
        for (ReporteArticulo a : articulos) {
            String nombre = StringUtils.abbreviate(a.getNombre(), 40);
            sb.append("<tr>");
            sb.append("<td>").append("<a href='").append(a.getUrl()).append("'>").append(nombre)
                    .append("</a></td>");
            sb.append("<td>").append(a.getAutor()).append("</td>");
            sb.append("<td style='text-align:right;'>").append(a.getVistas1()).append("</td>");
            sb.append("<td style='text-align:right;'>").append(a.getVistas2()).append("</td>");
            sb.append("<td style='text-align:right;'>").append(a.getVistas3()).append("</td>");
            sb.append("<td style='text-align:right;'>").append(a.getVistas4()).append("</td>");
            sb.append("</tr>");
        }
        sb.append("</tbody>");
        sb.append("</table>");

        try {
            log.debug("Creando correo");

            for (Usuario usuario : usuarioRepository.findAll()) {
                if (usuario.getUsername().equals("editor@um.edu.mx")
                        || usuario.getUsername().equals("autor@um.edu.mx")
                        || usuario.getUsername().equals("usuario@um.edu.mx")
                        || usuario.getUsername().equals("admin@um.edu.mx")) {
                    continue;
                }
                SendGrid.Email email = new SendGrid.Email();
                email.addTo(usuario.getUsername());
                email.setFrom("contactoesu@um.edu.mx");
                email.setSubject("ESU:Vista de artculos hasta el " + sdf.format(date));
                email.setHtml(sb.toString());

                sendgrid.send(email);
            }
        } catch (Exception e) {
            log.error("No se pudo enviar correo", e);
            throw new RuntimeException("No se pudo enviar el correo: " + e.getMessage(), e);
        }

    }

}