92 lines
3.4 KiB
C#
92 lines
3.4 KiB
C#
using Oqtane.Models;
|
|
using Oqtane.Repository;
|
|
using Oqtane.Interfaces;
|
|
using System.Collections.Generic;
|
|
using System;
|
|
using System.Threading.Tasks;
|
|
using Oqtane.Shared;
|
|
using System.IO;
|
|
|
|
namespace Oqtane.Modules.Admin.Files.Manager
|
|
{
|
|
public class FileManager : ISearchable
|
|
{
|
|
private readonly IFolderRepository _folderRepository;
|
|
private readonly IFileRepository _fileRepository;
|
|
private const string DocumentExtensions = ".txt,.htm,.html";
|
|
|
|
public FileManager(IFolderRepository folderRepository, IFileRepository fileRepository)
|
|
{
|
|
_folderRepository = folderRepository;
|
|
_fileRepository = fileRepository;
|
|
}
|
|
|
|
public Task<List<SearchContent>> GetSearchContentsAsync(PageModule pageModule, DateTime lastIndexedOn)
|
|
{
|
|
var searchContents = new List<SearchContent>();
|
|
|
|
var folders = _folderRepository.GetFolders(pageModule.Module.SiteId);
|
|
foreach ( var folder in folders)
|
|
{
|
|
bool changed = false;
|
|
bool removed = false;
|
|
|
|
if (folder.ModifiedOn >= lastIndexedOn)
|
|
{
|
|
changed = true;
|
|
removed = folder.IsDeleted.Value;
|
|
}
|
|
|
|
var files = _fileRepository.GetFiles(folder.FolderId);
|
|
foreach (var file in files)
|
|
{
|
|
if (file.ModifiedOn >= lastIndexedOn || changed)
|
|
{
|
|
var path = folder.Path + file.Name;
|
|
|
|
var body = "";
|
|
if (System.IO.File.Exists(_fileRepository.GetFilePath(file)))
|
|
{
|
|
// only non-binary files can be indexed
|
|
if (DocumentExtensions.Contains(Path.GetExtension(file.Name)))
|
|
{
|
|
// get the contents of the file
|
|
try
|
|
{
|
|
body = System.IO.File.ReadAllText(_fileRepository.GetFilePath(file));
|
|
}
|
|
catch
|
|
{
|
|
// could not read the file
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
removed = true; // file does not exist on disk
|
|
}
|
|
|
|
var searchContent = new SearchContent
|
|
{
|
|
SiteId = folder.SiteId,
|
|
EntityName = EntityNames.File,
|
|
EntityId = file.FileId.ToString(),
|
|
Title = path,
|
|
Description = "",
|
|
Body = body,
|
|
Url = $"{Constants.FileUrl}{folder.Path}{file.Name}",
|
|
Permissions = $"{EntityNames.Folder}:{folder.FolderId}",
|
|
ContentModifiedBy = file.ModifiedBy,
|
|
ContentModifiedOn = file.ModifiedOn,
|
|
IsDeleted = (removed || file.IsDeleted.Value)
|
|
};
|
|
searchContents.Add(searchContent);
|
|
}
|
|
}
|
|
}
|
|
|
|
return Task.FromResult(searchContents);
|
|
}
|
|
}
|
|
}
|