diff --git a/DysonNetwork.Pass/Account/FriendsController.cs b/DysonNetwork.Pass/Account/FriendsController.cs index ff5f3f0..6e7e9ef 100644 --- a/DysonNetwork.Pass/Account/FriendsController.cs +++ b/DysonNetwork.Pass/Account/FriendsController.cs @@ -18,43 +18,38 @@ public class FriendsController(AppDatabase db, RelationshipService rels, Account [HttpGet("overview")] [Authorize] - public async Task>> GetOverview() + public async Task>> GetOverview([FromQuery] bool includeOffline = false) { if (HttpContext.Items["CurrentUser"] is not SnAccount currentUser) return Unauthorized(); var friendIds = await rels.ListAccountFriends(currentUser); - + // Fetch data in parallel using batch methods for better performance var accountsTask = db.Accounts .Where(a => friendIds.Contains(a.Id)) .Include(a => a.Profile) .ToListAsync(); - + var statusesTask = events.GetStatuses(friendIds); var activitiesTask = events.GetActiveActivitiesBatch(friendIds); - + // Wait for all data to be fetched await Task.WhenAll(accountsTask, statusesTask, activitiesTask); - + var accounts = accountsTask.Result; var statuses = statusesTask.Result; var activities = activitiesTask.Result; - - var result = new List(); - - foreach (var account in accounts) - { - var status = statuses.GetValueOrDefault(account.Id); - var accountActivities = activities.GetValueOrDefault(account.Id, []); - - result.Add(new FriendOverviewItem + + var result = (from account in accounts + let status = statuses.GetValueOrDefault(account.Id) + where includeOffline || status is { IsOnline: true } + let accountActivities = activities.GetValueOrDefault(account.Id, new List()) + select new FriendOverviewItem { - Account = account, - Status = status ?? new SnAccountStatus { AccountId = account.Id }, + Account = account, Status = status ?? new SnAccountStatus { AccountId = account.Id }, Activities = accountActivities - }); - } - + }).ToList(); + return Ok(result); } -} +} \ No newline at end of file