using DataModel.Database; using DataModel.Database.Common; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; namespace Processor; public static class TextElementProcessor { // Load all text elements for one particular section: public static async Task> GetTextElements(Section section) { await using var db = ProcessorMeta.ServiceProvider.GetRequiredService(); return await db.TextElements.Where(n => n.Section == section).OrderBy(n => n.Name).ThenBy(n => n.Id).ToListAsync(); } // Load one text element by id: public static async Task LoadTextElement(int id) { await using var db = ProcessorMeta.ServiceProvider.GetRequiredService(); return await db.TextElements.FirstAsync(n => n.Id == id); } // Adds a new text element: public static async Task> AddTextElement(string? currentSectionKey, string elementName) { await using var db = ProcessorMeta.ServiceProvider.GetRequiredService(); if(string.IsNullOrWhiteSpace(currentSectionKey)) throw new ArgumentOutOfRangeException(nameof(currentSectionKey)); var currentSection = await db.Sections.FirstOrDefaultAsync(n => n.DataKey == currentSectionKey); if (currentSection is null) throw new ArgumentOutOfRangeException(nameof(currentSectionKey)); // Generate a code: var code = await Utils.GenerateCode(elementName, db.TextElements, (n, code) => n.Section == currentSection && n.Code == code); var textElement = new TextElement { Name = elementName, Code = code, Section = currentSection, }; // Add the new element to the database: await db.TextElements.AddAsync(textElement); try { // Save the changes: await db.SaveChangesAsync(); return new ProcessorResult(textElement); } catch (DbUpdateException updateException) { return updateException.ToProcessorResult(); } } // Renames a text element: public static async Task> RenameTextElement(int id, string newName) { await using var db = ProcessorMeta.ServiceProvider.GetRequiredService(); var textElement = await db.TextElements.FirstAsync(n => n.Id == id); if (textElement is null) throw new ArgumentOutOfRangeException(nameof(id)); // Get the corresponding section: var section = (await db.TextElements.FirstAsync(n => n.Id == id)).Section; // Generate a code: var code = await Utils.GenerateCode(newName, db.TextElements, (n, code) => n.Section == section && n.Code == code); textElement.Name = newName; textElement.Code = code; // Save the changes: try { await db.SaveChangesAsync(); return new ProcessorResult(textElement); } catch (DbUpdateException updateException) { return updateException.ToProcessorResult(); } } }