using CampusErrand.Data; using CampusErrand.Models; using CampusErrand.Models.Dtos; using CampusErrand.Helpers; using Microsoft.EntityFrameworkCore; namespace CampusErrand.Endpoints; public static class BannerEndpoints { public static void MapBannerEndpoints(this WebApplication app) { // 前端获取 Banner 列表(仅启用+按排序权重排列) app.MapGet("/api/banners", async (AppDbContext db) => { var banners = await db.Banners .Where(b => b.IsEnabled) .OrderBy(b => b.SortOrder) .Select(b => new BannerResponse { Id = b.Id, ImageUrl = b.ImageUrl, LinkType = b.LinkType.ToString(), LinkUrl = b.LinkUrl, SortOrder = b.SortOrder, IsEnabled = b.IsEnabled, CreatedAt = b.CreatedAt }) .ToListAsync(); return Results.Ok(banners); }); // 管理端获取全部 Banner 列表 app.MapGet("/api/admin/banners", async (AppDbContext db) => { var banners = await db.Banners .OrderBy(b => b.SortOrder) .Select(b => new BannerResponse { Id = b.Id, ImageUrl = b.ImageUrl, LinkType = b.LinkType.ToString(), LinkUrl = b.LinkUrl, SortOrder = b.SortOrder, IsEnabled = b.IsEnabled, CreatedAt = b.CreatedAt }) .ToListAsync(); return Results.Ok(banners); }).RequireAuthorization("AdminOnly"); // 创建 Banner app.MapPost("/api/admin/banners", async (BannerRequest request, AppDbContext db) => { // 校验 var errors = BusinessHelpers.ValidateBannerRequest(request); if (errors.Count > 0) { return Results.BadRequest(new { code = 400, message = "校验失败", errors }); } if (!Enum.TryParse(request.LinkType, true, out var linkType) || !Enum.IsDefined(linkType)) { return Results.BadRequest(new { code = 400, message = "校验失败", errors = new[] { new { field = "linkType", message = "链接类型不合法" } } }); } var banner = new Banner { ImageUrl = request.ImageUrl, LinkType = linkType, LinkUrl = request.LinkUrl, SortOrder = request.SortOrder, IsEnabled = request.IsEnabled, CreatedAt = DateTime.UtcNow }; db.Banners.Add(banner); await db.SaveChangesAsync(); return Results.Created($"/api/admin/banners/{banner.Id}", new BannerResponse { Id = banner.Id, ImageUrl = banner.ImageUrl, LinkType = banner.LinkType.ToString(), LinkUrl = banner.LinkUrl, SortOrder = banner.SortOrder, IsEnabled = banner.IsEnabled, CreatedAt = banner.CreatedAt }); }).RequireAuthorization("AdminOnly"); // 更新 Banner app.MapPut("/api/admin/banners/{id}", async (int id, BannerRequest request, AppDbContext db) => { var banner = await db.Banners.FindAsync(id); if (banner == null) { return Results.NotFound(new { code = 404, message = "Banner 不存在" }); } var errors = BusinessHelpers.ValidateBannerRequest(request); if (errors.Count > 0) { return Results.BadRequest(new { code = 400, message = "校验失败", errors }); } if (!Enum.TryParse(request.LinkType, true, out var linkType) || !Enum.IsDefined(linkType)) { return Results.BadRequest(new { code = 400, message = "校验失败", errors = new[] { new { field = "linkType", message = "链接类型不合法" } } }); } banner.ImageUrl = request.ImageUrl; banner.LinkType = linkType; banner.LinkUrl = request.LinkUrl; banner.SortOrder = request.SortOrder; banner.IsEnabled = request.IsEnabled; await db.SaveChangesAsync(); return Results.Ok(new BannerResponse { Id = banner.Id, ImageUrl = banner.ImageUrl, LinkType = banner.LinkType.ToString(), LinkUrl = banner.LinkUrl, SortOrder = banner.SortOrder, IsEnabled = banner.IsEnabled, CreatedAt = banner.CreatedAt }); }).RequireAuthorization("AdminOnly"); // 删除 Banner app.MapDelete("/api/admin/banners/{id}", async (int id, AppDbContext db) => { var banner = await db.Banners.FindAsync(id); if (banner == null) { return Results.NotFound(new { code = 404, message = "Banner 不存在" }); } db.Banners.Remove(banner); await db.SaveChangesAsync(); return Results.NoContent(); }).RequireAuthorization("AdminOnly"); } }