コード例 #1
0
ファイル: FilesController.cs プロジェクト: hiarcdb/hiarc
        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));
            }
        }