using System.ComponentModel; using System.Diagnostics; using System.Text; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using vassago.Models; using vassago.WebInterface.Models; namespace vassago.WebInterface.Controllers; public class ChannelsController() : Controller { public async Task Details(Guid id) { var allChannels = Rememberer.ChannelsOverview(); if(allChannels == null) return Problem("Entity set '_db.Channels' is null."); //"but adam", says the strawman, "why load *every* channel and walk your way up? surely there's a .Load command that works or something." //eh. I checked. Not really. You could make an SQL view that recurses its way up, meh idk how. You could just eagerly load *every* related object... //but that would take in all the messages. //realistically I expect this will have less than 1MB of total "channels", and several GB of total messages per (text) channel. var channel = allChannels.First(u => u.Id == id); var walker = channel; while(walker != null) { ViewData["breadcrumbs"] = $"{walker.DisplayName}/" + ViewData["breadcrumbs"]; walker = walker.ParentChannel; } var sb = new StringBuilder(); sb.Append('['); sb.Append($"{{text: \"{channel.SubChannels?.Count}\", nodes: ["); var first=true; foreach(var subChannel in channel.SubChannels) { if(!first) { sb.Append(','); } else { first = false; } sb.Append($"{{\"text\": \"{subChannel.DisplayName}\"}}"); } sb.Append("]}]"); ViewData.Add("channelsTree", sb.ToString()); return View( new Tuple( channel, channel.EffectivePermissions.LewdnessFilterLevel, channel.EffectivePermissions.MeannessFilterLevel )); } [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] public IActionResult Error() { return View(new ErrorPageViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); } }