diff --git a/AsbCloudApp/Services/IFileService.cs b/AsbCloudApp/Services/IFileService.cs index 1ed9aaa0..c7014309 100644 --- a/AsbCloudApp/Services/IFileService.cs +++ b/AsbCloudApp/Services/IFileService.cs @@ -11,7 +11,10 @@ namespace AsbCloudApp.Services { string RootPath { get; } - string CreateGoogleDriveWebLink(string filePath, string originalName); + Task GetProgramWebUrlAsync(int idFileInfo, + CancellationToken token = default); + Task PublishFileToCloudAsync(string filePath, string originalName, + CancellationToken token = default); Task SaveWeblinkToFileInfo(int idFileInfo, string weblink, CancellationToken token = default); Task SaveAsync(int idWell, int? idUser, int idCategory, string fileFullName, Stream fileStream, CancellationToken token = default); diff --git a/AsbCloudApp/Services/IGoogleDriveService.cs b/AsbCloudApp/Services/IGoogleDriveService.cs index bb54131a..1b5d72ab 100644 --- a/AsbCloudApp/Services/IGoogleDriveService.cs +++ b/AsbCloudApp/Services/IGoogleDriveService.cs @@ -1,13 +1,21 @@ +using System.Threading; +using System.Threading.Tasks; using System.IO; namespace AsbCloudApp.Services { public interface IGoogleDriveService { - string GetFileWebLink(string idFile); - string CreateFolder(string folderName); - void CreatePublicPermissionForFile(string idFile); - string UploadFile(Stream file, string fileName, string fileMime, string fileDescription); - void DeleteFile(string fileId); + Task GetFileWebLinkAsync(string idFile, + CancellationToken token = default); + Task CreateFolderAsync(string folderName, + CancellationToken token = default) ; + + Task CreatePublicPermissionForFileAsync(string idFile, + CancellationToken token = default); + Task UploadFileAsync(Stream file, string fileName, string fileMime, + string fileDescription, CancellationToken token = default); + Task DeleteFileAsync(string fileId, + CancellationToken token = default); } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/FileService.cs b/AsbCloudInfrastructure/Services/FileService.cs index 19292ea3..20446b84 100644 --- a/AsbCloudInfrastructure/Services/FileService.cs +++ b/AsbCloudInfrastructure/Services/FileService.cs @@ -32,14 +32,26 @@ namespace AsbCloudInfrastructure.Services this.googleDriveService = googleDriveService; } - public string CreateGoogleDriveWebLink(string filePath, string originalName) - { // TODO: Сделать проверку, есть ли уже такой файл на гугл диске. Если есть, то удалить и пересоздать. - // Без этого они будут копиться там с одинаковыми названиями. Или в найстроках гугл диска мож есть перезапись файлов с одинаковыми названиями. - using var fileStream = File.Open(filePath, FileMode.Open); - var uploadedFileId = googleDriveService.UploadFile(fileStream, originalName, - "", "uploaded"); - googleDriveService.CreatePublicPermissionForFile(uploadedFileId); - var webLink = googleDriveService.GetFileWebLink(uploadedFileId); + public async Task GetProgramWebUrlAsync(int idFileInfo, + CancellationToken token = default) + { + var fileInfo = await db.Files.FirstOrDefaultAsync(f => f.Id == idFileInfo, token) + .ConfigureAwait(false); + + return fileInfo?.WebStorageUrl; + } + + public async Task PublishFileToCloudAsync(string filePath, string originalName, + CancellationToken token = default) + { + await using var fileStream = File.Open(filePath, FileMode.Open); + var uploadedFileId = await googleDriveService.UploadFileAsync(fileStream, originalName, + "", "uploaded", token) + .ConfigureAwait(false); + await googleDriveService.CreatePublicPermissionForFileAsync(uploadedFileId, token) + .ConfigureAwait(false); + var webLink = await googleDriveService.GetFileWebLinkAsync(uploadedFileId, token) + .ConfigureAwait(false); return webLink; } @@ -47,7 +59,7 @@ namespace AsbCloudInfrastructure.Services public async Task SaveWeblinkToFileInfo(int idFileInfo, string weblink, CancellationToken token = default) { - var fileInfo = await db.Files.FirstOrDefaultAsync(f => f.Id == idFileInfo) + var fileInfo = await db.Files.FirstOrDefaultAsync(f => f.Id == idFileInfo, token) .ConfigureAwait(false); fileInfo.WebStorageUrl = weblink; diff --git a/AsbCloudInfrastructure/Services/GoogleDriveService.cs b/AsbCloudInfrastructure/Services/GoogleDriveService.cs index 0088dc74..7ccb3058 100644 --- a/AsbCloudInfrastructure/Services/GoogleDriveService.cs +++ b/AsbCloudInfrastructure/Services/GoogleDriveService.cs @@ -8,6 +8,8 @@ using Google.Apis.Drive.v3.Data; using System.IO; using System.Collections.Generic; using System.Linq; +using System.Threading; +using System.Threading.Tasks; using AsbCloudApp.Services; namespace AsbCloudInfrastructure.Services @@ -69,35 +71,42 @@ namespace AsbCloudInfrastructure.Services // return result; // } - public string GetFileWebLink(string idFile) + public async Task GetFileWebLinkAsync(string idFile, + CancellationToken token = default) { var fileList = service.Files.List(); fileList.Fields = "files(id, webViewLink, size)"; - var filesResult = fileList.Execute(); + var filesResult = await fileList.ExecuteAsync(token) + .ConfigureAwait(false); var file = filesResult.Files.FirstOrDefault(f => f.Id == idFile); return file?.WebViewLink ?? string.Empty; } // У Гугла почему-то folder это и папка, и файл. - public string CreateFolder(string folderName) + public async Task CreateFolderAsync(string folderName, + CancellationToken token = default) { var driveFolder = new Google.Apis.Drive.v3.Data.File(); driveFolder.Name = folderName; driveFolder.MimeType = "application/vnd.google-apps.folder"; //driveFolder.Parents = new string[] { parent }; var command = service.Files.Create(driveFolder); - var file = command.Execute(); + var file = await command.ExecuteAsync(token) + .ConfigureAwait(false); return file.Id; } - public void CreatePublicPermissionForFile(string idFile) + public async Task CreatePublicPermissionForFileAsync(string idFile, + CancellationToken token = default) { var permission = new Permission() { Type = "anyone", Role = "reader"}; var addPermissionRequest = service.Permissions.Create(permission, idFile); - addPermissionRequest.Execute(); + await addPermissionRequest.ExecuteAsync(token) + .ConfigureAwait(false); } - public string UploadFile(Stream file, string fileName, string fileMime, string fileDescription) + public async Task UploadFileAsync(Stream file, string fileName, string fileMime, + string fileDescription, CancellationToken token = default) { var driveFile = new Google.Apis.Drive.v3.Data.File(); driveFile.Name = fileName; @@ -108,17 +117,20 @@ namespace AsbCloudInfrastructure.Services var request = service.Files.Create(driveFile, file, fileMime); request.Fields = "id"; - var response = request.Upload(); + var response = await request.UploadAsync(token) + .ConfigureAwait(false); if (response.Status != Google.Apis.Upload.UploadStatus.Completed) throw response.Exception; return request.ResponseBody.Id; } - public void DeleteFile(string fileId) + public async Task DeleteFileAsync(string fileId, + CancellationToken token = default) { var command = service.Files.Delete(fileId); - var result = command.Execute(); + var result = await command.ExecuteAsync(token) + .ConfigureAwait(false); } } } \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/DrillingProgramController.cs b/AsbCloudWebApi/Controllers/DrillingProgramController.cs index 0f0dfa77..69f85b8f 100644 --- a/AsbCloudWebApi/Controllers/DrillingProgramController.cs +++ b/AsbCloudWebApi/Controllers/DrillingProgramController.cs @@ -1,4 +1,5 @@ -using AsbCloudApp.Services; +using System; +using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System.IO; @@ -26,40 +27,29 @@ namespace AsbCloudWebApi.Controllers /// /// id скважины /// Токен отмены задачи - /// Файл программы бурения + /// Возвращает ссылку на файл в облаке [HttpGet] - [ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK)] + [ProducesResponseType(typeof(string), (int)System.Net.HttpStatusCode.OK)] public async Task GetAsync(int idWell, CancellationToken token = default) { var fileInfo = await drillingProgramService.GetAsync(idWell, token) .ConfigureAwait(false); if (fileInfo is null) return NoContent(); - var relativePath = fileService.GetUrl(fileInfo); - - return PhysicalFile(Path.GetFullPath(relativePath), "application/octet-stream", fileInfo.Name); - } - - /// - /// Публикует файл программы бурения в облако (только если программа уже создана) - /// - /// id скважины - /// Токен отмены задачи - /// Возвращает ссылку на файл программы бурения в облаке (только если программа уже создана) - [HttpGet("webLink")] - [ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK)] - public async Task GetWebLinkAsync(int idWell, CancellationToken token = default) - { - var fileInfo = await drillingProgramService.GetAsync(idWell, token) - .ConfigureAwait(false); - if (fileInfo is null) - return NoContent(); - var relativePath = fileService.GetUrl(fileInfo); - - var fileWebLink = fileService.CreateGoogleDriveWebLink(relativePath, fileInfo.Name); - await fileService.SaveWeblinkToFileInfo(fileInfo.Id, fileWebLink, token); + // Чтоб не смешивать этот временный функционал с основным публикация на гугл диск вся вынесена сюда + // и выполняется уже после всех необходимых действий по созданию файла программы бурения. + var fileWebLink = await fileService.GetProgramWebUrlAsync(fileInfo.Id); + if (!string.IsNullOrEmpty(fileWebLink)) + return Ok(fileWebLink); + + var relativePath = fileService.GetUrl(fileInfo); + fileWebLink = await fileService.PublishFileToCloudAsync(relativePath, + fileInfo.Name, token); + await fileService.SaveWeblinkToFileInfo(fileInfo.Id, fileWebLink, token); + return Ok(fileWebLink); + //return PhysicalFile(Path.GetFullPath(relativePath), "application/octet-stream", fileInfo.Name); } } } diff --git a/ConsoleApp1/GoogleDriveService.cs b/ConsoleApp1/GoogleDriveService.cs index f6c55eba..a96f0936 100644 --- a/ConsoleApp1/GoogleDriveService.cs +++ b/ConsoleApp1/GoogleDriveService.cs @@ -140,7 +140,7 @@ namespace ConsoleApp1 // var path = "/home/cult/First.xlsx"; // var fileInfo = new FileInfo(path); // var fileStream = System.IO.File.Open(path, FileMode.Open); -// var uploadedFileId = service.UploadFile(fileStream, fileInfo.Name, "", "uploaded"); -// service.CreatePublicPermissionForFile(uploadedFileId); -// var webLink = service.GetFileWebLink(uploadedFileId); +// var uploadedFileId = service.UploadFileAsync(fileStream, fileInfo.Name, "", "uploaded"); +// service.CreatePublicPermissionForFileAsync(uploadedFileId); +// var webLink = service.GetFileWebLinkAsync(uploadedFileId); // Console.WriteLine(webLink); \ No newline at end of file