✨ Filter on activities
This commit is contained in:
@ -22,8 +22,11 @@ public class ActivityController(
|
||||
/// Besides, when users are logged in, it will also mix the other kinds of data and who're plying to them.
|
||||
/// </summary>
|
||||
[HttpGet]
|
||||
public async Task<ActionResult<List<Activity>>> ListActivities([FromQuery] string? cursor,
|
||||
[FromQuery] int take = 20)
|
||||
public async Task<ActionResult<List<Activity>>> ListActivities(
|
||||
[FromQuery] string? cursor,
|
||||
[FromQuery] string? filter,
|
||||
[FromQuery] int take = 20
|
||||
)
|
||||
{
|
||||
Instant? cursorTimestamp = null;
|
||||
if (!string.IsNullOrEmpty(cursor))
|
||||
@ -42,6 +45,6 @@ public class ActivityController(
|
||||
HttpContext.Items.TryGetValue("CurrentUser", out var currentUserValue);
|
||||
return currentUserValue is not Account.Account currentUser
|
||||
? Ok(await acts.GetActivitiesForAnyone(take, cursorTimestamp))
|
||||
: Ok(await acts.GetActivities(take, cursorTimestamp, currentUser));
|
||||
: Ok(await acts.GetActivities(take, cursorTimestamp, currentUser, filter));
|
||||
}
|
||||
}
|
@ -42,26 +42,57 @@ public class ActivityService(AppDatabase db, PublisherService pub, RelationshipS
|
||||
return activities;
|
||||
}
|
||||
|
||||
public async Task<List<Activity>> GetActivities(int take, Instant? cursor, Account.Account currentUser)
|
||||
public async Task<List<Activity>> GetActivities(
|
||||
int take,
|
||||
Instant? cursor,
|
||||
Account.Account currentUser,
|
||||
string? filter = null
|
||||
)
|
||||
{
|
||||
var activities = new List<Activity>();
|
||||
var userFriends = await rels.ListAccountFriends(currentUser);
|
||||
var userPublishers = await pub.GetUserPublishers(currentUser.Id);
|
||||
|
||||
var publishersId = userPublishers.Select(e => e.Id).ToList();
|
||||
|
||||
// Crunching data
|
||||
var posts = await db.Posts
|
||||
|
||||
// Get publishers based on filter
|
||||
List<Publisher.Publisher>? filteredPublishers = null;
|
||||
switch (filter)
|
||||
{
|
||||
case "subscriptions":
|
||||
filteredPublishers = await pub.GetSubscribedPublishers(currentUser.Id);
|
||||
break;
|
||||
case "friends":
|
||||
{
|
||||
filteredPublishers = (await pub.GetUserPublishersBatch(userFriends))
|
||||
.SelectMany(x => x.Value)
|
||||
.DistinctBy(x => x.Id)
|
||||
.ToList();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
var filteredPublishersId = filteredPublishers?.Select(e => e.Id).ToList();
|
||||
|
||||
// Build the query based on the filter
|
||||
var postsQuery = db.Posts
|
||||
.Include(e => e.RepliedPost)
|
||||
.Include(e => e.ForwardedPost)
|
||||
.Include(e => e.Categories)
|
||||
.Include(e => e.Tags)
|
||||
.Where(e => e.RepliedPostId == null || publishersId.Contains(e.RepliedPost!.PublisherId))
|
||||
.Where(p => cursor == null || p.PublishedAt < cursor)
|
||||
.OrderByDescending(p => p.PublishedAt)
|
||||
.FilterWithVisibility(currentUser, userFriends, userPublishers, isListing: true)
|
||||
.AsQueryable();
|
||||
|
||||
if (filteredPublishersId is not null)
|
||||
postsQuery = postsQuery.Where(p => filteredPublishersId.Contains(p.PublisherId));
|
||||
|
||||
// Complete the query with visibility filtering and execute
|
||||
var posts = await postsQuery
|
||||
.FilterWithVisibility(currentUser, userFriends, filter is null ? userPublishers : [], isListing: true)
|
||||
.Take(take)
|
||||
.ToListAsync();
|
||||
|
||||
posts = await ps.LoadPostInfo(posts, currentUser, true);
|
||||
|
||||
var postsId = posts.Select(e => e.Id).ToList();
|
||||
|
Reference in New Issue
Block a user