package fi.otavanopisto.pyramus.plugin.mailchimp; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import com.ecwid.mailchimp.MailChimpClient; import com.ecwid.mailchimp.MailChimpException; import com.ecwid.mailchimp.method.v2_0.lists.BatchError; import com.ecwid.mailchimp.method.v2_0.lists.BatchSubscribeInfo; import com.ecwid.mailchimp.method.v2_0.lists.BatchSubscribeMethod; import com.ecwid.mailchimp.method.v2_0.lists.BatchSubscribeResult; import com.ecwid.mailchimp.method.v2_0.lists.BatchUnsubscribeMethod; import com.ecwid.mailchimp.method.v2_0.lists.BatchUnsubscribeResult; import com.ecwid.mailchimp.method.v2_0.lists.Email; import com.ecwid.mailchimp.method.v2_0.lists.ListMethod; import com.ecwid.mailchimp.method.v2_0.lists.ListMethodResult; import com.ecwid.mailchimp.method.v2_0.lists.MemberInfoData; import com.ecwid.mailchimp.method.v2_0.lists.MembersMethod; import com.ecwid.mailchimp.method.v2_0.lists.MembersResult; import fi.otavanopisto.pyramus.dao.DAOFactory; import fi.otavanopisto.pyramus.dao.students.StudentDAO; import fi.otavanopisto.pyramus.domainmodel.base.StudyProgramme; import fi.otavanopisto.pyramus.domainmodel.students.Student; public class MailChimpSyncUtils { public static MailChimpSyncResult synchronizeStudyProgramme(MailChimpClient mailChimpClient, String apiKey, StudyProgramme studyProgramme) throws IOException, MailChimpException { StudentDAO studentDAO = DAOFactory.getInstance().getStudentDAO(); String listId = findStudyProgrammeListIdByName(mailChimpClient, apiKey, studyProgramme.getName()); if (StringUtils.isNotBlank(listId)) { MailChimpSyncResult result = new MailChimpSyncResult(); List<String> subscribed = getListMemberEmails(mailChimpClient, apiKey, listId, "subscribed"); List<String> unsubscribed = getListMemberEmails(mailChimpClient, apiKey, listId, "unsubscribed"); List<String> subscribeEmails = new ArrayList<String>(); List<String> removeEmails = new ArrayList<String>(); List<String> removedEmails = new ArrayList<String>(subscribed); List<Student> students = studentDAO.listByStudyProgramme(studyProgramme); for (Student student : students) { // Students with secure info flag are skipped if (!student.getAbstractStudent().getSecureInfo()) { fi.otavanopisto.pyramus.domainmodel.base.Email defaultEmail = student.getDefaultEmail(); if (defaultEmail != null) { String email = defaultEmail.getAddress(); if (StringUtils.isNotBlank(email)) { removedEmails.remove(email); // If user is already unsubscribed, we well leave him/her alone... if (!unsubscribed.contains(email)) { boolean emailSubscribed = subscribed.contains(email); if ((student.getActive()) && (!emailSubscribed)) { // If student is active but is not subscribed, we need to subscribe him/her subscribeEmails.add(email); } else if ((!student.getActive()) && (emailSubscribed)) { // If student is not active but is subscribed, we need to unsubscribe him/her removeEmails.add(email); } } } } } } if (!removedEmails.isEmpty()) { removeEmails.addAll(removedEmails); } if (!subscribeEmails.isEmpty()) { BatchSubscribeMethod subscribeMethod = new BatchSubscribeMethod(); subscribeMethod.id = listId; subscribeMethod.apikey = apiKey; subscribeMethod.update_existing = true; subscribeMethod.double_optin = false; subscribeMethod.batch = new ArrayList<BatchSubscribeInfo>(); for (String subscribeEmail : subscribeEmails) { BatchSubscribeInfo batchSubscribeInfo = new BatchSubscribeInfo(); batchSubscribeInfo.email = new Email(); batchSubscribeInfo.email.email = subscribeEmail; // TODO: html? batchSubscribeInfo.email_type = "html"; subscribeMethod.batch.add(batchSubscribeInfo); } BatchSubscribeResult batchSubscribeResult = mailChimpClient.execute(subscribeMethod); result.addAdded(batchSubscribeResult.add_count); result.addUpdated(batchSubscribeResult.update_count); for (BatchError error : batchSubscribeResult.errors) { result.addError(error.email.email, error.error); } } if (!removeEmails.isEmpty()) { BatchUnsubscribeMethod unsubscribeMethod = new BatchUnsubscribeMethod(); unsubscribeMethod.id = listId; unsubscribeMethod.apikey = apiKey; unsubscribeMethod.send_goodbye = false; unsubscribeMethod.send_notify = false; unsubscribeMethod.delete_member = true; unsubscribeMethod.batch = new ArrayList<Email>(); for (String removeEmail : removeEmails) { Email email = new Email(); email.email = removeEmail; unsubscribeMethod.batch.add(email); } BatchUnsubscribeResult batchUnsubscribeResult = mailChimpClient.execute(unsubscribeMethod); result.addRemoved(batchUnsubscribeResult.success_count); for (BatchError error : batchUnsubscribeResult.errors) { result.addError(error.email.email, error.error); } } return result; } return null; } public static List<String> getListMemberEmails(MailChimpClient client, String apiKey, String listId, String status) throws IOException, MailChimpException { List<String> result = new ArrayList<String>(); MembersMethod membersMethod = new MembersMethod(); membersMethod.apikey = apiKey; membersMethod.id = listId; membersMethod.status = status; MembersResult membersResult = client.execute(membersMethod); for (MemberInfoData data : membersResult.data) { if (data != null && StringUtils.isNotBlank(data.email)) { result.add(data.email); } } return result; } public static String findStudyProgrammeListIdByName(MailChimpClient mailChimpClient, String apiKey, String listName) throws IOException, MailChimpException { ListMethod listMethod = new ListMethod(); listMethod.apikey = apiKey; listMethod.filters = new ListMethod.Filters(); listMethod.filters.exact = true; listMethod.filters.list_name = listName; ListMethodResult listMethodResult = mailChimpClient.execute(listMethod); if (!listMethodResult.isEmpty() && listMethodResult.data.size() == 1) { return listMethodResult.data.get(0).id; } return null; } }