Friends overview online filter

This commit is contained in:
2025-11-16 13:31:07 +08:00
parent 076bf347c8
commit a0ac3b5820

View File

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