From 8a83194187dda20f97fa2dd77ef6cd911b80a663 Mon Sep 17 00:00:00 2001 From: "ai.astrakhantsev" Date: Mon, 17 Oct 2022 08:58:28 +0500 Subject: [PATCH] =?UTF-8?q?#6385536=20=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BD=D0=B5=D0=BD=D1=83=D0=B6=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2.=20=D0=97=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/IFileStorageRepository.cs | 2 +- AsbCloudApp/Services/FileService.cs | 16 ++- .../Repository/FileRepository.cs | 109 ++++++++++-------- .../Repository/FileStorageRepository.cs | 2 +- .../ServicesTests/FileServiceTest.cs | 4 + AsbCloudWebApi/Controllers/FileController.cs | 3 +- 6 files changed, 81 insertions(+), 55 deletions(-) diff --git a/AsbCloudApp/Repositories/IFileStorageRepository.cs b/AsbCloudApp/Repositories/IFileStorageRepository.cs index 68ce51e9..0d867db0 100644 --- a/AsbCloudApp/Repositories/IFileStorageRepository.cs +++ b/AsbCloudApp/Repositories/IFileStorageRepository.cs @@ -46,7 +46,7 @@ namespace AsbCloudApp.Repositories /// /// /// - int DeleteFilesNotList(int idWell, IEnumerable idsFiles); + int DeleteFilesNotInList(int idWell, IEnumerable idsFiles); /// /// Вывод списка всех файлов из базы, для которых нет файла на диске diff --git a/AsbCloudApp/Services/FileService.cs b/AsbCloudApp/Services/FileService.cs index d16006e1..04b2c65d 100644 --- a/AsbCloudApp/Services/FileService.cs +++ b/AsbCloudApp/Services/FileService.cs @@ -312,7 +312,7 @@ namespace AsbCloudApp.Services IdWell = idWell }, token); - var result = await Task.FromResult(fileStorageRepository.DeleteFilesNotList(idWell, files.Select(x => x.Id))); + var result = await Task.FromResult(fileStorageRepository.DeleteFilesNotInList(idWell, files.Select(x => x.Id))); return result; } @@ -333,6 +333,20 @@ namespace AsbCloudApp.Services var result = fileStorageRepository.GetListFilesNotDisc(files); return result; } + + /// + /// Получить файловый поток по идентификатору файла + /// + /// + /// + /// + public FileStream GetFileStream(FileInfoDto fileInfo) + { + var relativePath = GetUrl(fileInfo); + var fileStream = new FileStream(Path.GetFullPath(relativePath), FileMode.Open); + + return fileStream; + } } #nullable disable } diff --git a/AsbCloudInfrastructure/Repository/FileRepository.cs b/AsbCloudInfrastructure/Repository/FileRepository.cs index 16367b09..6eacf56b 100644 --- a/AsbCloudInfrastructure/Repository/FileRepository.cs +++ b/AsbCloudInfrastructure/Repository/FileRepository.cs @@ -45,23 +45,11 @@ namespace AsbCloudInfrastructure.Repository public async Task> GetInfosAsync(FileServiceRequest request, CancellationToken token = default) { - var query = dbSetConfigured - .Where(e => e.IdWell == request.IdWell && - e.IdCategory == request.IdCategory && - !e.IsDeleted); - - if (request.CompanyName is not null) - query = query.Where(e => (e.Author == null) || - (e.Author.Company == null) || - e.Author.Company.Caption.Contains(request.CompanyName)); - - if (request.FileName is not null) - query = query.Where(e => e.Name.ToLower().Contains(request.FileName.ToLower())); - + var query = GetQuery(request, token); + var firstFile = query.FirstOrDefault(); var skip = request.Skip ?? 0; var take = request.Take ?? 32; - var firstFile = await query.FirstOrDefaultAsync(token); if (firstFile is null) return new PaginationContainer() { @@ -71,21 +59,7 @@ namespace AsbCloudInfrastructure.Repository }; var timezoneOffset = firstFile.Well.Timezone?.Hours ?? 5; - - if (request.Begin is not null) - { - var beginUtc = request.Begin.Value.ToUtcDateTimeOffset(timezoneOffset); - query = query.Where(e => e.UploadDate >= beginUtc); - } - - if (request.End is not null) - { - var endUtc = request.End.Value.ToUtcDateTimeOffset(timezoneOffset); - query = query.Where(e => e.UploadDate <= endUtc); - } - var count = await query.CountAsync(token).ConfigureAwait(false); - var result = new PaginationContainer(count) { Skip = skip, @@ -206,9 +180,7 @@ namespace AsbCloudInfrastructure.Repository public async Task> GetInfosByWellIdAsync(FileServiceRequest request, CancellationToken token) { - var query = dbSetConfigured.Where(e => e.IdWell == request.IdWell); - if (request.IsDeleted is not null) - query = query.Where(x => x.IsDeleted == request.IsDeleted); + var query = GetQuery(request, token); var entities = await query .AsNoTracking() @@ -219,25 +191,6 @@ namespace AsbCloudInfrastructure.Repository return dtos; } - private static FileInfoDto Convert(AsbCloudDb.Model.FileInfo entity) - { - var timezoneOffset = entity.Well.Timezone?.Hours ?? 5; - return Convert(entity, timezoneOffset); - } - - private static FileInfoDto Convert(AsbCloudDb.Model.FileInfo entity, double timezoneOffset) - { - var dto = entity.Adapt(); - dto.UploadDate = entity.UploadDate.ToRemoteDateTime(timezoneOffset); - dto.FileMarks = entity.FileMarks.Select(m => - { - var mark = m.Adapt(); - mark.DateCreated = m.DateCreated.ToRemoteDateTime(timezoneOffset); - return mark; - }); - return dto; - } - public async Task> GetAllAsync(CancellationToken token) => await dbSetConfigured.AsNoTracking() .Select(x => Convert(x)) @@ -307,6 +260,62 @@ namespace AsbCloudInfrastructure.Repository { throw new NotImplementedException(); } + + private IQueryable GetQuery(FileServiceRequest request, CancellationToken token = default) + { + var query = dbSetConfigured + .Where(e => e.IdWell == request.IdWell && + e.IdCategory == request.IdCategory); + + if (request.IsDeleted is not null) + query = query.Where(x => x.IsDeleted == request.IsDeleted); + + if (request.CompanyName is not null) + query = query.Where(e => (e.Author == null) || + (e.Author.Company == null) || + e.Author.Company.Caption.Contains(request.CompanyName)); + + if (request.FileName is not null) + query = query.Where(e => e.Name.ToLower().Contains(request.FileName.ToLower())); + + var firstFile = query.FirstOrDefault(); + if (firstFile is null) + return Enumerable.Empty().AsQueryable(); + + var timezoneOffset = firstFile.Well.Timezone?.Hours ?? 5; + if (request.Begin is not null) + { + var beginUtc = request.Begin.Value.ToUtcDateTimeOffset(timezoneOffset); + query = query.Where(e => e.UploadDate >= beginUtc); + } + + if (request.End is not null) + { + var endUtc = request.End.Value.ToUtcDateTimeOffset(timezoneOffset); + query = query.Where(e => e.UploadDate <= endUtc); + } + + return query; + } + + private static FileInfoDto Convert(AsbCloudDb.Model.FileInfo entity) + { + var timezoneOffset = entity.Well.Timezone?.Hours ?? 5; + return Convert(entity, timezoneOffset); + } + + private static FileInfoDto Convert(AsbCloudDb.Model.FileInfo entity, double timezoneOffset) + { + var dto = entity.Adapt(); + dto.UploadDate = entity.UploadDate.ToRemoteDateTime(timezoneOffset); + dto.FileMarks = entity.FileMarks.Select(m => + { + var mark = m.Adapt(); + mark.DateCreated = m.DateCreated.ToRemoteDateTime(timezoneOffset); + return mark; + }); + return dto; + } } #nullable disable } diff --git a/AsbCloudInfrastructure/Repository/FileStorageRepository.cs b/AsbCloudInfrastructure/Repository/FileStorageRepository.cs index 37a041b7..0d7a2cf8 100644 --- a/AsbCloudInfrastructure/Repository/FileStorageRepository.cs +++ b/AsbCloudInfrastructure/Repository/FileStorageRepository.cs @@ -57,7 +57,7 @@ namespace AsbCloudInfrastructure.Repository $"{idCategory}", $"{fileId}" + $"{Path.GetExtension(fileFullName)}"); } - public int DeleteFilesNotList(int idWell, IEnumerable idsFilesList) + public int DeleteFilesNotInList(int idWell, IEnumerable idsFilesList) { var allFilesPath = GetFilesPath(idWell); var result = 0; diff --git a/AsbCloudWebApi.Tests/ServicesTests/FileServiceTest.cs b/AsbCloudWebApi.Tests/ServicesTests/FileServiceTest.cs index cf35bcab..4f83e996 100644 --- a/AsbCloudWebApi.Tests/ServicesTests/FileServiceTest.cs +++ b/AsbCloudWebApi.Tests/ServicesTests/FileServiceTest.cs @@ -133,6 +133,10 @@ namespace AsbCloudWebApi.Tests.ServicesTests }); var storageRepositoryMock = new Mock(); + storageRepositoryMock.Setup(x => x.GetUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .Returns((int idWell, int idCategory, int idFile, string dotExtention) => { + return Path.Combine("files", idWell.ToString(), idCategory.ToString(), $"{idFile}{dotExtention}"); + }); fileService = new FileService(repositoryMock.Object, storageRepositoryMock.Object); } diff --git a/AsbCloudWebApi/Controllers/FileController.cs b/AsbCloudWebApi/Controllers/FileController.cs index 85c095a3..7d4e395b 100644 --- a/AsbCloudWebApi/Controllers/FileController.cs +++ b/AsbCloudWebApi/Controllers/FileController.cs @@ -122,9 +122,8 @@ namespace AsbCloudWebApi.Controllers try { var fileInfo = await fileService.GetInfoAsync(fileId, token); - var relativePath = fileService.GetUrl(fileInfo); + var fileStream = fileService.GetFileStream(fileInfo); - var fileStream = new FileStream(Path.GetFullPath(relativePath), FileMode.Open); return File(fileStream, "application/octet-stream", fileInfo.Name); } catch (FileNotFoundException ex)