✨ Friends overview online filter
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user