public virtual Task <SourceResultDataContract> UpsertFileDataSource(FileDataContract fileData, Stream stream) { return(Task.Run(() => { lock (UpsertFileDataSourceLock) { var hash = GetHash(stream); var fileSource = Context.GetFileDataSource(fileData.SourceId, hash); if (fileSource == null) { fileSource = new FileDataSource { OriginalFileName = fileData.OriginalFileName, DateEdit = DateTime.Now, InputStatus = SourceStatus.PendingExtraction, ReferenceNotes = fileData.ReferenceNotes, UserName = fileData.UserName, HandlerName = fileData.HandlerName, FileHash = hash, MediaType = fileData.MediaType }; fileSource = Context.AddDataSource(fileSource); var newFileName = streamManager .StageStream( fileSource.Id, fileData.OriginalFileName, stream); fileSource.CurrentFileName = newFileName; } if (fileSource.InputStatus != SourceStatus.PendingExtraction) { return DataContractError(fileSource.Id, DataSourceServiceResources.FileSourceIsNotPendingExtraction); } fileSource.OriginalFileName = fileData.OriginalFileName ?? fileSource.OriginalFileName; fileSource.HandlerName = fileData.HandlerName ?? fileSource.HandlerName; fileSource.MediaType = fileData.MediaType ?? fileSource.MediaType; fileSource.UserName = fileData.UserName; fileSource.DateEdit = DateTime.Now; fileSource.ReferenceNotes = fileData.ReferenceNotes ?? fileSource.ReferenceNotes; Context.UpdateDataSource(fileSource); return ValidateSource(fileSource.Id); } })); }