All checks were successful
continuous-integration/drone/push Build is passing
148 lines
5.3 KiB
C#
148 lines
5.3 KiB
C#
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<LinkType>(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<LinkType>(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");
|
|
}
|
|
}
|