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)