forked from ddrilling/AsbCloudServer
CS2-106: Fixed .GetAsync() in DrillingProgramController to return file web url in cloud
This commit is contained in:
parent
da9e94b4b9
commit
c3be8bceea
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
Loading…
Reference in New Issue
Block a user