public void FileWrapper_ToMetaData_Returns_Properly_Hydrated()
        {
            var fileWrapper = new FileWrapper();
            fileWrapper.ApplicationName = "application";
            fileWrapper.FileName = "file.txt";
            fileWrapper.MimeType = "mimetype";
            fileWrapper.Payload = new byte []{1, 0, 1};

            var metaData = fileWrapper.ToMetaData();

            Assert.AreEqual(metaData.ApplicationName, fileWrapper.ApplicationName);
            Assert.AreEqual(metaData.FileName, fileWrapper.FileName);
            Assert.AreEqual(metaData.MimeType, fileWrapper.MimeType);
            Assert.AreEqual(metaData.Checksum, Checksummer.ComputeChecksum(fileWrapper.Payload));
        }
        public async Task<HttpResponseMessage> SaveFileAsync(FileWrapper file)
        {
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            // todo: consider rolling this into a validation attribute.  
            if (!string.IsNullOrEmpty(file.Sha256Checksum))
            {
                if (!Checksummer.ChecksumsMatch(file.Sha256Checksum, file.Payload))
                {
                    logger.Info(string.Format("Checksum mismatch for file with name: {0} from application: {1}", file.FileName, file.ApplicationName));
                    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "The checksum submitted did not match the server computed SHA256 checksum.");
                }
            }

            try
            {
                var uniqueFileName = Guid.NewGuid() + "_" + file.FileName;
                var filePath = BuildFilePathAndAppendFileName(baseFileStoragePath, file.ApplicationName, uniqueFileName);
                await fileStorageProvider.StoreFile(filePath, file.Payload);

                var metaData = file.ToMetaData();
                metaData.StoragePath = filePath;
                var fileId = await metaDataRepository.SaveFileMetaDataAsync(metaData);

                var response = Request.CreateResponse(HttpStatusCode.Created, file);
                response.Headers.Location = new Uri(Url.Link("GetFileById", new { id = fileId}));

                return response;
            }
            catch (Exception e)
            {
                logger.Error(string.Format("error saving file with name: {0} for application: {1}", file.FileName, file.ApplicationName), e);
                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "File Storage API experienced an error.  This has been reported.  Please try again shortly.");
            }
        }