
edu.iu.uits.lms.provisioning.service.EmailSummaryService Maven / Gradle / Ivy
package edu.iu.uits.lms.provisioning.service;
/*-
* #%L
* lms-lti-3rdpartyprovisioning
* %%
* Copyright (C) 2015 - 2022 Indiana University
* %%
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the Indiana University nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* #L%
*/
import edu.iu.uits.lms.canvas.model.uploadstatus.CanvasUploadStatus;
import edu.iu.uits.lms.canvas.services.CanvasService;
import edu.iu.uits.lms.canvas.services.ImportService;
import edu.iu.uits.lms.email.model.EmailDetails;
import edu.iu.uits.lms.email.service.EmailService;
import edu.iu.uits.lms.email.service.LmsEmailTooBigException;
import edu.iu.uits.lms.iuonly.model.LmsBatchEmail;
import edu.iu.uits.lms.iuonly.services.BatchEmailServiceImpl;
import edu.iu.uits.lms.provisioning.config.ToolConfig;
import edu.iu.uits.lms.provisioning.model.CanvasImportId;
import edu.iu.uits.lms.provisioning.model.content.FileContent;
import edu.iu.uits.lms.provisioning.repository.CanvasImportIdRepository;
import edu.iu.uits.lms.provisioning.service.exception.FileProcessingException;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MultiValuedMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.mail.MessagingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@Slf4j
public class EmailSummaryService {
@Autowired
private CanvasImportIdRepository canvasImportIdRepository;
@Autowired
private EmailService emailService;
@Autowired
private BatchEmailServiceImpl batchEmailService;
@Autowired
private ImportService importService;
@Autowired
private CanvasService canvasService;
@Autowired
private DeptRouter deptRouter;
@Autowired
private ToolConfig toolConfig;
public void processResults() {
Map importTrackerMap = new HashMap<>();
Map> postProcessingMap = new HashMap<>();
List results = canvasImportIdRepository.findByProcessedOrderByGroupCodeAscImportIdAsc("N");
for (CanvasImportId item : results) {
String groupCode = item.getGroupCode();
String importId = item.getImportId();
CanvasImportObject cio = importTrackerMap.get(groupCode);
if (cio != null) {
cio.addImportId(importId);
}
else {
cio = new CanvasImportObject();
List importIdList = new ArrayList<>();
cio.setGroupCode(groupCode);
importIdList.add(importId);
cio.setImportIdsList(importIdList);
cio.setEmailMessage(new StringBuilder());
importTrackerMap.put(groupCode, cio);
}
if (item.getPostProcessingData() != null) {
postProcessingMap.put(importId, item.getPostProcessingData().getPostProcessingDataMap());
}
}
// if the list is empty, don't bother continuing
if (importTrackerMap.isEmpty()) {
log.info("There were no importIds to process. Exiting gracefully.");
return;
}
List processedImportIds = new ArrayList();
// parse out the warnings
for (CanvasImportObject cio : importTrackerMap.values()) {
//Setting a default email
cio.setEmailList(new String[] {toolConfig.getDefaultBatchNotificationEmail()});
LmsBatchEmail batchEmail = batchEmailService.getBatchEmailFromGroupCode(cio.getGroupCode());
if (batchEmail != null && batchEmail.getEmails() != null) {
String[] emailAddresses = batchEmail.getEmails().split(",");
if (emailAddresses.length > 0) {
//Set the actual email addresses, if any
cio.setEmailList(emailAddresses);
}
}
// if we made it here, then we got some ids to look up in Canvas!
List importIdList = cio.getImportIdsList();
StringBuilder emailMessage = cio.getEmailMessage();
log.debug("Import IDs for {}: {}", cio.getGroupCode(), importIdList);
for (String importId : importIdList) {
processImport(importId, emailMessage, postProcessingMap, cio, processedImportIds);
}
// check if there are warnings, if so, send an email
if (emailMessage.length() > 0) {
String subject = emailService.getStandardHeader() + " " + cio.getGroupCode() + " Canvas Provisioning Errors";
EmailDetails emailDetails = new EmailDetails();
emailDetails.setRecipients(cio.getEmailList());
emailDetails.setSubject(subject);
emailDetails.setBody(emailMessage.toString());
try {
emailService.sendEmail(emailDetails);
} catch (LmsEmailTooBigException | MessagingException e) {
log.error("Unable to send email", e);
}
} else {
log.info("There were no warnings from the Canvas imports. Update the records as processed and will not send an email.");
}
}
// Update the records of importIds we processed
for (String importId : processedImportIds) {
updateImportIdRecords(importId);
}
}
protected void processImport(String importId, StringBuilder emailMessage, Map> postProcessingMap, CanvasImportObject cio,
List processedImportIds) {
CanvasUploadStatus importStatus = importService.getImportStatus(importId);
// a call to see if the import for this id is finished
boolean canvasFinished = false;
String endedAt = importStatus.getEndedAt();
if (endedAt != null && !"".equals(endedAt) && !"null".equals(endedAt)) {
// this import is done, so set the boolean to true
canvasFinished = true;
}
// if Canvas is done processing, check for errors
if (canvasFinished) {
List> canvasWarningsList = importStatus.getProcessingWarnings();
List> canvasErrorsList = importStatus.getProcessingErrors();
if (emailMessage.length() == 0) {
emailMessage.append("Here is a report of errors from Canvas (" + canvasService.getBaseUrl() + "):\r\n\r\n");
}
emailMessage.append("From importId: " + importId + "\r\n\r\n");
if (canvasErrorsList != null || canvasWarningsList != null) {
if (canvasErrorsList != null) {
for (List canvasErrors : canvasErrorsList) {
for (String canvasError : canvasErrors) {
if (canvasError != null) {
if (canvasError.contains(".csv")) {
emailMessage.append(canvasError + " - ");
} else {
emailMessage.append(canvasError + "\r\n");
}
}
}
}
}
if (canvasWarningsList != null) {
for (List canvasWarnings : canvasWarningsList) {
for (String canvasWarning : canvasWarnings) {
if (canvasWarning.contains(".csv")) {
emailMessage.append(canvasWarning + " - ");
} else {
emailMessage.append(canvasWarning + "\r\n");
}
}
}
}
} else {
emailMessage.append("No errors/warnings\r\n");
}
// Do post processing stuff
MultiValuedMap postProcessingData = postProcessingMap.get(importId);
if (postProcessingData != null) {
emailMessage.append("\r\nPost processing results:\r\n");
try {
List provisioningResults = deptRouter.processFiles(cio.getGroupCode(), postProcessingData, null, true, null, true);
for (ProvisioningResult provisioningResult : provisioningResults) {
emailMessage.append(provisioningResult.getEmailMessage() + "\r\n");
}
} catch (FileProcessingException e) {
log.error("Error trying to post process", e);
emailMessage.append("\tThere were errors with the post processing:\r\n");
emailMessage.append("\t\t" + e.getFileErrors() + "\r\n");
}
}
emailMessage.append("\r\n");
processedImportIds.add(importId);
}
}
private void updateImportIdRecords(String importId) {
canvasImportIdRepository.setProcessedByImportId("Y", importId, new Date());
log.info("Updated the record as 'processed' for importId: " + importId);
}
@Setter
@Getter
protected static class CanvasImportObject {
private String[] emailList;
private StringBuilder emailMessage;
private String groupCode;
private List importIdsList;
/**
* Convenience method to add an importId to the importIdsList
* @param importId ImportId to add
*/
public void addImportId(String importId) {
this.importIdsList.add(importId);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy