forked from ddrilling/AsbCloudServer
#6385536 Удаление ненужных файлов. Замечания
This commit is contained in:
parent
3a0a22616d
commit
8a83194187
@ -46,7 +46,7 @@ namespace AsbCloudApp.Repositories
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="idWell"></param>
|
/// <param name="idWell"></param>
|
||||||
/// <param name="idsFiles"></param>
|
/// <param name="idsFiles"></param>
|
||||||
int DeleteFilesNotList(int idWell, IEnumerable<int> idsFiles);
|
int DeleteFilesNotInList(int idWell, IEnumerable<int> idsFiles);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Вывод списка всех файлов из базы, для которых нет файла на диске
|
/// Вывод списка всех файлов из базы, для которых нет файла на диске
|
||||||
|
@ -312,7 +312,7 @@ namespace AsbCloudApp.Services
|
|||||||
IdWell = idWell
|
IdWell = idWell
|
||||||
},
|
},
|
||||||
token);
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -333,6 +333,20 @@ namespace AsbCloudApp.Services
|
|||||||
var result = fileStorageRepository.GetListFilesNotDisc(files);
|
var result = fileStorageRepository.GetListFilesNotDisc(files);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получить файловый поток по идентификатору файла
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="fileInfo"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public FileStream GetFileStream(FileInfoDto fileInfo)
|
||||||
|
{
|
||||||
|
var relativePath = GetUrl(fileInfo);
|
||||||
|
var fileStream = new FileStream(Path.GetFullPath(relativePath), FileMode.Open);
|
||||||
|
|
||||||
|
return fileStream;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#nullable disable
|
#nullable disable
|
||||||
}
|
}
|
||||||
|
@ -45,23 +45,11 @@ namespace AsbCloudInfrastructure.Repository
|
|||||||
|
|
||||||
public async Task<PaginationContainer<FileInfoDto>> GetInfosAsync(FileServiceRequest request, CancellationToken token = default)
|
public async Task<PaginationContainer<FileInfoDto>> GetInfosAsync(FileServiceRequest request, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
var query = dbSetConfigured
|
var query = GetQuery(request, token);
|
||||||
.Where(e => e.IdWell == request.IdWell &&
|
var firstFile = query.FirstOrDefault();
|
||||||
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 skip = request.Skip ?? 0;
|
var skip = request.Skip ?? 0;
|
||||||
var take = request.Take ?? 32;
|
var take = request.Take ?? 32;
|
||||||
|
|
||||||
var firstFile = await query.FirstOrDefaultAsync(token);
|
|
||||||
if (firstFile is null)
|
if (firstFile is null)
|
||||||
return new PaginationContainer<FileInfoDto>()
|
return new PaginationContainer<FileInfoDto>()
|
||||||
{
|
{
|
||||||
@ -71,21 +59,7 @@ namespace AsbCloudInfrastructure.Repository
|
|||||||
};
|
};
|
||||||
|
|
||||||
var timezoneOffset = firstFile.Well.Timezone?.Hours ?? 5;
|
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 count = await query.CountAsync(token).ConfigureAwait(false);
|
||||||
|
|
||||||
var result = new PaginationContainer<FileInfoDto>(count)
|
var result = new PaginationContainer<FileInfoDto>(count)
|
||||||
{
|
{
|
||||||
Skip = skip,
|
Skip = skip,
|
||||||
@ -206,9 +180,7 @@ namespace AsbCloudInfrastructure.Repository
|
|||||||
|
|
||||||
public async Task<IEnumerable<FileInfoDto>> GetInfosByWellIdAsync(FileServiceRequest request, CancellationToken token)
|
public async Task<IEnumerable<FileInfoDto>> GetInfosByWellIdAsync(FileServiceRequest request, CancellationToken token)
|
||||||
{
|
{
|
||||||
var query = dbSetConfigured.Where(e => e.IdWell == request.IdWell);
|
var query = GetQuery(request, token);
|
||||||
if (request.IsDeleted is not null)
|
|
||||||
query = query.Where(x => x.IsDeleted == request.IsDeleted);
|
|
||||||
|
|
||||||
var entities = await query
|
var entities = await query
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
@ -219,25 +191,6 @@ namespace AsbCloudInfrastructure.Repository
|
|||||||
return dtos;
|
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<FileInfoDto>();
|
|
||||||
dto.UploadDate = entity.UploadDate.ToRemoteDateTime(timezoneOffset);
|
|
||||||
dto.FileMarks = entity.FileMarks.Select(m =>
|
|
||||||
{
|
|
||||||
var mark = m.Adapt<FileMarkDto>();
|
|
||||||
mark.DateCreated = m.DateCreated.ToRemoteDateTime(timezoneOffset);
|
|
||||||
return mark;
|
|
||||||
});
|
|
||||||
return dto;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<IEnumerable<FileInfoDto>> GetAllAsync(CancellationToken token)
|
public async Task<IEnumerable<FileInfoDto>> GetAllAsync(CancellationToken token)
|
||||||
=> await dbSetConfigured.AsNoTracking()
|
=> await dbSetConfigured.AsNoTracking()
|
||||||
.Select(x => Convert(x))
|
.Select(x => Convert(x))
|
||||||
@ -307,6 +260,62 @@ namespace AsbCloudInfrastructure.Repository
|
|||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private IQueryable<AsbCloudDb.Model.FileInfo> 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<AsbCloudDb.Model.FileInfo>().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<FileInfoDto>();
|
||||||
|
dto.UploadDate = entity.UploadDate.ToRemoteDateTime(timezoneOffset);
|
||||||
|
dto.FileMarks = entity.FileMarks.Select(m =>
|
||||||
|
{
|
||||||
|
var mark = m.Adapt<FileMarkDto>();
|
||||||
|
mark.DateCreated = m.DateCreated.ToRemoteDateTime(timezoneOffset);
|
||||||
|
return mark;
|
||||||
|
});
|
||||||
|
return dto;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#nullable disable
|
#nullable disable
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,7 @@ namespace AsbCloudInfrastructure.Repository
|
|||||||
$"{idCategory}", $"{fileId}" + $"{Path.GetExtension(fileFullName)}");
|
$"{idCategory}", $"{fileId}" + $"{Path.GetExtension(fileFullName)}");
|
||||||
}
|
}
|
||||||
|
|
||||||
public int DeleteFilesNotList(int idWell, IEnumerable<int> idsFilesList)
|
public int DeleteFilesNotInList(int idWell, IEnumerable<int> idsFilesList)
|
||||||
{
|
{
|
||||||
var allFilesPath = GetFilesPath(idWell);
|
var allFilesPath = GetFilesPath(idWell);
|
||||||
var result = 0;
|
var result = 0;
|
||||||
|
@ -133,6 +133,10 @@ namespace AsbCloudWebApi.Tests.ServicesTests
|
|||||||
});
|
});
|
||||||
|
|
||||||
var storageRepositoryMock = new Mock<IFileStorageRepository>();
|
var storageRepositoryMock = new Mock<IFileStorageRepository>();
|
||||||
|
storageRepositoryMock.Setup(x => x.GetUrl(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<string>()))
|
||||||
|
.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);
|
fileService = new FileService(repositoryMock.Object, storageRepositoryMock.Object);
|
||||||
}
|
}
|
||||||
|
@ -122,9 +122,8 @@ namespace AsbCloudWebApi.Controllers
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var fileInfo = await fileService.GetInfoAsync(fileId, token);
|
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);
|
return File(fileStream, "application/octet-stream", fileInfo.Name);
|
||||||
}
|
}
|
||||||
catch (FileNotFoundException ex)
|
catch (FileNotFoundException ex)
|
||||||
|
Loading…
Reference in New Issue
Block a user