From a57ae840fff21ec81687ee702c0ae30d59a00365 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Fri, 8 Aug 2025 15:23:56 +0800 Subject: [PATCH] :sparkles: Post category controller --- .../Post/PostCategoryController.cs | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 DysonNetwork.Sphere/Post/PostCategoryController.cs diff --git a/DysonNetwork.Sphere/Post/PostCategoryController.cs b/DysonNetwork.Sphere/Post/PostCategoryController.cs new file mode 100644 index 0000000..092b2ea --- /dev/null +++ b/DysonNetwork.Sphere/Post/PostCategoryController.cs @@ -0,0 +1,72 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +namespace DysonNetwork.Sphere.Post; + +[ApiController] +[Route("/api/posts")] +public class PostCategoryController(AppDatabase db) : ControllerBase +{ + [HttpGet("categories")] + public async Task>> ListCategories( + [FromQuery] string? query = null, + [FromQuery] int offset = 0, + [FromQuery] int take = 20 + ) + { + var categoriesQuery = db.PostCategories + .OrderBy(e => e.Name) + .AsQueryable(); + if (!string.IsNullOrEmpty(query)) + categoriesQuery = categoriesQuery + .Where(e => EF.Functions.ILike(e.Slug, $"%{query}%")); + var totalCount = await categoriesQuery.CountAsync(); + Response.Headers.Append("X-Total", totalCount.ToString()); + var categories = await categoriesQuery + .Skip(offset) + .Take(take) + .ToListAsync(); + return Ok(categories); + } + + [HttpGet("tags")] + public async Task>> ListTags( + [FromQuery] string? query = null, + [FromQuery] int offset = 0, + [FromQuery] int take = 20 + ) + { + var tagsQuery = db.PostTags + .OrderBy(e => e.Name) + .AsQueryable(); + if (!string.IsNullOrEmpty(query)) + tagsQuery = tagsQuery + .Where(e => EF.Functions.ILike(e.Slug, $"%{query}%")); + var totalCount = await tagsQuery.CountAsync(); + Response.Headers.Append("X-Total", totalCount.ToString()); + var tags = await tagsQuery + .Skip(offset) + .Take(take) + .ToListAsync(); + + return Ok(tags); + } + + [HttpGet("categories/{slug}")] + public async Task> GetCategory(string slug) + { + var category = await db.PostCategories.FirstOrDefaultAsync(e => e.Slug == slug); + if (category is null) + return NotFound(); + return Ok(category); + } + + [HttpGet("tags/{slug}")] + public async Task> GetTag(string slug) + { + var tag = await db.PostTags.FirstOrDefaultAsync(e => e.Slug == slug); + if (tag is null) + return NotFound(); + return Ok(tag); + } +} \ No newline at end of file