public IDictionary <string, BackupFileInfo> GetFileIndex()
        {
            IDictionary <string, BackupFileInfo> result = new Dictionary <string, BackupFileInfo>();

            foreach (var directoryInfo in _directoriesInfo)
            {
                string host       = Environment.MachineName;
                string rootPath   = directoryInfo.FullName;
                int    rootLength = rootPath.Length + 1;
                foreach (var file in directoryInfo.GetFiles("*", SearchOption.AllDirectories))
                {
                    string   relativePath = file.FullName.Substring(rootLength);
                    PathInfo filePathInfo = new PathInfo
                    {
                        Host          = host,
                        RootPath      = rootPath,
                        RelativePath  = relativePath,
                        AddedDateTime = DateTime.UtcNow,
                        DeletedDate   = null
                    };
                    BackupFileInfo backupFileInfo = new BackupFileInfo();
                    using (var fileStream = file.OpenRead())
                    {
                        backupFileInfo.FileId = _fileHasher.CalculateHash(fileStream);
                    }
                    if (result.ContainsKey(backupFileInfo.FileId))
                    {
                        backupFileInfo = result[backupFileInfo.FileId];
                    }
                    else
                    {
                        backupFileInfo.Paths          = new List <PathInfo>();
                        result[backupFileInfo.FileId] = backupFileInfo;
                    }
                    backupFileInfo.Paths.Add(filePathInfo);
                }
            }
            return(result);
        }
        public async Task <IActionResult> Post(IFormFile file)
        {
            try
            {
                _logger.Information("Received Post request {fileName} length:{fileLength}kb user:{user}", file.FileName, file.Length, User.Identity.Name);
                long size = file.Length;

                if (file.Length <= 0)
                {
                    return(BadRequest("file must not be empty"));
                }

                var rand         = new Random();
                var tempFilePath = $"{_appSettingsOptions.TempFileDirectory}{rand.Next()}.tmp";
                using (var tempFileStream = _tempFileHelper.Create(tempFilePath))
                {
                    await file.CopyToAsync(tempFileStream);
                }

                var(fileTypeIsOk, fileType) = _fileTypeScanner.CheckFileType(tempFilePath);
                if (!fileTypeIsOk)
                {
                    _logger.Warning("Detected file type {detectedFileType} is not allowed, original filename is {fileName}", fileType, file.Name);

                    _tempFileHelper.Delete(tempFilePath);

                    return(BadRequest($"File type {fileType} is not allowed"));
                }

                if (!file.FileName.ToLower().EndsWith(fileType.ToLower()))
                {
                    _logger.Warning("Detected file type {detectedFileType} does not match supplied filename {fileName}", fileType, file.Name);

                    _tempFileHelper.Delete(tempFilePath);

                    return(BadRequest($"File type {fileType} is not allowed"));
                }

                var(fileContainsVirus, detail) = _fileVirusScanner.ScanFile(tempFilePath);
                if (fileContainsVirus)
                {
                    _logger.Warning("Detected vulnerability in file {fileType} {fileName} {detail}", fileType, file.Name, detail);

                    _tempFileHelper.Delete(tempFilePath);

                    return(BadRequest("File is corrupt"));
                }

                var    hash = _fileHasher.CalculateHash(tempFilePath);
                string blobId;
                bool   created;
                using (var stream = new FileStream(tempFilePath, FileMode.Open))
                {
                    var postResult = _dataRepository.PostBlob(stream, file.FileName, hash);
                    blobId  = postResult.BlobId;
                    created = postResult.Created;
                }

                _tempFileHelper.Delete(tempFilePath);

                var uri = GenerateGetUri(blobId, "Upload");

                if (created)
                {
                    return(Created(uri, new { uri, blobId, size, hash }));
                }

                return(Ok(new { uri, blobId, size, hash }));
            }
            catch (Exception ex)
            {
                _logger.Error(ex, "Exception occured in Post {@Exception}", ex);
                return(new StatusCodeResult(500));
            }
        }