From c90dfa1ac072ec7111595b6bce9dc11919a29c71 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Sat, 9 Jul 2022 15:04:46 +0200 Subject: [PATCH] Added the selection processor for adding & loading data --- I18N Commander/Processor/SectionProcessor.cs | 74 ++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 I18N Commander/Processor/SectionProcessor.cs diff --git a/I18N Commander/Processor/SectionProcessor.cs b/I18N Commander/Processor/SectionProcessor.cs new file mode 100644 index 0000000..dfd064e --- /dev/null +++ b/I18N Commander/Processor/SectionProcessor.cs @@ -0,0 +1,74 @@ +using DataModel.Database; +using DataModel.Database.Common; +using Microsoft.EntityFrameworkCore; + +namespace Processor; + +public static class SectionProcessor +{ + /// + /// Load one layer of the tree by using the specified depth: + /// + public static IAsyncEnumerable
LoadLayer(DataContext db, int depth) + { + return db.Sections.Where(n => n.Depth == depth).OrderBy(n => n.DataKey).AsAsyncEnumerable(); + } + + /// + /// Determine how deep the tree is. + /// + public static async ValueTask GetDepth(DataContext db) + { + if(!await db.Sections.AnyAsync()) + { + return 0; + } + + return await db.Sections.MaxAsync(s => s.Depth); + } + + /// + /// Compute the new sections key and its depth, then store the section in the database. + /// + public static async Task
AddSection(DataContext db, string text, string? parentKey) + { + // Remove any whitespaces from the section name, regardless of how many e.g. spaces the user typed: + var key = string.Join('_', text.Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)).ToUpperInvariant(); + + // In the case, when the user adds a section to the root, handle the insert differently: + if (string.IsNullOrEmpty(parentKey)) + { + var rootSection = new Section + { + Depth = 0, + DataKey = key, + Parent = null, + Name = text.Trim(), + TextElements = new(), + }; + + db.Sections.Add(rootSection); + await db.SaveChangesAsync(); + return rootSection; + } + + // Read the parent from the database: + var parent = await db.Sections.FirstOrDefaultAsync(n => n.DataKey == parentKey); + if (parent is null) + throw new ArgumentException($"The section's parent with key {parentKey} does not exist in the database."); + + // Add the new section to the database: + var section = new Section + { + Name = text.Trim(), + DataKey = key, + Parent = parent, + TextElements = new(), + Depth = parent.Depth + 1, + }; + + db.Sections.Add(section); + await db.SaveChangesAsync(); + return section; + } +} \ No newline at end of file