Redoing of groupsgetall

This commit is contained in:
CakeAndBanana
2025-09-25 04:28:52 +02:00
parent 3a4a934d09
commit bf380688c8

View File

@@ -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")]