using System.Xml.Linq;
using Dpz.Core.Infrastructure.Entity;
using Microsoft.AspNetCore.DataProtection.Repositories;
using Microsoft.Extensions.DependencyInjection;
namespace Dpz.Core.Service;
public class XmlRepositoryService : IXmlRepository
{
private readonly IServiceScopeFactory _factory;
private readonly string _key;
public XmlRepositoryService(IServiceScopeFactory factory, string key)
{
_factory = factory;
_key = key;
}
private class DpzXmlRepository : IBaseEntity
{
public string Id { get; init; } = "";
public List<string> XmlRepository { get; init; } = new();
}
public IReadOnlyCollection<XElement> GetAllElements()
{
using var scope = _factory.CreateScope();
var repository = scope.ServiceProvider.GetRequiredService<IRepository<DpzXmlRepository>>();
var xmlRepository = repository.Collection.Find(x => x.Id == _key).FirstOrDefault();
return (xmlRepository?.XmlRepository.Select(XElement.Parse).ToList() ?? new List<XElement>()).AsReadOnly();
}
public void StoreElement(XElement element, string friendlyName)
{
using var scope = _factory.CreateScope();
var repository = scope.ServiceProvider.GetRequiredService<IRepository<DpzXmlRepository>>();
var xmlRepository = repository.Collection.Find(x => x.Id == _key).FirstOrDefault();
if (xmlRepository is null)
{
repository.Collection.InsertOne(new()
{
Id = _key,
XmlRepository = new()
{
element.ToString(SaveOptions.DisableFormatting)
}
});
return;
}
var list = xmlRepository.XmlRepository;
list.Add(element.ToString(SaveOptions.DisableFormatting));
var update = Builders<DpzXmlRepository>.Update.Set(x => x.XmlRepository, list);
repository.Collection.UpdateOne(x => x.Id == _key, update);
}
}