AccountingNext/Schaad.Accounting.Db/Repositories/SubclassRepository.cs
Claudio Schaad 1c7ba7f416 PR D: per-scope repository cache
Add a Scoped RepositoryCache that memoizes deserialized XML lists,
keyed by absolute file path. Each XML file is loaded at most once per
SignalR circuit; Save invalidates the corresponding entry so
subsequent reads reload from disk.

BaseRepository gains a LoadList<T>(fileName) helper; each of the seven
repositories now defines Get*List() as a one-liner over that helper
and takes RepositoryCache via the constructor.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-07-02 20:52:24 +02:00

74 lines
No EOL
2.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Schaad.Accounting.Interfaces;
using Schaad.Accounting.Models;
namespace Schaad.Accounting.Repositories
{
public class SubclassRepository : BaseRepository, ISubclassRepository
{
private readonly Dictionary<int, string> classes = new Dictionary<int, string>();
private readonly string SUBCLASSES = "SubClasses.xml";
public SubclassRepository(ISettingsService settingsService, RepositoryCache cache)
: base(settingsService, cache)
{
EnsureFileExists(SUBCLASSES);
classes.Add(ClassIds.Activa, "Aktiven");
classes.Add(ClassIds.Passiva, "Passiven");
classes.Add(ClassIds.Income, "Einnahmen");
classes.Add(ClassIds.Expenses, "Ausgaben");
}
/// <summary>
/// Load subclasses
/// </summary>
public List<SubClass> GetSubClassList() => LoadList<SubClass>(SUBCLASSES);
/// <summary>
/// Save a booking text (insert/update)
/// </summary>
public void SaveSubClass(SubClass subClass)
{
var subclasses = GetSubClassList();
var existingSubClass = subclasses.FirstOrDefault(a => a.Id == subClass.Id);
if (existingSubClass == null)
{
existingSubClass = new SubClass();
subclasses.Add(existingSubClass);
subClass.Id = Guid.NewGuid().ToString();
}
subClass.Copy(existingSubClass);
Save(subclasses, SUBCLASSES);
}
/// <summary>
/// Get subclass
/// </summary>
public SubClass GetSubClass(string id)
{
var subclasses = GetSubClassList();
return subclasses.FirstOrDefault(t => t.Id == id);
}
public void DeleteSubClass(string id)
{
var subclasses = GetSubClassList();
subclasses.RemoveAll(t => t.Id == id);
Save(subclasses, SUBCLASSES);
}
public Dictionary<int, string> GetClasses()
{
return classes;
}
public string GetClass(int classId)
{
return classes[classId];
}
}
}