public async Task <IActionResult> AddVersion([FromForm] string request, IFormFile file) { try { if (file == null || file.Length == 0) { return(BadRequest()); } var userKey = _contextAccessor.UserKeyFromContext(); var addVersionToFileRequest = JsonSerializer.Deserialize <AddVersionToFileRequest>(request, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); bool userCanAccessFile = await UserCanAccessFile(userKey, addVersionToFileRequest.Key, _hiarcDatabase, AccessLevelGroup.UploadOnlyOrHigher); if (userCanAccessFile) { var originalFile = await _hiarcDatabase.GetFile(addVersionToFileRequest.Key); // check that new version is the same file extension as the original if (Path.GetExtension(originalFile.Name) != Path.GetExtension(file.FileName)) { _logger.LogError("Attemped to upload new version of file with incorrect file extension"); return(BadRequest($"New version file extension must be '{Path.GetExtension(originalFile.Name)}'")); } IStorageService storageService; if (addVersionToFileRequest.StorageService == null) { // if the request StorageService property is null then use the StorageService from the previous version (i.e. stays in the same service) var latestFileVersion = await _hiarcDatabase.GetLatestVersionForFile(addVersionToFileRequest.Key); storageService = _storageServiceProvider.Service(latestFileVersion.StorageService); } else { storageService = _storageServiceProvider.Service(addVersionToFileRequest.StorageService); } IFileInformation versionInfo = null; using var stream = file.OpenReadStream(); versionInfo = await storageService.StoreFile(stream); var updatedFile = await _hiarcDatabase.AddVersionToFile(originalFile.Key, storageService.Name, versionInfo.StorageIdentifier, userKey); var uri = $"{_hiarcSettings.BaseUri}/files/{originalFile.Key}"; return(Created(uri, updatedFile)); } else { return(StatusCode(StatusCodes.Status403Forbidden)); } } catch (Exception ex) { return(BuildErrorResponse(ex, _logger)); } }