using System.Collections.Generic;
using System.Linq;
using Umbraco.Cms.Core.IO;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Persistence.Repositories;
using Umbraco.Extensions;
namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement
{
///
/// Represents the Stylesheet Repository
///
internal class StylesheetRepository : FileRepository, IStylesheetRepository
{
public StylesheetRepository(FileSystems fileSystems)
: base(fileSystems.StylesheetsFileSystem)
{
}
#region Overrides of FileRepository
public override IStylesheet? Get(string? id)
{
if (id is null || FileSystem is null)
{
return null;
}
// get the relative path within the filesystem
// (though... id should be relative already)
var path = FileSystem.GetRelativePath(id);
path = path.EnsureEndsWith(".css");
// if the css directory is changed, references to the old path can still exist (ie in RTE config)
// these old references will throw an error, which breaks the RTE
// try-catch here makes the request fail silently, and allows RTE to load correctly
try
{
if (FileSystem.FileExists(path) == false)
return null;
} catch
{
return null;
}
// content will be lazy-loaded when required
var created = FileSystem.GetCreated(path).UtcDateTime;
var updated = FileSystem.GetLastModified(path).UtcDateTime;
//var content = GetFileContent(path);
var stylesheet = new Stylesheet(path, file => GetFileContent(file.OriginalPath))
{
//Content = content,
Key = path.EncodeAsGuid(),
CreateDate = created,
UpdateDate = updated,
Id = path.GetHashCode(),
VirtualPath = FileSystem.GetUrl(path)
};
// reset dirty initial properties (U4-1946)
stylesheet.ResetDirtyProperties(false);
return stylesheet;
}
public override void Save(IStylesheet entity)
{
// TODO: Casting :/ Review GetFileContent and it's usages, need to look into it later
var stylesheet = (Stylesheet)entity;
base.Save(stylesheet);
// ensure that from now on, content is lazy-loaded
if (stylesheet.GetFileContent == null)
stylesheet.GetFileContent = file => GetFileContent(file.OriginalPath);
}
public override IEnumerable GetMany(params string[]? ids)
{
//ensure they are de-duplicated, easy win if people don't do this as this can cause many excess queries
ids = ids?
.Select(x => x.EnsureEndsWith(".css"))
.Distinct()
.ToArray();
if (ids?.Any() ?? false)
{
foreach (var id in ids)
{
IStylesheet? stylesheet = Get(id);
if (stylesheet is not null)
{
yield return stylesheet;
}
}
}
else
{
var files = FindAllFiles("", "*.css");
foreach (var file in files)
{
IStylesheet? stylesheet = Get(file);
if (stylesheet is not null)
{
yield return stylesheet;
}
}
}
}
#endregion
}
}