/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.subscription.web.internal.util;
import com.liferay.mail.kernel.model.MailMessage;
import com.liferay.mail.kernel.template.MailTemplate;
import com.liferay.mail.kernel.template.MailTemplateContext;
import com.liferay.mail.kernel.template.MailTemplateContextBuilder;
import com.liferay.mail.kernel.template.MailTemplateFactoryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.model.Ticket;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.service.TicketLocalService;
import com.liferay.portal.kernel.service.UserLocalService;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.SubscriptionSender;
import com.liferay.subscription.model.Subscription;
import com.liferay.subscription.web.configuration.SubscriptionConfiguration;
import com.liferay.subscription.web.constants.SubscriptionConstants;
import java.io.IOException;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.InternetHeaders;
/**
* @author Alejandro TardÃn
*/
public class UnsubscribeHooks {
public UnsubscribeHooks(
SubscriptionConfiguration configuration,
TicketLocalService ticketLocalService,
UserLocalService userLocalService,
SubscriptionSender subscriptionSender) {
_configuration = configuration;
_ticketLocalService = ticketLocalService;
_userLocalService = userLocalService;
_subscriptionSender = subscriptionSender;
}
public void addUnsubscriptionLinks(MailMessage mailMessage) {
if (_subscriptionSender.isBulk()) {
return;
}
InternetAddress[] toAddresses = mailMessage.getTo();
if (toAddresses.length > 0) {
InternetAddress toAddress = toAddresses[0];
User user = _userLocalService.fetchUserByEmailAddress(
_subscriptionSender.getCompanyId(), toAddress.getAddress());
if (user == null) {
return;
}
Ticket ticket = _userTicketMap.get(user.getUserId());
if (ticket != null) {
try {
String unsubscribeURL = _getUnsubscribeURL(user, ticket);
_addUnsubscribeHeader(mailMessage, unsubscribeURL);
_addUnsubscribeLink(mailMessage, unsubscribeURL);
}
catch (IOException ioe) {
throw new RuntimeException(ioe);
}
finally {
_userTicketMap.remove(user.getUserId());
}
}
}
}
public void createUnsubscriptionTicket(
com.liferay.portal.kernel.model.Subscription subscription) {
if (_subscriptionSender.isBulk()) {
return;
}
_userTicketMap.put(subscription.getUserId(), _getTicket(subscription));
}
private void _addUnsubscribeHeader(
MailMessage mailMessage, String unsubscribeURL) {
InternetHeaders internetHeaders = new InternetHeaders();
internetHeaders.setHeader(
"List-Unsubscribe", "<" + unsubscribeURL + ">");
mailMessage.setInternetHeaders(internetHeaders);
}
private void _addUnsubscribeLink(
MailMessage mailMessage, String unsubscribeURL)
throws IOException {
MailTemplateContextBuilder mailTemplateContextBuilder =
MailTemplateFactoryUtil.createMailTemplateContextBuilder();
mailTemplateContextBuilder.put("[$UNSUBSCRIBE_URL$]", unsubscribeURL);
MailTemplateContext mailTemplateContext =
mailTemplateContextBuilder.build();
MailTemplate bodyMailTemplate =
MailTemplateFactoryUtil.createMailTemplate(
mailMessage.getBody(), true);
String processedBody = bodyMailTemplate.renderAsString(
Locale.US, mailTemplateContext);
mailMessage.setBody(processedBody);
}
private Ticket _getTicket(
com.liferay.portal.kernel.model.Subscription subscription) {
Calendar calendar = Calendar.getInstance();
calendar.add(
Calendar.DATE, _configuration.unsubscriptionTicketExpirationTime());
List<Ticket> tickets = _ticketLocalService.getTickets(
subscription.getCompanyId(), Subscription.class.getName(),
subscription.getSubscriptionId(),
SubscriptionConstants.TICKET_TYPE);
if (ListUtil.isEmpty(tickets)) {
return _ticketLocalService.addTicket(
subscription.getCompanyId(), Subscription.class.getName(),
subscription.getSubscriptionId(),
SubscriptionConstants.TICKET_TYPE, StringPool.BLANK,
calendar.getTime(), _subscriptionSender.getServiceContext());
}
try {
Ticket ticket = tickets.get(0);
return _ticketLocalService.updateTicket(
ticket.getTicketId(), Subscription.class.getName(),
subscription.getSubscriptionId(),
SubscriptionConstants.TICKET_TYPE, StringPool.BLANK,
calendar.getTime());
}
catch (PortalException pe) {
throw new RuntimeException(pe);
}
}
private String _getUnsubscribeURL(User user, Ticket ticket) {
StringBuilder sb = new StringBuilder();
sb.append(_subscriptionSender.getContextAttribute("[$PORTAL_URL$]"));
sb.append(PortalUtil.getPathMain());
sb.append("/portal/unsubscribe?key=");
sb.append(ticket.getKey());
sb.append("&userId=");
sb.append(user.getUserId());
return sb.toString();
}
private final SubscriptionConfiguration _configuration;
private final SubscriptionSender _subscriptionSender;
private final TicketLocalService _ticketLocalService;
private final UserLocalService _userLocalService;
private final Map<Long, Ticket> _userTicketMap = new HashMap<>();
}