CS2-106: Fixed .GetAsync() in DrillingProgramController to return file web url in cloud

This commit is contained in:
cult 2021-10-28 15:08:06 +05:00
parent da9e94b4b9
commit c3be8bceea
6 changed files with 79 additions and 54 deletions

View File

@ -11,7 +11,10 @@ namespace AsbCloudApp.Services
{ {
string RootPath { get; } string RootPath { get; }
string CreateGoogleDriveWebLink(string filePath, string originalName); Task<string> GetProgramWebUrlAsync(int idFileInfo,
CancellationToken token = default);
Task<string> PublishFileToCloudAsync(string filePath, string originalName,
CancellationToken token = default);
Task<int> SaveWeblinkToFileInfo(int idFileInfo, string weblink, CancellationToken token = default); Task<int> SaveWeblinkToFileInfo(int idFileInfo, string weblink, CancellationToken token = default);
Task<FileInfoDto> SaveAsync(int idWell, int? idUser, int idCategory, string fileFullName, Stream fileStream, CancellationToken token = default); Task<FileInfoDto> SaveAsync(int idWell, int? idUser, int idCategory, string fileFullName, Stream fileStream, CancellationToken token = default);

View File

@ -1,13 +1,21 @@
using System.Threading;
using System.Threading.Tasks;
using System.IO; using System.IO;
namespace AsbCloudApp.Services namespace AsbCloudApp.Services
{ {
public interface IGoogleDriveService public interface IGoogleDriveService
{ {
string GetFileWebLink(string idFile); Task<string> GetFileWebLinkAsync(string idFile,
string CreateFolder(string folderName); CancellationToken token = default);
void CreatePublicPermissionForFile(string idFile); Task<string> CreateFolderAsync(string folderName,
string UploadFile(Stream file, string fileName, string fileMime, string fileDescription); CancellationToken token = default) ;
void DeleteFile(string fileId);
Task CreatePublicPermissionForFileAsync(string idFile,
CancellationToken token = default);
Task<string> UploadFileAsync(Stream file, string fileName, string fileMime,
string fileDescription, CancellationToken token = default);
Task DeleteFileAsync(string fileId,
CancellationToken token = default);
} }
} }

View File

@ -32,14 +32,26 @@ namespace AsbCloudInfrastructure.Services
this.googleDriveService = googleDriveService; this.googleDriveService = googleDriveService;
} }
public string CreateGoogleDriveWebLink(string filePath, string originalName) public async Task<string> GetProgramWebUrlAsync(int idFileInfo,
{ // TODO: Сделать проверку, есть ли уже такой файл на гугл диске. Если есть, то удалить и пересоздать. CancellationToken token = default)
// Без этого они будут копиться там с одинаковыми названиями. Или в найстроках гугл диска мож есть перезапись файлов с одинаковыми названиями. {
using var fileStream = File.Open(filePath, FileMode.Open); var fileInfo = await db.Files.FirstOrDefaultAsync(f => f.Id == idFileInfo, token)
var uploadedFileId = googleDriveService.UploadFile(fileStream, originalName, .ConfigureAwait(false);
"", "uploaded");
googleDriveService.CreatePublicPermissionForFile(uploadedFileId); return fileInfo?.WebStorageUrl;
var webLink = googleDriveService.GetFileWebLink(uploadedFileId); }
public async Task<string> 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; return webLink;
} }
@ -47,7 +59,7 @@ namespace AsbCloudInfrastructure.Services
public async Task<int> SaveWeblinkToFileInfo(int idFileInfo, string weblink, public async Task<int> SaveWeblinkToFileInfo(int idFileInfo, string weblink,
CancellationToken token = default) 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); .ConfigureAwait(false);
fileInfo.WebStorageUrl = weblink; fileInfo.WebStorageUrl = weblink;

View File

@ -8,6 +8,8 @@ using Google.Apis.Drive.v3.Data;
using System.IO; using System.IO;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using AsbCloudApp.Services; using AsbCloudApp.Services;
namespace AsbCloudInfrastructure.Services namespace AsbCloudInfrastructure.Services
@ -69,35 +71,42 @@ namespace AsbCloudInfrastructure.Services
// return result; // return result;
// } // }
public string GetFileWebLink(string idFile) public async Task<string> GetFileWebLinkAsync(string idFile,
CancellationToken token = default)
{ {
var fileList = service.Files.List(); var fileList = service.Files.List();
fileList.Fields = "files(id, webViewLink, size)"; 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); var file = filesResult.Files.FirstOrDefault(f => f.Id == idFile);
return file?.WebViewLink ?? string.Empty; return file?.WebViewLink ?? string.Empty;
} }
// У Гугла почему-то folder это и папка, и файл. // У Гугла почему-то folder это и папка, и файл.
public string CreateFolder(string folderName) public async Task<string> CreateFolderAsync(string folderName,
CancellationToken token = default)
{ {
var driveFolder = new Google.Apis.Drive.v3.Data.File(); var driveFolder = new Google.Apis.Drive.v3.Data.File();
driveFolder.Name = folderName; driveFolder.Name = folderName;
driveFolder.MimeType = "application/vnd.google-apps.folder"; driveFolder.MimeType = "application/vnd.google-apps.folder";
//driveFolder.Parents = new string[] { parent }; //driveFolder.Parents = new string[] { parent };
var command = service.Files.Create(driveFolder); var command = service.Files.Create(driveFolder);
var file = command.Execute(); var file = await command.ExecuteAsync(token)
.ConfigureAwait(false);
return file.Id; 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 permission = new Permission() { Type = "anyone", Role = "reader"};
var addPermissionRequest = service.Permissions.Create(permission, idFile); 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<string> UploadFileAsync(Stream file, string fileName, string fileMime,
string fileDescription, CancellationToken token = default)
{ {
var driveFile = new Google.Apis.Drive.v3.Data.File(); var driveFile = new Google.Apis.Drive.v3.Data.File();
driveFile.Name = fileName; driveFile.Name = fileName;
@ -108,17 +117,20 @@ namespace AsbCloudInfrastructure.Services
var request = service.Files.Create(driveFile, file, fileMime); var request = service.Files.Create(driveFile, file, fileMime);
request.Fields = "id"; request.Fields = "id";
var response = request.Upload(); var response = await request.UploadAsync(token)
.ConfigureAwait(false);
if (response.Status != Google.Apis.Upload.UploadStatus.Completed) if (response.Status != Google.Apis.Upload.UploadStatus.Completed)
throw response.Exception; throw response.Exception;
return request.ResponseBody.Id; 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 command = service.Files.Delete(fileId);
var result = command.Execute(); var result = await command.ExecuteAsync(token)
.ConfigureAwait(false);
} }
} }
} }

View File

@ -1,4 +1,5 @@
using AsbCloudApp.Services; using System;
using AsbCloudApp.Services;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using System.IO; using System.IO;
@ -26,40 +27,29 @@ namespace AsbCloudWebApi.Controllers
/// </summary> /// </summary>
/// <param name="idWell"> id скважины </param> /// <param name="idWell"> id скважины </param>
/// <param name="token"> Токен отмены задачи </param> /// <param name="token"> Токен отмены задачи </param>
/// <returns> Файл программы бурения </returns> /// <returns> Возвращает ссылку на файл в облаке </returns>
[HttpGet] [HttpGet]
[ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK)] [ProducesResponseType(typeof(string), (int)System.Net.HttpStatusCode.OK)]
public async Task<IActionResult> GetAsync(int idWell, CancellationToken token = default) public async Task<IActionResult> GetAsync(int idWell, CancellationToken token = default)
{ {
var fileInfo = await drillingProgramService.GetAsync(idWell, token) var fileInfo = await drillingProgramService.GetAsync(idWell, token)
.ConfigureAwait(false); .ConfigureAwait(false);
if (fileInfo is null) if (fileInfo is null)
return NoContent(); return NoContent();
// Чтоб не смешивать этот временный функционал с основным публикация на гугл диск вся вынесена сюда
// и выполняется уже после всех необходимых действий по созданию файла программы бурения.
var fileWebLink = await fileService.GetProgramWebUrlAsync(fileInfo.Id);
if (!string.IsNullOrEmpty(fileWebLink))
return Ok(fileWebLink);
var relativePath = fileService.GetUrl(fileInfo); var relativePath = fileService.GetUrl(fileInfo);
fileWebLink = await fileService.PublishFileToCloudAsync(relativePath,
return PhysicalFile(Path.GetFullPath(relativePath), "application/octet-stream", fileInfo.Name); fileInfo.Name, token);
}
/// <summary>
/// Публикует файл программы бурения в облако (только если программа уже создана)
/// </summary>
/// <param name="idWell"> id скважины </param>
/// <param name="token"> Токен отмены задачи </param>
/// <returns> Возвращает ссылку на файл программы бурения в облаке (только если программа уже создана) </returns>
[HttpGet("webLink")]
[ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK)]
public async Task<IActionResult> 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); await fileService.SaveWeblinkToFileInfo(fileInfo.Id, fileWebLink, token);
return Ok(fileWebLink); return Ok(fileWebLink);
//return PhysicalFile(Path.GetFullPath(relativePath), "application/octet-stream", fileInfo.Name);
} }
} }
} }

View File

@ -140,7 +140,7 @@ namespace ConsoleApp1
// var path = "/home/cult/First.xlsx"; // var path = "/home/cult/First.xlsx";
// var fileInfo = new FileInfo(path); // var fileInfo = new FileInfo(path);
// var fileStream = System.IO.File.Open(path, FileMode.Open); // var fileStream = System.IO.File.Open(path, FileMode.Open);
// var uploadedFileId = service.UploadFile(fileStream, fileInfo.Name, "", "uploaded"); // var uploadedFileId = service.UploadFileAsync(fileStream, fileInfo.Name, "", "uploaded");
// service.CreatePublicPermissionForFile(uploadedFileId); // service.CreatePublicPermissionForFileAsync(uploadedFileId);
// var webLink = service.GetFileWebLink(uploadedFileId); // var webLink = service.GetFileWebLinkAsync(uploadedFileId);
// Console.WriteLine(webLink); // Console.WriteLine(webLink);