using BotSharp.Abstraction.Loggers.Models; using BotSharp.Abstraction.Users.Models; namespace BotSharp.Core.Loggers.Services; public partial class LoggerService { public async Task> GetInstructionLogs(InstructLogFilter filter) { if (filter == null) { filter = InstructLogFilter.Empty(); } var userService = _services.GetRequiredService(); var (isAdmin, user) = await userService.IsAdminUser(_user.Id); if (!isAdmin && user?.Id == null) return new(); filter.UserIds = !isAdmin && user?.Id != null ? [user.Id] : null; var agents = new List(); var users = new List(); var db = _services.GetRequiredService(); var logs = db.GetInstructionLogs(filter); var agentIds = logs.Items.Where(x => !string.IsNullOrEmpty(x.AgentId)).Select(x => x.AgentId).ToList(); var userIds = logs.Items.Where(x => !string.IsNullOrEmpty(x.UserId)).Select(x => x.UserId).ToList(); agents = db.GetAgents(new AgentFilter { AgentIds = agentIds, Pager = new Pagination { Size = filter.Size } }); if (isAdmin) { users = db.GetUserByIds(userIds); } var items = logs.Items.Select(x => { x.AgentName = !string.IsNullOrEmpty(x.AgentId) ? agents.FirstOrDefault(a => a.Id == x.AgentId)?.Name : null; if (!isAdmin) { x.UserName = user != null ? $"{user.FirstName} {user.LastName}" : null; } else { var found = !string.IsNullOrEmpty(x.UserId) ? users.FirstOrDefault(u => u.Id == x.UserId) : null; x.UserName = found != null ? $"{found.FirstName} {found.LastName}" : null; } return x; }).ToList(); return new PagedItems { Items = items, Count = logs.Count }; } public async Task> GetInstructionLogSearchKeys(InstructLogKeysFilter filter) { if (filter == null) { filter = InstructLogKeysFilter.Empty(); } var keys = new List(); if (!filter.PreLoad && string.IsNullOrWhiteSpace(filter.Query)) { return keys; } var userService = _services.GetRequiredService(); var db = _services.GetRequiredService(); var (isAdmin, user) = await userService.IsAdminUser(_user.Id); filter.UserIds = !isAdmin && user?.Id != null ? [user.Id] : null; keys = db.GetInstructionLogSearchKeys(filter); keys = filter.PreLoad ? keys : keys.Where(x => x.Contains(filter.Query ?? string.Empty, StringComparison.OrdinalIgnoreCase)).ToList(); return keys.OrderBy(x => x).Take(filter.KeyLimit).ToList(); } }