private async Task AuditHashApplication(Application application, bool sendAuditEmail = true)
        {
            var activeDeployments = await deploymentRepository.GetActiveDeploymentsAsync(application.Name);
            var failedAudits = new Dictionary<Deployment, DeploymentAudit>();
            foreach (var deployment in activeDeployments)
            {
                var audit = await hashingService.HashDeployment(deployment, application.GetRegularExpressions(), application.HashHiddenFiles, false);
                await auditRepository.CreateAuditAsync(audit);
                if (!audit.ValidHash) failedAudits.Add(deployment, audit);
            }
            if (failedAudits.Count > 0)
            {
                var sb = new StringBuilder();
                sb.AppendFormat("The application {0} has a failed audit on the following servers: \r\n", application.Name);
                foreach (var failedAudit in failedAudits)
                {
                    sb.AppendFormat("Audit UTC:{0},  Server {1}:\r\n", failedAudit.Value.AuditDateTime.ToLongTimeString(), failedAudit.Key.ServerName);
                    foreach (var fileHashMismatch in failedAudit.Value.FileHashMismatches)
                    {
                        sb.AppendFormat("Deployment Hash:{0}, Audit Hash:{1} \r\n", fileHashMismatch.OriginalHash, fileHashMismatch.AuditHash);
                    }
                }

                Log.Error(sb.ToString());
                await mailService.SendAuditEmail("Audit failure for " + application.Name, sb.ToString());
            }
            else
            {
                Log.InfoFormat("All audits passed for application {0}.", application.Name);
            }
        }
 public void Setup()
 {
     existingApplication = new Application
     {
         Name = "app",
         Enabled = true
     };
     applicationRepository = new Mock<IApplicationRepository>();
     applicationController = new ApplicationController(applicationRepository.Object);
 }
 public async Task InsertApplicationAsync(Application application)
 {
     var existingRecord = await GetApplicationAsync(application.Name);
     if (existingRecord == null)
     {
         await collection.InsertOneAsync(application);
     }
     else
     {
         throw new ArgumentException("The application named `" + application.Name + "` already exists.");
     }
 }
 public async Task<IHttpActionResult> Post(string name)
 {
     try
     {
         var application = await applicationRepository.GetApplicationAsync(name);
         if (application != null)
         {
             return BadRequest("The application already exists. Use PUT to modify the application.");
         }
         application = new Application
         {
             Name = name,
             Enabled = true
         };
         await applicationRepository.InsertApplicationAsync(application);
         return Ok();
     }
     catch (Exception ex)
     {
         Log.Error("Error in application controller:", ex);
         return InternalServerError();
     }
 }
 public async Task ReplaceApplication(Application application)
 {
     await collection.ReplaceOneAsync(a => a.Name == application.Name, application);
 }