using Data.Models; using Data.Models.Interfaces; using Microsoft.Extensions.Options; using System.Text.Json; namespace Data; public class BlogApiJsonDirectAccess : IBlogApi { BlogApiJsonDirectAccessSetting _settings; public BlogApiJsonDirectAccess(IOptions option) { _settings = option.Value; if (!Directory.Exists(_settings.DataPath)) { Directory.CreateDirectory(_settings.DataPath); } if (!Directory.Exists($@"{_settings.DataPath}\{_settings.BlogPostsFolder}")) { Directory.CreateDirectory($@"{_settings.DataPath}\{_settings.BlogPostsFolder}"); } if (!Directory.Exists($@"{_settings.DataPath}\{_settings.CategoriesFolder}")) { Directory.CreateDirectory($@"{_settings.DataPath}\{_settings.CategoriesFolder}"); } if (!Directory.Exists($@"{_settings.DataPath}\{_settings.TagsFolder}")) { Directory.CreateDirectory($@"{_settings.DataPath}\{_settings.TagsFolder}"); } } private List? _blogPosts; private List? _categories; private List? _tags; private void Load(ref List? list, string folder) { if (list == null) { list = new(); var fullpath = $@"{_settings.DataPath}\{folder}"; foreach (var f in Directory.GetFiles(fullpath)) { var json = File.ReadAllText(f); var bp = JsonSerializer.Deserialize(json); if (bp != null) { list.Add(bp); } } } } public async Task SaveBlogPostAsync(BlogPost item) { if (item.Id == null) { item.Id = Guid.NewGuid().ToString(); } await SaveAsync(_blogPosts, _settings.BlogPostsFolder, $"{item.Id}.json", item); return item; } public async Task SaveCategoryAsync(Category item) { if (item.Id == null) { item.Id = Guid.NewGuid().ToString(); } await SaveAsync(_categories, _settings.CategoriesFolder, $"{item.Id}.json", item); return item; } public Task DeleteBlogPostAsync(string id) { DeleteAsync(_blogPosts, _settings.BlogPostsFolder, id); if (_blogPosts != null) { var item = _blogPosts.FirstOrDefault(b => b.Id == id); if (item != null) { _blogPosts.Remove(item); } } return Task.CompletedTask; } public Task DeleteCategoryAsync(string id) { DeleteAsync(_categories, _settings.CategoriesFolder, id); if (_categories != null) { var item = _categories.FirstOrDefault(b => b.Id == id); if (item != null) { _categories.Remove(item); } } return Task.CompletedTask; } public Task InvalidateCacheAsync() { _blogPosts = null; _tags = null; _categories = null; return Task.CompletedTask; } public Task DeleteTagAsync(string id) { DeleteAsync(_tags, _settings.TagsFolder, id); if (_tags != null) { var item = _tags.FirstOrDefault(b => b.Id == id); if (item != null) { _tags.Remove(item); } } return Task.CompletedTask; } public async Task?> GetTagsAsync() { await LoadTagsAsync(); return _tags ?? new(); } public async Task GetTagAsync(string id) { await LoadTagsAsync(); if (_tags == null) throw new Exception("Tags not found"); return _tags.First(b => b.Id == id); } public async Task SaveTagAsync(Tag item) { if (item.Id == null) { item.Id = Guid.NewGuid().ToString(); } await SaveAsync(_tags, _settings.TagsFolder, $"{item.Id}.json", item); return item; } public async Task?> GetCategoriesAsync() { await LoadCategoriesAsync(); return _categories ?? new(); } public async Task GetCategoryAsync(string id) { await LoadCategoriesAsync(); if (_categories == null) throw new Exception("Categories not found"); return _categories.First(b => b.Id == id); } public async Task?> GetBlogPostsAsync(int numberofposts, int startindex) { await LoadBlogPostsAsync(); return _blogPosts ?? new(); } public async Task GetBlogPostAsync(string id) { await LoadBlogPostsAsync(); if (_blogPosts == null) throw new Exception("Blog posts not found"); return _blogPosts.First(b => b.Id == id); } public async Task GetBlogPostCountAsync() { await LoadBlogPostsAsync(); if (_blogPosts == null) return 0; else return _blogPosts.Count(); } private async Task SaveAsync(List? list, string folder, string filename, T item) { var filepath = $@"{_settings.DataPath}\{folder}\{filename}"; await File.WriteAllTextAsync(filepath, JsonSerializer.Serialize(item)); if (list == null) { list = new(); } if (!list.Contains(item)) { list.Add(item); } } private void DeleteAsync(List? list, string folder, string id) { var filepath = $@"{_settings.DataPath}\{folder}\{id}.json"; try { File.Delete(filepath); } catch { } } private Task LoadBlogPostsAsync() { Load(ref _blogPosts, _settings.BlogPostsFolder); return Task.CompletedTask; } private Task LoadTagsAsync() { Load(ref _tags, _settings.TagsFolder); return Task.CompletedTask; } private Task LoadCategoriesAsync() { Load(ref _categories, _settings.CategoriesFolder); return Task.CompletedTask; } }