using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; namespace CDP { public class MailProcessor { private readonly ILogger _logger; public MailProcessor(ILogger logger) { _logger = logger; } public static async Task ProcessMailEvent(MailRecord mailRecord, ILogger _logger) { try { for (int i = 0; i < mailRecord.AttachmentDetails.Count; i++) { AddRevisionDocumentDto revDoc = new AddRevisionDocumentDto { AppKey = mailRecord.AppKey, EditedBy = mailRecord.SenderEmail, FileId = mailRecord.AttachmentDetails[i].FileId, RevisionDate = DateTime.UtcNow, RevisionId = mailRecord.AttachmentDetails[i].HeadRevisionId, Comments = "original" }; await FileRevision.AddRevisionInternal(revDoc, _logger); FileUploadDto fileUploadDto = new FileUploadDto { AppKey = mailRecord.AppKey, FileContent = mailRecord.Attachments[i], FileId = mailRecord.AttachmentDetails[i].FileId, VersionId = mailRecord.AttachmentDetails[i].HeadRevisionId }; Task uploadTask = CDPBlobStorage.UploadBlobInternal(fileUploadDto, _logger); mailRecord.ReceiverEmails.ForEach(async (userToAdd) => { AddFileUserDto addFileUserDto = new AddFileUserDto { AppKey = mailRecord.AppKey, FileId = mailRecord.AttachmentDetails[i].FileId, FileName = mailRecord.AttachmentDetails[i].FileName, Email = mailRecord.SenderEmail, EmailToAdd = userToAdd, Policy = "Read" }; await CDPLite.AddFileUserInternal(addFileUserDto); }); } mailRecord.ReceiverEmails.ForEach(async (userToAdd) => { AddFileUserDto addFileUserDto = new AddFileUserDto { AppKey = mailRecord.AppKey, FileId = mailRecord.MailId, FileName = string.Concat(mailRecord.MailId, "-", "MailBody"), Email = mailRecord.SenderEmail, EmailToAdd = userToAdd, Policy = "Read" }; await CDPLite.AddFileUserInternal(addFileUserDto); }); } catch (Exception ex) { _logger.LogError(ex.ToString()); return; } } public static async Task ProcessMailEventConcurrent(MailRecord mailRecord, ILogger _logger) { List revisionTasks = new List(); List uploadTasks = new List(); List addPolicyTasks = new List(); for (int i = 0; i < mailRecord.AttachmentDetails.Count; i++) { AddRevisionDocumentDto revDoc = new AddRevisionDocumentDto { AppKey = mailRecord.AppKey, EditedBy = mailRecord.SenderEmail, FileId = mailRecord.AttachmentDetails[i].FileId, RevisionDate = DateTime.UtcNow, RevisionId = mailRecord.AttachmentDetails[i].HeadRevisionId, Comments = "original" }; Task revTask = FileRevision.AddRevisionInternal(revDoc, _logger); revisionTasks.Add(revTask); FileUploadDto fileUploadDto = new FileUploadDto { AppKey = mailRecord.AppKey, FileContent = mailRecord.Attachments[i], FileId = mailRecord.AttachmentDetails[i].FileId, VersionId = mailRecord.AttachmentDetails[i].HeadRevisionId }; Task uploadTask = CDPBlobStorage.UploadBlobInternal(fileUploadDto, _logger); mailRecord.ReceiverEmails.ForEach(userToAdd => { AddFileUserDto addFileUserDto = new AddFileUserDto { AppKey = mailRecord.AppKey, FileId = mailRecord.AttachmentDetails[i].FileId, FileName = mailRecord.AttachmentDetails[i].FileName, Email = mailRecord.SenderEmail, EmailToAdd = userToAdd, Policy = "Read" }; Task addPolicy = CDPLite.AddFileUserInternal(addFileUserDto); addPolicyTasks.Add(addPolicy); }); } mailRecord.ReceiverEmails.ForEach(userToAdd => { AddFileUserDto addFileUserDto = new AddFileUserDto { AppKey = mailRecord.AppKey, FileId = mailRecord.MailId, FileName = string.Concat(mailRecord.MailId, "-", "MailBody"), Email = mailRecord.SenderEmail, EmailToAdd = userToAdd, Policy = "Read" }; Task addPolicy = CDPLite.AddFileUserInternal(addFileUserDto); }); _logger.LogInformation("revTasks: {0} AddFileTasks: {1} uploadTasks: {2}", revisionTasks.Count, addPolicyTasks.Count, uploadTasks.Count); try { await Task.WhenAll(uploadTasks); } catch (AggregateException ex) { ex.Handle(ex => { _logger.LogError("upload failed with message: {0}", ex.ToString()); return true; }); } try { await Task.WhenAll(revisionTasks); } catch (AggregateException ex) { ex.Handle(ex => { _logger.LogError("add revision failed with message: {0}", ex.ToString()); return true; }); } try { await Task.WhenAll(addPolicyTasks); } catch (AggregateException ex) { ex.Handle(ex => { _logger.LogError("add policy failed with message: {0}", ex.ToString()); return true; }); } } } }