From e01883fd4b71a676ba6369a331ef44cc00e0f71c Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Fri, 9 Feb 2024 10:35:58 +0100 Subject: [PATCH] add prune to groups update submodule allow moderator to check for inactive user count allow moderators to prune do not allow to prune owner --- MareAPI | 2 +- .../Hubs/MareHub.Groups.cs | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/MareAPI b/MareAPI index 126b54e..1163f38 160000 --- a/MareAPI +++ b/MareAPI @@ -1 +1 @@ -Subproject commit 126b54e552e53dd6615afe0f2725040c322e0387 +Subproject commit 1163f38f709681898d0c4fa71ebd1639e5d49518 diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs index dd3cd1f..8cad198 100644 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs @@ -410,6 +410,37 @@ public partial class MareHub await UserLeaveGroup(dto, UserUID).ConfigureAwait(false); } + [Authorize(Policy = "Identified")] + public async Task GroupPrune(GroupDto dto, int days, bool execute) + { + _logger.LogCallInfo(MareHubLogger.Args(dto, days, execute)); + + var (hasRights, group) = await TryValidateGroupModeratorOrOwner(dto.Group.GID).ConfigureAwait(false); + if (!hasRights) return -1; + + var allGroupUsers = await _dbContext.GroupPairs.Include(p => p.GroupUser).Include(p => p.Group) + .Where(g => g.GroupGID == dto.Group.GID) + .ToListAsync().ConfigureAwait(false); + var usersToPrune = allGroupUsers.Where(p => !p.IsPinned && !p.IsModerator + && p.GroupUserUID != UserUID + && p.Group.OwnerUID != p.GroupUserUID + && p.GroupUser.LastLoggedIn.AddDays(days) < DateTime.UtcNow); + + if (!execute) return usersToPrune.Count(); + + _dbContext.GroupPairs.RemoveRange(usersToPrune); + + foreach (var pair in usersToPrune) + { + await Clients.Users(allGroupUsers.Where(p => !usersToPrune.Contains(p)).Select(g => g.GroupUserUID)) + .Client_GroupPairLeft(new GroupPairDto(dto.Group, pair.GroupUser.ToUserData())).ConfigureAwait(false); + } + + await _dbContext.SaveChangesAsync().ConfigureAwait(false); + + return usersToPrune.Count(); + } + [Authorize(Policy = "Identified")] public async Task GroupRemoveUser(GroupPairDto dto) {