diff --git a/LightlessSyncServer/LightlessSyncServer/Hubs/MareHub.Groups.cs b/LightlessSyncServer/LightlessSyncServer/Hubs/MareHub.Groups.cs index c7a4741..7c1fc0a 100644 --- a/LightlessSyncServer/LightlessSyncServer/Hubs/MareHub.Groups.cs +++ b/LightlessSyncServer/LightlessSyncServer/Hubs/MareHub.Groups.cs @@ -192,6 +192,7 @@ public partial class LightlessHub GroupUserUID = UserUID, IsPinned = true, JoinedGroupOn = currentTime, + FromFinder = false, }; GroupPairPreferredPermission initialPrefPermissions = new() @@ -804,17 +805,42 @@ public partial class LightlessHub { _logger.LogCallInfo(); - var groups = await DbContext.GroupPairs.Include(g => g.Group).Include(g => g.Group.Owner).Where(g => g.GroupUserUID == UserUID).AsNoTracking().ToListAsync(cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false); - var preferredPermissions = (await DbContext.GroupPairPreferredPermissions.Where(u => u.UserUID == UserUID).ToListAsync(cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false)) - .Where(u => groups.Exists(k => string.Equals(k.GroupGID, u.GroupGID, StringComparison.Ordinal))) - .ToDictionary(u => groups.First(f => string.Equals(f.GroupGID, u.GroupGID, StringComparison.Ordinal)), u => u); - var groupInfos = await DbContext.GroupPairs.Where(u => groups.Select(g => g.GroupGID).Contains(u.GroupGID) && (u.IsPinned || u.IsModerator)) - .ToListAsync(cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false); - - return preferredPermissions.Select(g => new GroupFullInfoDto(g.Key.Group.ToGroupData(), g.Key.Group.Owner.ToUserData(), - g.Key.Group.ToEnum(), g.Value.ToEnum(), g.Key.ToEnum(), - groupInfos.Where(i => string.Equals(i.GroupGID, g.Key.GroupGID, StringComparison.Ordinal)) - .ToDictionary(i => i.GroupUserUID, i => i.ToEnum(), StringComparer.Ordinal))).ToList(); + var ct = _contextAccessor.HttpContext.RequestAborted; + + var result = await ( + from gp in DbContext.GroupPairs + .Include(gp => gp.Group) + .ThenInclude(g => g.Owner) + join pp in DbContext.GroupPairPreferredPermissions + on new { gp.GroupGID, UserUID } equals new { pp.GroupGID, pp.UserUID } + where gp.GroupUserUID == UserUID + select new + { + GroupPair = gp, + PreferredPermission = pp, + GroupInfos = DbContext.GroupPairs + .Where(x => x.GroupGID == gp.GroupGID && (x.IsPinned || x.IsModerator)) + .Select(x => new { x.GroupUserUID, EnumValue = x.ToEnum() }) + .ToList() // forces subquery per row + }) + .AsNoTracking() + .ToListAsync(ct) + .ConfigureAwait(false); + + return [.. result.Select(r => + { + var groupInfoDict = r.GroupInfos + .ToDictionary(x => x.GroupUserUID, x => x.EnumValue, StringComparer.Ordinal); + + return new GroupFullInfoDto( + r.GroupPair.Group.ToGroupData(), + r.GroupPair.Group.Owner.ToUserData(), + r.GroupPair.Group.ToEnum(), + r.PreferredPermission.ToEnum(), + r.GroupPair.ToEnum(), + groupInfoDict + ); + })]; } [Authorize(Policy = "Identified")]