Fix 8 design majors: optional ILogger in libraries, IndexFactoryService singleton threading, SharedMediaTypeRegistry, required TrackDto fields, GetExtensionType dedup, PagedResult zero-guard, TrackService null-return on failure

This commit is contained in:
Daniel Harvey
2026-05-17 16:57:03 -04:00
parent fc5b8de81a
commit 4bd3be2eb8
11 changed files with 99 additions and 68 deletions
@@ -9,7 +9,8 @@ namespace DeepDrftContent.Services.FileDatabase.Services;
/// </summary>
public abstract class MediaVault : VaultIndexDirectory
{
protected MediaVault(string rootPath, VaultIndex index) : base(rootPath, index) { }
protected MediaVault(string rootPath, VaultIndex index, IndexFactoryService? factoryService = null)
: base(rootPath, index, factoryService: factoryService) { }
/// <summary>
/// Generates a media key from an entry key by sanitizing special characters
@@ -105,19 +106,20 @@ public abstract class MediaVault : VaultIndexDirectory
/// </summary>
public class ImageVault : MediaVault
{
private ImageVault(string rootPath, VaultIndex index) : base(rootPath, index) { }
private ImageVault(string rootPath, VaultIndex index, IndexFactoryService? factoryService = null)
: base(rootPath, index, factoryService) { }
/// <summary>
/// Factory method to create an ImageVault instance
/// </summary>
public static async Task<ImageVault?> FromAsync(string rootPath)
public static async Task<ImageVault?> FromAsync(string rootPath, IndexFactoryService? factoryService = null)
{
var factoryService = new IndexFactoryService();
var index = await factoryService.LoadOrCreateVaultIndexAsync(rootPath, MediaVaultType.Image);
var factory = factoryService ?? new IndexFactoryService();
var index = await factory.LoadOrCreateVaultIndexAsync(rootPath, MediaVaultType.Image);
if (index != null)
{
return new ImageVault(rootPath, (VaultIndex)index);
return new ImageVault(rootPath, (VaultIndex)index, factory);
}
return null;
@@ -126,16 +128,17 @@ public class ImageVault : MediaVault
public class AudioVault : MediaVault
{
private AudioVault(string rootPath, VaultIndex index) : base(rootPath, index) { }
public static async Task<AudioVault?> FromAsync(string rootPath)
private AudioVault(string rootPath, VaultIndex index, IndexFactoryService? factoryService = null)
: base(rootPath, index, factoryService) { }
public static async Task<AudioVault?> FromAsync(string rootPath, IndexFactoryService? factoryService = null)
{
var factoryService = new IndexFactoryService();
var index = await factoryService.LoadOrCreateVaultIndexAsync(rootPath, MediaVaultType.Audio);
var factory = factoryService ?? new IndexFactoryService();
var index = await factory.LoadOrCreateVaultIndexAsync(rootPath, MediaVaultType.Audio);
if (index != null)
{
return new AudioVault(rootPath, (VaultIndex)index);
return new AudioVault(rootPath, (VaultIndex)index, factory);
}
return null;