Files
squad-rain-ops-mini/Apis/UserApi.cs

127 lines
5.9 KiB
C#

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using RainOpsMini.Services;
using RainOpsMini.Models;
using RainOpsMini;
using RainOpsMini.Helpers;
namespace RainOpsMini.Apis
{
public static class UserApi
{
public static void MapUserApis(this IEndpointRouteBuilder app)
{
// API: 获取用户列表
// 仅管理员可用
app.MapGet("/api/users", (HttpContext ctx) =>
{
if (!ctx.User.HasClaim("Permission", "users.view") && !ctx.User.HasClaim("Permission", "all") && ctx.User.FindFirst("IsSuperAdmin")?.Value != "true") return Results.Unauthorized();
return Results.Json(UserStorage.GetAll().Select(u => new { u.Id, u.Username, u.IsEnabled, u.Permissions, u.CreatedAt }));
});
// API: 创建新用户
// 添加新的子账号
app.MapPost("/api/users", (UserAccount user, HttpContext ctx) =>
{
if (!ctx.User.HasClaim("Permission", "users.add") && !ctx.User.HasClaim("Permission", "all") && ctx.User.FindFirst("IsSuperAdmin")?.Value != "true") return Results.Unauthorized();
if (string.IsNullOrWhiteSpace(user.Username) || string.IsNullOrWhiteSpace(user.Password)) return Results.BadRequest(new { error = "用户名和密码不能为空" });
if (UserStorage.GetByUsername(user.Username) != null || user.Username == Program.Config.WebUser)
{
return Results.BadRequest(new { error = "用户名已存在" });
}
UserStorage.Add(user);
return Results.Ok();
});
// API: 更新用户信息
// 修改用户的权限或状态
app.MapPut("/api/users/{id}", (string id, UserAccount user, HttpContext ctx) =>
{
if (!ctx.User.HasClaim("Permission", "users.edit") && !ctx.User.HasClaim("Permission", "all") && ctx.User.FindFirst("IsSuperAdmin")?.Value != "true") return Results.Unauthorized();
var existing = UserStorage.GetById(id);
if (existing == null) return Results.NotFound();
// 仅更新允许的字段
existing.Permissions = user.Permissions;
existing.IsEnabled = user.IsEnabled;
UserStorage.Update(existing);
return Results.Ok();
});
// API: 重置用户密码
// 强制修改指定用户的密码
app.MapPost("/api/users/{id}/reset-password", (string id, PasswordResetRequest req, HttpContext ctx) =>
{
if (!ctx.User.HasClaim("Permission", "users.edit") && !ctx.User.HasClaim("Permission", "all") && ctx.User.FindFirst("IsSuperAdmin")?.Value != "true") return Results.Unauthorized();
var existing = UserStorage.GetById(id);
if (existing == null) return Results.NotFound();
if (string.IsNullOrWhiteSpace(req.NewPassword)) return Results.BadRequest(new { error = "新密码不能为空" });
existing.Password = req.NewPassword;
UserStorage.Update(existing);
return Results.Ok();
});
// API: 删除用户
// 移除子账号
app.MapDelete("/api/users/{id}", (string id, HttpContext ctx) =>
{
if (!ctx.User.HasClaim("Permission", "users.delete") && !ctx.User.HasClaim("Permission", "all") && ctx.User.FindFirst("IsSuperAdmin")?.Value != "true") return Results.Unauthorized();
var existing = UserStorage.GetById(id);
if (existing == null) return Results.NotFound();
UserStorage.Delete(id);
return Results.Ok();
});
// API: 获取角色列表
// 返回系统预定义的角色
app.MapGet("/api/roles", (HttpContext ctx) =>
{
if (!ctx.User.HasClaim("Permission", "users.view") && !ctx.User.HasClaim("Permission", "all") && ctx.User.FindFirst("IsSuperAdmin")?.Value != "true") return Results.Unauthorized();
return Results.Json(RoleStorage.GetAll());
});
// API: 创建角色
app.MapPost("/api/roles", (Role role, HttpContext ctx) =>
{
if (!ctx.User.HasClaim("Permission", "users.add") && !ctx.User.HasClaim("Permission", "all") && ctx.User.FindFirst("IsSuperAdmin")?.Value != "true") return Results.Unauthorized();
if (string.IsNullOrWhiteSpace(role.Name)) return Results.BadRequest(new { error = "角色名称不能为空" });
RoleStorage.Add(role);
return Results.Ok();
});
// API: 更新角色
app.MapPut("/api/roles/{id}", (string id, Role role, HttpContext ctx) =>
{
if (!ctx.User.HasClaim("Permission", "users.edit") && !ctx.User.HasClaim("Permission", "all") && ctx.User.FindFirst("IsSuperAdmin")?.Value != "true") return Results.Unauthorized();
var existing = RoleStorage.GetById(id);
if (existing == null) return Results.NotFound();
role.Id = id; // Ensure ID matches
RoleStorage.Update(role);
return Results.Ok();
});
// API: 删除角色
app.MapDelete("/api/roles/{id}", (string id, HttpContext ctx) =>
{
if (!ctx.User.HasClaim("Permission", "users.delete") && !ctx.User.HasClaim("Permission", "all") && ctx.User.FindFirst("IsSuperAdmin")?.Value != "true") return Results.Unauthorized();
var existing = RoleStorage.GetById(id);
if (existing == null) return Results.NotFound();
RoleStorage.Delete(id);
return Results.Ok();
});
}
}
}