package org.activityinfo.server.digest;
import com.google.inject.Provider;
import org.activityinfo.server.authentication.ServerSideAuthProvider;
import org.activityinfo.server.authentication.UserToken;
import org.activityinfo.server.authentication.UserTokenManager;
import org.activityinfo.server.authentication.UserTokenScope;
import org.activityinfo.server.database.hibernate.entity.User;
import org.activityinfo.server.mail.MailSender;
import org.activityinfo.server.mail.Message;
import org.activityinfo.server.util.date.DateFormatter;
import javax.mail.MessagingException;
import javax.persistence.EntityManager;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import java.io.IOException;
import java.util.Date;
import java.util.logging.Logger;
public abstract class UserDigestResource {
public static final String PARAM_USER = "u";
public static final String PARAM_NOW = "n";
public static final String PARAM_DAYS = "d";
public static final String PARAM_SENDEMAIL = "send";
public static final String PARAM_SENDEMAIL_DEF = "true";
private static final Logger LOGGER = Logger.getLogger(UserDigestResource.class.getName());
private final Provider<EntityManager> entityManager;
private final Provider<MailSender> mailSender;
private final ServerSideAuthProvider authProvider;
private final DigestModelBuilder digestModelBuilder;
private final DigestRenderer digestRenderer;
public UserDigestResource(Provider<EntityManager> entityManager,
Provider<MailSender> mailSender,
ServerSideAuthProvider authProvider,
DigestModelBuilder digestModelBuilder,
DigestRenderer digestRenderer) {
this.entityManager = entityManager;
this.mailSender = mailSender;
this.authProvider = authProvider;
this.digestModelBuilder = digestModelBuilder;
this.digestRenderer = digestRenderer;
}
@GET
@Produces(MediaType.TEXT_HTML)
public String createUserDigest(@QueryParam(PARAM_USER) int userId,
@QueryParam(PARAM_NOW) Long now,
@QueryParam(PARAM_DAYS) int days,
@QueryParam(PARAM_SENDEMAIL) @DefaultValue(PARAM_SENDEMAIL_DEF) boolean sendEmail)
throws IOException, MessagingException {
if (userId <= 0) {
return "no user specified";
}
Date date = now == null ? new Date() : new Date(now);
if (days <= 0) {
days = getDefaultDays();
}
User user = entityManager.get().find(User.class, userId);
if (!user.isEmailNotification()) {
return "user's email notification flag is set to false.";
}
UserToken userToken = UserTokenManager.create(userId, UserTokenScope.SUBSCRIBE, UserTokenScope.UNSUBSCRIBE);
authProvider.set(user);
LOGGER.info("creating digest for " + user.getEmail() + " on " + DateFormatter.formatDateTime(date) +
" for activity period: " + days + " day(s)." + " (sending email: " + sendEmail + ")");
UserDigest userDigest = new UserDigest(user, date, days, userToken.getSecureToken());
DigestMessageBuilder digest = new DigestMessageBuilder(digestModelBuilder, digestRenderer);
digest.setUserDigest(userDigest);
Message message = digest.build();
if (message != null && sendEmail) {
mailSender.get().send(message);
}
return message == null ? "no updates found" : message.getHtmlBody();
}
public abstract int getDefaultDays();
}