using HermesSocketServer.Models; using ILogger = Serilog.ILogger; namespace HermesSocketServer.Requests { public class DeleteGroup : IRequest { public string Name => "delete_group"; public string[] RequiredKeys => ["id"]; private ILogger _logger; public DeleteGroup(ILogger logger) { _logger = logger; } public Task Grant(Channel channel, IDictionary data) { var groupIdString = data["id"].ToString()!; var groupId = new Guid(groupIdString); var result = channel.Groups.Remove(groupIdString); if (result) { if (channel.Groups.Chatters.TryGetValue(groupId.ToString(), out var chatters)) { var filteredChatters = chatters.Get().Values; foreach (var chatter in filteredChatters) { var res = chatters.Remove(chatter.ChatterId.ToString(), fromCascade: true); if (!res) _logger.Warning($"Failed to delete group chatter by id from cascade [group chatter id: {chatter.ChatterId}]"); } } var permissions = channel.GroupPermissions.Get().Values .Where(p => p.GroupId == groupId); foreach (var permission in permissions) { var res = channel.GroupPermissions.Remove(permission.Id, fromCascade: true); if (!res) _logger.Warning($"Failed to delete group permission by id from cascade [group permission id: {permission.Id}]"); } var policies = channel.Policies.Get().Values .Where(c => c.GroupId == groupId).ToArray(); foreach (var policy in policies) { var res = channel.Policies.Remove(policy.Id.ToString(), fromCascade: true); if (!res) _logger.Warning($"Failed to delete group policy by id from cascade [group policy id: {policy.Id}]"); } if (!channel.Groups.Chatters.Remove(groupIdString)) _logger.Warning($"Failed to delete group chatters from inner store [group id: {groupId}]"); _logger.Information($"Deleted a group by id [group id: {groupId}]"); return Task.FromResult(RequestResult.Successful(null)); } _logger.Warning($"Group Id does not exist [group id: {groupId}]"); return Task.FromResult(RequestResult.Failed("Something went wrong when updating the cache.")); } } }