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) {