using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; using YaeBlog.Core.Abstractions; using YaeBlog.Core.Models; namespace YaeBlog.Core.Services; public class EssayContentService : IEssayContentService { private readonly ConcurrentDictionary _essays = new(); private readonly Dictionary> _tags = []; private readonly ConcurrentDictionary _headlines = new(); public bool TryAdd(BlogEssay essay) => _essays.TryAdd(essay.FileName, essay); public bool TryAddHeadline(string filename, BlogHeadline headline) => _headlines.TryAdd(filename, headline); public IReadOnlyDictionary Essays => _essays; public IReadOnlyDictionary> Tags => _tags; public IReadOnlyDictionary Headlines => _headlines; public void RefreshTags() { _tags.Clear(); foreach (BlogEssay essay in _essays.Values) { foreach (EssayTag essayTag in essay.Tags.Select(tag => new EssayTag(tag))) { if (_tags.TryGetValue(essayTag, out List? essays)) { essays.Add(essay); } else { _tags.Add(essayTag, [essay]); } } } } public bool SearchByUrlEncodedTag(string tag, [NotNullWhen(true)] out List? result) { result = (from item in _tags where item.Key.UrlEncodedTagName == tag select item.Value).FirstOrDefault(); return result is not null; } public void Clear() { _essays.Clear(); _tags.Clear(); _headlines.Clear(); } }