using Microsoft.AspNetCore.DataProtection.Repositories; using StackExchange.Redis; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace Ablera.Serdica.Authentication.Utilities; // Move this to ...Authentication.Redis or something public sealed class RedisAndFileSystemXmlRepository : IXmlRepository { private readonly IDatabase _db; private readonly string _prefix; public RedisAndFileSystemXmlRepository(IDatabase db, string prefix) { _db = db; _prefix = prefix; } public IReadOnlyCollection GetAllElements() { var keys = _db.SetMembers(_prefix); var list = new List(); foreach (var redisValue in keys) { var xml = redisValue.ToString(); try { list.Add(XElement.Parse(xml)); } catch { /* ignore corrupted entry */ } } return list; } public void StoreElement(XElement element, string friendlyName) { var xml = element.ToString(SaveOptions.DisableFormatting); /* 1) write to Redis (set-add = idempotent) */ _db.SetAdd(_prefix, xml); } }