Search post with categories and tags

This commit is contained in:
2025-08-08 21:40:48 +08:00
parent e7d14d4687
commit 5fd52e7b9e

View File

@@ -40,7 +40,9 @@ public class PostController(
[FromQuery] int offset = 0, [FromQuery] int offset = 0,
[FromQuery] int take = 20, [FromQuery] int take = 20,
[FromQuery(Name = "pub")] string? pubName = null, [FromQuery(Name = "pub")] string? pubName = null,
[FromQuery(Name = "type")] int? type = null [FromQuery(Name = "type")] int? type = null,
[FromQuery(Name = "categories")] List<string>? categories = null,
[FromQuery(Name = "tags")] List<string>? tags = null
) )
{ {
HttpContext.Items.TryGetValue("CurrentUser", out var currentUserValue); HttpContext.Items.TryGetValue("CurrentUser", out var currentUserValue);
@@ -58,11 +60,18 @@ public class PostController(
var publisher = pubName == null ? null : await db.Publishers.FirstOrDefaultAsync(p => p.Name == pubName); var publisher = pubName == null ? null : await db.Publishers.FirstOrDefaultAsync(p => p.Name == pubName);
var query = db.Posts.AsQueryable(); var query = db.Posts
.Include(e => e.Categories)
.Include(e => e.Tags)
.AsQueryable();
if (publisher != null) if (publisher != null)
query = query.Where(p => p.Publisher.Id == publisher.Id); query = query.Where(p => p.Publisher.Id == publisher.Id);
if (type != null) if (type != null)
query = query.Where(p => p.Type == (PostType)type); query = query.Where(p => p.Type == (PostType)type);
if (categories is { Count: > 0 })
query = query.Where(p => p.Categories.Any(c => categories.Contains(c.Slug)));
if (tags is { Count: > 0 })
query = query.Where(p => p.Tags.Any(c => tags.Contains(c.Slug)));
query = query query = query
.FilterWithVisibility(currentUser, userFriends, userPublishers, isListing: true); .FilterWithVisibility(currentUser, userFriends, userPublishers, isListing: true);
@@ -71,8 +80,6 @@ public class PostController(
var posts = await query var posts = await query
.Include(e => e.RepliedPost) .Include(e => e.RepliedPost)
.Include(e => e.ForwardedPost) .Include(e => e.ForwardedPost)
.Include(e => e.Categories)
.Include(e => e.Tags)
.Where(e => e.RepliedPostId == null) .Where(e => e.RepliedPostId == null)
.OrderByDescending(e => e.PublishedAt ?? e.CreatedAt) .OrderByDescending(e => e.PublishedAt ?? e.CreatedAt)
.Skip(offset) .Skip(offset)