internal void CreateFolder(EntityReference application)
        {
            TracingService.Trace($"In CreateFolder with Entity Type {application.LogicalName} and Entity Id {application.Id}");

            var applicationEntity = Query.RetrieveDataForEntityRef(Service, new[] { defra_application.Fields.defra_name, defra_application.Fields.defra_permitnumber, defra_application.Fields.defra_applicationnumber }, application);

            TracingService.Trace($"Permit Number = {applicationEntity[defra_application.Fields.defra_permitnumber]}; Application Number = {applicationEntity[defra_application.Fields.defra_applicationnumber]}");

            var request = new DocumentRelayRequest
            {
                ApplicationContentType = Config[$"{SharePointSecureConfigurationKeys.ApplicationFolderContentType}"],
                ApplicationNo          = SharePointFilters.FilterPath(applicationEntity.GetAttributeValue <string>(defra_application.Fields.defra_applicationnumber)),
                FileBody          = string.Empty,
                FileDescription   = string.Empty,
                FileName          = string.Empty,
                ListName          = Config[$"{SharePointSecureConfigurationKeys.PermitListName}"],
                PermitContentType = Config[$"{SharePointSecureConfigurationKeys.PermitFolderContentType}"],
                PermitNo          = SharePointFilters.FilterPath(applicationEntity.GetAttributeValue <string>(defra_application.Fields.defra_permitnumber)),
                Customer          = string.Empty,
                SiteDetails       = string.Empty,
                PermitDetails     = string.Empty
            };

            var stringContent = JsonConvert.SerializeObject(request);

            TracingService.Trace($"Data Sent to Logic App URL {Config[$"{SharePointSecureConfigurationKeys.DocumentRelayLogicAppUrl}"]}");

            SendRequest(Config[$"{SharePointSecureConfigurationKeys.DocumentRelayLogicAppUrl}"], stringContent);
        }
        private void AddInsertFileParametersToRequest(DocumentRelayRequest request, Entity queryRecord)
        {
            TracingService.Trace("In AddInsertFileParametersToRequest()");
            TracingService.Trace("Logical Name: {0}", queryRecord.LogicalName);

            var permitNo      = GetPermitNumber(queryRecord);
            var applicationNo = GetApplicationNumber(queryRecord);
            var fileName      = GetFileName(queryRecord);
            var body          = GetBody(queryRecord);
            var subject       = GetSubject(queryRecord);
            var crmId         = GetCrmId(queryRecord);
            var caseNo        = GetCaseFolderName(queryRecord);
            var regarding     = GetRegarding(queryRecord);

            request.ApplicationContentType = Config[$"{SharePointSecureConfigurationKeys.ApplicationFolderContentType}"];
            request.ApplicationNo          = applicationNo;
            request.FileBody          = body;
            request.FileDescription   = subject;
            request.FileName          = fileName;
            request.ListName          = Config[$"{SharePointSecureConfigurationKeys.PermitListName}"];
            request.PermitContentType = Config[$"{SharePointSecureConfigurationKeys.PermitFolderContentType}"];
            request.PermitNo          = permitNo;
            request.Customer          = string.Empty; // Not currently set by Document relay, enhancement
            request.SiteDetails       = string.Empty; // Not currently set by Document relay, enhancement
            request.PermitDetails     = string.Empty; // Not currently set by Document relay, enhancement
            request.CrmId             = crmId;
            request.CaseNo            = caseNo;
            request.EmailRegarding    = regarding;

            AddEmailParametersToRequest(request, queryRecord);

            TracingService.Trace(string.Format("Requests: {0}", request));
        }
        private void UploadAttachment(Guid recordId)
        {
            var request = new DocumentRelayRequest();
            // Email attachment has been created. Query CRM to get the email attachment data
            var attachmentData = ReturnAttachmentData(recordId);

            if (attachmentData == null)
            {
                throw new InvalidPluginExecutionException("No attachment data record returned from query");
            }

            var regardingObjectId = GetRegardingObjectId(attachmentData);

            if (regardingObjectId != null && (regardingObjectId.LogicalName == Application.EntityLogicalName || regardingObjectId.LogicalName == Case.EntityLogicalName))
            {
                var direction  = (bool)(attachmentData.GetAttributeValue <AliasedValue>($"email.{Email.Fields.DirectionCode}")).Value;
                var statusCode = (OptionSetValue)(attachmentData.GetAttributeValue <AliasedValue>($"email.{Email.Fields.StatusCode}")).Value;
                if (direction && statusCode.Value != 3)
                {
                    //Outgoing email, do not send the attachment on create
                    TracingService.Trace("Aborted creating attachment for outgoing email attachment that is not sent");
                    return;
                }

                AddInsertFileParametersToRequest(request, attachmentData);
                // Check there is a file to upload
                if (request.HasBody())
                {
                    var resultBody = SendRequest(Config[SharePointSecureConfigurationKeys.DocumentRelayLogicAppUrl], JsonConvert.SerializeObject(request));
                    if (resultBody != null)
                    {
                        TracingService.Trace("Returned from LogicApp OK");

                        // Get the response object
                        DocumentRelayResponse response = JsonConvert.DeserializeObject <DocumentRelayResponse>(resultBody);

                        TracingService.Trace($"Returned from LogicApp OK, doc url is: {response.link}");

                        // Create document record
                        CreateApplicationDocument(attachmentData, request.FileDescription, request.FileName, response.link);


                        // Delete Attachment
                        Service.Delete(attachmentData.LogicalName, attachmentData.Id);
                    }
                }
                else
                {
                    TracingService.Trace("No file body found for Attachment. Logic app not called.");
                }
            }
            else
            {
                TracingService.Trace("Only attachments for emails regarding Applications, RFIs or Schedule 5s are currently sent to SharePoint");
            }
        }
        private void UploadAnnotation(Guid recordId)
        {
            var request = new DocumentRelayRequest();

            // Creation of of an Annotation record on a Application or Case.
            var annotationData = ReturnAnnotationData(recordId);

            if (annotationData == null)
            {
                throw new InvalidPluginExecutionException("No annotation data record returned from query");
            }

            // Check that Note is regarding an application or a case
            if (IsRegardingValidForNote(annotationData))
            {
                AddInsertFileParametersToRequest(request, annotationData);
                // Check there is a file to upload
                if (request.HasBody())
                {
                    var resultBody = SendRequest(Config[$"{SharePointSecureConfigurationKeys.DocumentRelayLogicAppUrl}"], JsonConvert.SerializeObject(request));
                    if (resultBody == null)
                    {
                        TracingService.Trace("Returned from LogicApp, no resultBody");
                        return;
                    }

                    // Get the response object
                    DocumentRelayResponse response = JsonConvert.DeserializeObject <DocumentRelayResponse>(resultBody);

                    TracingService.Trace($"Returned from LogicApp OK, doc url is: {response.link}");

                    // Create document record
                    CreateApplicationDocument(annotationData, request.FileDescription, request.FileName, response.link);

                    // Blank Note Document
                    annotationData[Annotation.Fields.NoteText]     = "File has been uploaded to SharePoint.";
                    annotationData[Annotation.Fields.DocumentBody] = string.Empty;
                    Service.Update(annotationData);
                }
                else
                {
                    TracingService.Trace("No file body found for Note. Logic app not called.");
                }
            }
        }
        private void AddEmailParametersToRequest(DocumentRelayRequest request, Entity queryRecord)
        {
            TracingService.Trace("Adding Email Parameters to Request");

            request.EmailTo   = string.Empty;
            request.EmailFrom = string.Empty;

            // Set Email stuff when we have an email
            if (queryRecord.LogicalName == Email.EntityLogicalName || queryRecord.LogicalName == ActivityMimeAttachment.EntityLogicalName)
            {
                if (queryRecord.Contains(Email.Fields.Sender))
                {
                    request.EmailFrom = queryRecord.GetAttributeValue <string>(Email.Fields.Sender);
                }

                if (queryRecord.Contains(Email.Fields.ToRecipients))
                {
                    request.EmailTo = queryRecord.GetAttributeValue <string>(Email.Fields.ToRecipients);
                }

                if (queryRecord.Contains($"email.{Email.Fields.Sender}"))
                {
                    request.EmailFrom = ((string)((AliasedValue)queryRecord.Attributes[$"email.{Email.Fields.Sender}"]).Value);
                }

                if (queryRecord.Contains($"email.{Email.Fields.ToRecipients}"))
                {
                    request.EmailTo = ((string)((AliasedValue)queryRecord.Attributes[$"email.{Email.Fields.ToRecipients}"]).Value);
                }
                if (queryRecord.Contains(Email.Fields.Subject))
                {
                    // For an email, this is just the filename again
                    request.EmailLink = GetFileName(queryRecord);
                }
                else if (queryRecord.Contains($"email.{Email.Fields.Subject}"))
                {
                    // Annotation needs the filename created for the email from subject and created on date
                    request.EmailLink = CreateEmailFileNameForAttachment(queryRecord);
                }
            }
            // Max size of 250 in SharePoint
            request.EmailFrom = request.EmailFrom.TruncateIfNeeded(250);
            request.EmailTo   = request.EmailTo.TruncateIfNeeded(250);
        }
        private void UploadEmail(Guid recordId)
        {
            var request = new DocumentRelayRequest();

            // Processing an email record. Need the information so we can upload the email to SharePoint
            var emailData = ReturnEmailData(recordId);

            if (emailData == null)
            {
                throw new InvalidPluginExecutionException("No email data record returned from query");
            }

            var regardingObjectId = GetRegardingObjectId(emailData);

            if (regardingObjectId != null && (regardingObjectId.LogicalName == Application.EntityLogicalName || regardingObjectId.LogicalName == Case.EntityLogicalName))
            {
                var direction  = emailData.GetAttributeValue <bool>(Email.Fields.DirectionCode);
                var statusCode = emailData.GetAttributeValue <OptionSetValue>(Email.Fields.StatusCode);
                if (direction && statusCode.Value != 3)
                {
                    //Outgoing email, do not send the email on create
                    TracingService.Trace("Aborted creating email for outgoing email that is not sent");
                    return;
                }

                AddInsertFileParametersToRequest(request, emailData);

                var resultBody = SendRequest(Config[$"{SharePointSecureConfigurationKeys.DocumentRelayLogicAppUrl}"], JsonConvert.SerializeObject(request));
                if (resultBody != null)
                {
                    TracingService.Trace("Returned from LogicApp OK");
                    if (emailData != null)
                    {
                        // Set uploaded to SharePoint flag!
                        emailData[Email.Fields.defra_uploadedtosharepoint] = true;
                        Service.Update(emailData);
                    }
                }
            }
            else
            {
                TracingService.Trace("Only emails regarding Applications, RFIs or Schedule 5s are sent to SharePoint");
            }
        }