public async Task <IActionResult> Copy(string fileKey, [FromBody] CopyFileRequest request) { try { var userKey = _contextAccessor.UserKeyFromContext(); bool userCanAccessFile = await UserCanAccessFile(userKey, fileKey, _hiarcDatabase, AccessLevelGroup.ReadOnlyOrHigher); if (userCanAccessFile) { var latestFileVersion = await _hiarcDatabase.GetLatestVersionForFile(fileKey); var sourceStorageService = _storageServiceProvider.Service(latestFileVersion.StorageService); var destinationStorageService = _storageServiceProvider.Service(request.StorageService); IFileInformation versionInfo; if (sourceStorageService.Type == destinationStorageService.Type) { versionInfo = await sourceStorageService.CopyFileToSameServiceType(latestFileVersion.StorageId, destinationStorageService); } else { using var stream = await sourceStorageService.RetrieveFile(latestFileVersion.StorageId); versionInfo = await destinationStorageService.StoreFile(stream); } var newFileRequest = new CreateFileRequest() { Key = request.Key, StorageService = destinationStorageService.Name }; var copyOfFile = await _hiarcDatabase.CreateFile(newFileRequest, userKey, versionInfo.StorageIdentifier); var uri = $"{_hiarcSettings.BaseUri}/files/{copyOfFile.Key}"; return(Created(uri, copyOfFile)); } else { return(StatusCode(StatusCodes.Status403Forbidden)); } } catch (Exception ex) { return(BuildErrorResponse(ex, _logger)); } }