diff --git a/src/BuildFlow.Host/Endpoints/file/Buckets/CreateBucketEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Buckets/CreateBucketEndpoint.cs
deleted file mode 100644
index 2284162..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Buckets/CreateBucketEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using File.Application.Features.Buckets.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Buckets;
-
-
-/// 创建存储桶端点。POST /api/buckets,按名称创建存储桶。
-[Authorize]
-///
-/// undefined
-///
-public class CreateBucketEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/buckets");
- Permissions("bucket:write");
- }
-
- public override async Task HandleAsync(CreateBucketRequest req, CancellationToken ct)
- {
- var message = await mediator.Send(new CreateBucketCommand(req.Name), ct);
- await Send.OkAsync(new { message }, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Buckets/CreateBucketRequest.cs b/src/BuildFlow.Host/Endpoints/file/Buckets/CreateBucketRequest.cs
deleted file mode 100644
index b5843ca..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Buckets/CreateBucketRequest.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Buckets;
-
-/// 创建存储桶请求。携带待创建存储桶的名称。
-public class CreateBucketRequest
-{
- public string Name { get; init; } = default!;
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Buckets/DeleteBucketEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Buckets/DeleteBucketEndpoint.cs
deleted file mode 100644
index e57f625..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Buckets/DeleteBucketEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using File.Application.Features.Buckets.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Buckets;
-
-
-/// 删除存储桶端点。DELETE /api/buckets,按名称删除存储桶。
-[Authorize]
-///
-/// undefined
-///
-public class DeleteBucketEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Delete("/buckets");
- Permissions("bucket:write");
- }
-
- public override async Task HandleAsync(DeleteBucketRequest req, CancellationToken ct)
- {
- var message = await mediator.Send(new DeleteBucketCommand(req.Name), ct);
- await Send.OkAsync(new { message }, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Buckets/DeleteBucketRequest.cs b/src/BuildFlow.Host/Endpoints/file/Buckets/DeleteBucketRequest.cs
deleted file mode 100644
index 4300b64..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Buckets/DeleteBucketRequest.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Buckets;
-
-/// 删除存储桶请求。以查询参数传入存储桶名称。
-public class DeleteBucketRequest
-{
- [QueryParam] public string Name { get; init; } = default!;
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Buckets/ListBucketsEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Buckets/ListBucketsEndpoint.cs
deleted file mode 100644
index b8583a9..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Buckets/ListBucketsEndpoint.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using File.Application.Features.Buckets.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Buckets;
-
-/// 列出存储桶端点。GET /api/buckets,返回全部存储桶名称。
-[Authorize]
-///
-/// undefined
-///
-public class ListBucketsEndpoint(IMediator mediator) : Endpoint>
-{
- public override void Configure()
- {
- Get("/buckets");
- Permissions("bucket:read");
- }
-
- public override async Task HandleAsync(EmptyRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new ListBucketsQuery(), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Files/CheckFileEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Files/CheckFileEndpoint.cs
deleted file mode 100644
index 0cd5c1d..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Files/CheckFileEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using File.Application.Features.Files.DTOs;
-using File.Application.Features.Files.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Files;
-
-/// 秒传预检端点。POST /api/files/check,按哈希查同用户已存在文件。
-[Authorize]
-///
-/// undefined
-///
-public class CheckFileEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/files/check");
- Permissions("file:upload");
- }
-
- public override async Task HandleAsync(CheckFileRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new CheckFileQuery(req.ContentHash, req.Size), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Files/CheckFileRequest.cs b/src/BuildFlow.Host/Endpoints/file/Files/CheckFileRequest.cs
deleted file mode 100644
index 34ad267..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Files/CheckFileRequest.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Files;
-
-/// 秒传预检请求。前端上传前带 content_hash 与 size 查重。
-public class CheckFileRequest
-{
- /// 文件内容 SHA-256 哈希(前端计算)。
- public string ContentHash { get; init; } = default!;
- /// 文件大小(字节),防哈希碰撞。
- public long Size { get; init; }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Files/DeleteFileEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Files/DeleteFileEndpoint.cs
deleted file mode 100644
index bddbb84..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Files/DeleteFileEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using File.Application.Features.Files.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Files;
-
-
-/// 删除文件端点。DELETE /api/files/delete,按对象键删除文件。
-[Authorize]
-///
-/// undefined
-///
-public class DeleteFileEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Delete("/files/delete");
- Permissions("file:write");
- }
-
- public override async Task HandleAsync(DeleteFileRequest req, CancellationToken ct)
- {
- await mediator.Send(new DeleteFileCommand(req.ObjectKey), ct);
- await Send.OkAsync(new { message = "deleted" }, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Files/DeleteFileRequest.cs b/src/BuildFlow.Host/Endpoints/file/Files/DeleteFileRequest.cs
deleted file mode 100644
index 1134c41..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Files/DeleteFileRequest.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Files;
-
-/// 删除文件请求。以查询参数指定对象键。
-public class DeleteFileRequest
-{
- [QueryParam] public string ObjectKey { get; init; } = default!;
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Files/DownloadFileEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Files/DownloadFileEndpoint.cs
deleted file mode 100644
index e31ecd1..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Files/DownloadFileEndpoint.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-using System.Net.Mime;
-using File.Application.Features.Files.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Files;
-
-///
-/// 下载文件端点。GET /api/files/download,按对象键流式返回文件内容。
-/// 直接把 S3 响应流透传到 HTTP 响应体,整文件不进内存;Content-Disposition 触发浏览器下载。
-/// 该路径已在 ApiResponseMiddlewareOptions.PassthroughPrefixes 注册,绕过响应包裹中间件的缓冲。
-///
-[Authorize]
-///
-/// undefined
-///
-public class DownloadFileEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Get("/files/download");
- Permissions("file:read");
- }
-
- public override async Task HandleAsync(DownloadFileRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new DownloadFileQuery(req.ObjectKey), ct);
-
- // 设置响应头:真实 ContentType + 触发下载的文件名
- HttpContext.Response.StatusCode = 200;
- HttpContext.Response.ContentType = result.ContentType;
- var disposition = new ContentDisposition { FileName = result.FileName, Inline = false };
- HttpContext.Response.Headers.ContentDisposition = disposition.ToString();
-
- // 流式透传:S3 流 → HTTP 响应体,零内存拷贝
- try
- {
- await result.Stream.CopyToAsync(HttpContext.Response.Body, ct);
- await HttpContext.Response.Body.FlushAsync(ct);
- }
- finally
- {
- await result.Stream.DisposeAsync();
- }
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Files/DownloadFileRequest.cs b/src/BuildFlow.Host/Endpoints/file/Files/DownloadFileRequest.cs
deleted file mode 100644
index ff1e7bd..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Files/DownloadFileRequest.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Files;
-
-/// 下载文件请求。以查询参数指定对象键。
-public class DownloadFileRequest
-{
- [QueryParam] public string ObjectKey { get; init; } = default!;
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Files/GetFileContentEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Files/GetFileContentEndpoint.cs
deleted file mode 100644
index d9971e1..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Files/GetFileContentEndpoint.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using File.Application.Features.Files.DTOs;
-using File.Application.Features.Files.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Files;
-
-
-/// 文件内容端点。GET /api/files/content,返回文件文本内容。
-[Authorize]
-///
-/// undefined
-///
-public class GetFileContentEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Get("/files/content");
- Permissions("file:read");
- }
-
- public override async Task HandleAsync(GetFileContentRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new GetFileContentQuery(req.ObjectKey), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Files/GetFileContentRequest.cs b/src/BuildFlow.Host/Endpoints/file/Files/GetFileContentRequest.cs
deleted file mode 100644
index c62cc6d..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Files/GetFileContentRequest.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Files;
-
-/// 文件内容请求。以查询参数指定对象键(bucket 由系统设置统一管理)。
-public class GetFileContentRequest
-{
- [QueryParam] public string ObjectKey { get; init; } = default!;
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Files/GetFilePreviewEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Files/GetFilePreviewEndpoint.cs
deleted file mode 100644
index aa9ddf3..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Files/GetFilePreviewEndpoint.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-using System.Net.Mime;
-using File.Application.Features.Files.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Files;
-
-///
-/// 文件预览端点。GET /api/files/preview,流式返回文件内容供内联展示(非下载)。
-/// 后端从 S3 拉流透传,前端永远不接触 S3 URL 和凭据。
-/// 鉴权:[Authorize] + JWT 中间件从 token query 参数读 JWT(img src / window.open 无法带 header)。
-/// 该路径在 ApiResponseMiddlewareOptions.PassthroughPrefixes 注册,绕过响应包裹中间件的缓冲。
-///
-[Authorize]
-public class GetFilePreviewEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Get("/files/preview");
- Permissions("file:read");
- }
-
- public override async Task HandleAsync(GetFilePreviewRequest req, CancellationToken ct)
- {
- // 复用下载查询(返回 Stream + ContentType + FileName)
- var result = await mediator.Send(new DownloadFileQuery(req.ObjectKey), ct);
-
- // inline = 浏览器内联展示(图片/PDF 直接渲染),而非触发下载
- HttpContext.Response.ContentType = result.ContentType;
- var disposition = new ContentDisposition { FileName = result.FileName, Inline = true };
- HttpContext.Response.Headers.ContentDisposition = disposition.ToString();
-
- // 流式透传:S3 流 → HTTP 响应体
- try
- {
- await result.Stream.CopyToAsync(HttpContext.Response.Body, ct);
- await HttpContext.Response.Body.FlushAsync(ct);
- }
- finally
- {
- await result.Stream.DisposeAsync();
- }
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Files/GetFilePreviewRequest.cs b/src/BuildFlow.Host/Endpoints/file/Files/GetFilePreviewRequest.cs
deleted file mode 100644
index 860500b..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Files/GetFilePreviewRequest.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Files;
-
-///
-/// 文件预览请求。以查询参数指定对象键。
-/// 鉴权三选一:Authorization header / Token 查询参数(JWT) / InternalToken+Expires(KKFileView 内部回拉)。
-///
-public class GetFilePreviewRequest
-{
- [QueryParam] public string ObjectKey { get; init; } = default!;
-
- /// JWT token(用于 img src / window.open 等无法带 Authorization header 的场景)。
- [QueryParam] public string? Token { get; init; }
-
- /// KKFileView 内部回拉签名(HMAC),配合 Expires 使用。
- [QueryParam] public string? InternalToken { get; init; }
-
- /// 内部签名过期时间戳(Unix 秒)。
- [QueryParam] public long? Expires { get; init; }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Files/GetOfficePreviewEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Files/GetOfficePreviewEndpoint.cs
deleted file mode 100644
index cad7c92..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Files/GetOfficePreviewEndpoint.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using File.Application.Features.Files.DTOs;
-using File.Application.Features.Files.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Files;
-
-///
-/// Office/PDF 文档在线预览端点。GET /api/files/office-preview,
-/// 返回 KKFileView 预览地址,前端 window.open 打开即可渲染 Office 文档。
-///
-[Authorize]
-///
-/// undefined
-///
-public class GetOfficePreviewEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Get("/files/office-preview");
- Permissions("file:read");
- }
-
- public override async Task HandleAsync(GetOfficePreviewRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new GetOfficePreviewQuery(req.ObjectKey), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Files/GetOfficePreviewRequest.cs b/src/BuildFlow.Host/Endpoints/file/Files/GetOfficePreviewRequest.cs
deleted file mode 100644
index 7e0341c..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Files/GetOfficePreviewRequest.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Files;
-
-/// Office/PDF 文档预览请求。以查询参数指定对象键。
-public class GetOfficePreviewRequest
-{
- [QueryParam] public string ObjectKey { get; init; } = default!;
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Files/ListFilesEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Files/ListFilesEndpoint.cs
deleted file mode 100644
index 56091f9..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Files/ListFilesEndpoint.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using File.Application.Features.Files.DTOs;
-using File.Application.Features.Files.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Files;
-
-
-/// 列举文件端点。GET /api/files/list,支持前缀与分页查询。
-[Authorize]
-///
-/// undefined
-///
-public class ListFilesEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Get("/files/list");
- Permissions("file:read");
- }
-
- public override async Task HandleAsync(ListFilesRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new ListFilesQuery(req.Prefix, req.MaxKeys, req.ContinuationToken), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Files/ListFilesRequest.cs b/src/BuildFlow.Host/Endpoints/file/Files/ListFilesRequest.cs
deleted file mode 100644
index 2ef89f7..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Files/ListFilesRequest.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Files;
-
-/// 列举文件请求。包含前缀、最大键数与续传令牌。
-public class ListFilesRequest
-{
- [QueryParam] public string? Prefix { get; init; }
- [QueryParam] public int? MaxKeys { get; init; }
- [QueryParam] public string? ContinuationToken { get; init; }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Files/UploadFileEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Files/UploadFileEndpoint.cs
deleted file mode 100644
index bd04504..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Files/UploadFileEndpoint.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using File.Application.Features.Files.Commands;
-using File.Application.Features.Files.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Files;
-
-
-/// 上传文件端点。POST /api/files/upload,支持 multipart 文件上传。
-[Authorize]
-///
-/// undefined
-///
-public class UploadFileEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/files/upload");
- Permissions("file:upload");
- AllowFileUploads();
- }
-
- public override async Task HandleAsync(UploadFileRequest req, CancellationToken ct)
- {
- await using var stream = req.File.OpenReadStream();
- var result = await mediator.Send(new UploadFileCommand(req.ObjectKey,
- stream, req.File.ContentType, req.File.Length, req.ContentHash), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Files/UploadFileRequest.cs b/src/BuildFlow.Host/Endpoints/file/Files/UploadFileRequest.cs
deleted file mode 100644
index f00c7b8..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Files/UploadFileRequest.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Files;
-
-/// 上传文件请求。包含 object_key 与文件数据。
-public class UploadFileRequest
-{
- public string ObjectKey { get; init; } = default!;
- public IFormFile File { get; init; } = default!;
- /// 文件内容哈希(可选),秒传查重用。
- public string? ContentHash { get; init; }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Folders/CreateFolderEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Folders/CreateFolderEndpoint.cs
deleted file mode 100644
index c057680..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Folders/CreateFolderEndpoint.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using File.Application.Features.Folders.Commands;
-using File.Application.Features.Folders.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Folders;
-
-
-/// 创建文件夹端点。POST /api/folders。
-[Authorize]
-///
-/// undefined
-///
-public class CreateFolderEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/folders");
- Permissions("file:write");
- }
-
- public override async Task HandleAsync(CreateFolderRequest req, CancellationToken ct)
- {
- var parentId = string.IsNullOrEmpty(req.ParentId) ? (Guid?)null : Guid.Parse(req.ParentId);
- var result = await mediator.Send(new CreateFolderCommand(parentId, req.Name), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Folders/CreateFolderRequest.cs b/src/BuildFlow.Host/Endpoints/file/Folders/CreateFolderRequest.cs
deleted file mode 100644
index 9300bb3..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Folders/CreateFolderRequest.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Folders;
-
-/// 创建文件夹请求体(父目录 Id 与名称)。
-public class CreateFolderRequest
-{
- public string? ParentId { get; init; }
- public string Name { get; init; } = default!;
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Folders/DeleteFolderEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Folders/DeleteFolderEndpoint.cs
deleted file mode 100644
index f214816..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Folders/DeleteFolderEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using File.Application.Features.Folders.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Folders;
-
-
-/// 删除文件夹端点。DELETE /api/folders/{Id}。
-[Authorize]
-///
-/// undefined
-///
-public class DeleteFolderEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Delete("/folders/{Id}");
- Permissions("file:write");
- }
-
- public override async Task HandleAsync(DeleteFolderRequest req, CancellationToken ct)
- {
- await mediator.Send(new DeleteFolderCommand(Guid.Parse(req.Id)), ct);
- await Send.OkAsync(new { message = "deleted" }, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Folders/DeleteFolderRequest.cs b/src/BuildFlow.Host/Endpoints/file/Folders/DeleteFolderRequest.cs
deleted file mode 100644
index fb71d2c..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Folders/DeleteFolderRequest.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Folders;
-
-/// 删除文件夹请求(路由取 Id)。
-public class DeleteFolderRequest
-{
- [RouteParam] public string Id { get; init; } = default!;
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Folders/GetFolderEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Folders/GetFolderEndpoint.cs
deleted file mode 100644
index 1aac8a2..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Folders/GetFolderEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using File.Application.Features.Folders.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Folders;
-
-
-/// 获取文件夹详情端点。GET /api/folders/{Id}。
-[Authorize]
-///
-/// undefined
-///
-public class GetFolderEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Get("/folders/{Id}");
- Permissions("file:read");
- }
-
- public override async Task HandleAsync(GetFolderRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new GetFolderQuery(Guid.Parse(req.Id)), ct);
- await Send.OkAsync(result!, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Folders/GetFolderRequest.cs b/src/BuildFlow.Host/Endpoints/file/Folders/GetFolderRequest.cs
deleted file mode 100644
index 3b9efe7..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Folders/GetFolderRequest.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Folders;
-
-/// 获取文件夹请求(路由取 Id)。
-public class GetFolderRequest
-{
- [RouteParam] public string Id { get; init; } = default!;
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Folders/GetFolderTreeEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Folders/GetFolderTreeEndpoint.cs
deleted file mode 100644
index d39efb3..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Folders/GetFolderTreeEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using File.Application.Features.Folders.DTOs;
-using File.Application.Features.Folders.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Folders;
-
-/// 获取整棵文件夹树端点。GET /api/folders/tree。
-[Authorize]
-///
-/// undefined
-///
-public class GetFolderTreeEndpoint(IMediator mediator) : Endpoint>
-{
- public override void Configure()
- {
- Get("/folders/tree");
- Permissions("file:read");
- }
-
- public override async Task HandleAsync(EmptyRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new GetFolderTreeQuery(), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Folders/GetRootFilesEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Folders/GetRootFilesEndpoint.cs
deleted file mode 100644
index 98e100c..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Folders/GetRootFilesEndpoint.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using File.Application.Features.Folders.DTOs;
-using File.Application.Features.Folders.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Folders;
-
-///
-/// 查询根级文件端点。GET /api/files/root,
-/// 返回当前用户 FolderId=null 的所有 FileMeta,使根目录与子文件夹共享同一数据源(DB)。
-/// 注意:路径用 /files/root 而非 /folders/root/files,避免与 POST /folders/{FolderId}/files 模板冲突。
-///
-[Authorize]
-public class GetRootFilesEndpoint(IMediator mediator) : Endpoint>
-{
- public override void Configure()
- {
- Get("/files/root");
- Permissions("file:read");
- }
-
- public override async Task HandleAsync(EmptyRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new GetRootFilesQuery(), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Folders/MoveFileEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Folders/MoveFileEndpoint.cs
deleted file mode 100644
index f9db05b..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Folders/MoveFileEndpoint.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using File.Application.Features.Folders.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Folders;
-
-
-/// 移动文件到目标文件夹端点。POST /api/files/{Id}/move。
-[Authorize]
-///
-/// undefined
-///
-public class MoveFileEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/files/{Id}/move");
- Permissions("file:write");
- }
-
- public override async Task HandleAsync(MoveFileRequest req, CancellationToken ct)
- {
- var targetId = string.IsNullOrEmpty(req.TargetFolderId) ? (Guid?)null : Guid.Parse(req.TargetFolderId);
- await mediator.Send(new MoveFileCommand(Guid.Parse(req.Id), targetId), ct);
- await Send.OkAsync(new { message = "moved" }, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Folders/MoveFileRequest.cs b/src/BuildFlow.Host/Endpoints/file/Folders/MoveFileRequest.cs
deleted file mode 100644
index a46c75d..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Folders/MoveFileRequest.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Folders;
-
-/// 移动文件请求(文件 Id 与目标目录)。
-public class MoveFileRequest
-{
- [RouteParam] public string Id { get; init; } = default!;
- public string? TargetFolderId { get; init; }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Folders/RenameFolderEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Folders/RenameFolderEndpoint.cs
deleted file mode 100644
index b938524..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Folders/RenameFolderEndpoint.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using File.Application.Features.Folders.Commands;
-using File.Application.Features.Folders.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Folders;
-
-
-/// 重命名文件夹端点。PUT /api/folders/{Id}。
-[Authorize]
-///
-/// undefined
-///
-public class RenameFolderEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Put("/folders/{Id}");
- Permissions("file:write");
- }
-
- public override async Task HandleAsync(RenameFolderRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new RenameFolderCommand(Guid.Parse(req.Id), req.Name), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Folders/RenameFolderRequest.cs b/src/BuildFlow.Host/Endpoints/file/Folders/RenameFolderRequest.cs
deleted file mode 100644
index 3e389a5..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Folders/RenameFolderRequest.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Folders;
-
-/// 重命名文件夹请求(路由 Id 与新名称)。
-public class RenameFolderRequest
-{
- [RouteParam] public string Id { get; init; } = default!;
- public string Name { get; init; } = default!;
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Folders/UploadToFolderEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Folders/UploadToFolderEndpoint.cs
deleted file mode 100644
index 45a1b3d..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Folders/UploadToFolderEndpoint.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using File.Application.Features.Folders.Commands;
-using File.Application.Features.Folders.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Folders;
-
-
-/// 上传文件到指定文件夹端点。POST /api/folders/{FolderId}/files。
-[Authorize]
-///
-/// undefined
-///
-public class UploadToFolderEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/folders/{FolderId}/files");
- Permissions("file:upload");
- AllowFileUploads();
- }
-
- public override async Task HandleAsync(UploadToFolderRequest req, CancellationToken ct)
- {
- await using var stream = req.File.OpenReadStream();
- var result = await mediator.Send(new UploadToFolderCommand(Guid.Parse(req.FolderId),
- req.FileName, stream, req.File.ContentType, req.File.Length, req.ContentHash), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Folders/UploadToFolderRequest.cs b/src/BuildFlow.Host/Endpoints/file/Folders/UploadToFolderRequest.cs
deleted file mode 100644
index 9ef1f43..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Folders/UploadToFolderRequest.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Folders;
-
-/// 上传文件到文件夹请求(含 multipart 文件流)。
-public class UploadToFolderRequest
-{
- [RouteParam] public string FolderId { get; init; } = default!;
- public string FileName { get; init; } = default!;
- public IFormFile File { get; init; } = default!;
- /// 文件内容哈希(可选),秒传查重用。
- public string? ContentHash { get; init; }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Multipart/AbortMultipartEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Multipart/AbortMultipartEndpoint.cs
deleted file mode 100644
index 5d39143..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Multipart/AbortMultipartEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using File.Application.Features.Multipart.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Multipart;
-
-
-/// 中止分片上传端点。POST /api/files/multipart/abort。
-[Authorize]
-///
-/// undefined
-///
-public class AbortMultipartEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/files/multipart/abort");
- Permissions("file:upload");
- }
-
- public override async Task HandleAsync(AbortMultipartRequest req, CancellationToken ct)
- {
- await mediator.Send(new AbortMultipartCommand(req.ObjectKey, req.UploadId), ct);
- await Send.OkAsync(new { message = "aborted" }, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Multipart/AbortMultipartRequest.cs b/src/BuildFlow.Host/Endpoints/file/Multipart/AbortMultipartRequest.cs
deleted file mode 100644
index d7300e9..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Multipart/AbortMultipartRequest.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Multipart;
-
-/// 中止分片上传请求(对象 key、UploadId)。
-public class AbortMultipartRequest
-{
- public string ObjectKey { get; init; } = default!;
- public string UploadId { get; init; } = default!;
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Multipart/CompleteMultipartEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Multipart/CompleteMultipartEndpoint.cs
deleted file mode 100644
index d98d05f..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Multipart/CompleteMultipartEndpoint.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using File.Application.Features.Multipart.Commands;
-using File.Application.Features.Multipart.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Multipart;
-
-
-/// 完成分片上传端点。POST /api/files/multipart/complete。
-[Authorize]
-///
-/// undefined
-///
-public class CompleteMultipartEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/files/multipart/complete");
- Permissions("file:upload");
- }
-
- public override async Task HandleAsync(CompleteMultipartRequest req, CancellationToken ct)
- {
- var parts = req.Parts.Select(p => new CompletedPartDto(p.PartNumber, p.ETag)).ToList();
- var result = await mediator.Send(new CompleteMultipartCommand(req.ObjectKey, req.UploadId, parts, req.FileName, req.Size), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Multipart/CompleteMultipartRequest.cs b/src/BuildFlow.Host/Endpoints/file/Multipart/CompleteMultipartRequest.cs
deleted file mode 100644
index 18d93f8..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Multipart/CompleteMultipartRequest.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Multipart;
-
-/// 完成分片上传请求(含各分片信息列表)。
-public class CompleteMultipartRequest
-{
- public string ObjectKey { get; init; } = default!;
- public string UploadId { get; init; } = default!;
- public List Parts { get; init; } = new();
- /// 文件名(可选),完成后落 FileMeta 用,供秒传查重。
- public string? FileName { get; init; }
- /// 文件总大小(可选),落 FileMeta 用。
- public long Size { get; init; }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Multipart/InitMultipartEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Multipart/InitMultipartEndpoint.cs
deleted file mode 100644
index a7728f0..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Multipart/InitMultipartEndpoint.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using File.Application.Features.Multipart.Commands;
-using File.Application.Features.Multipart.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Multipart;
-
-
-/// 初始化分片上传端点。POST /api/files/multipart/init。
-[Authorize]
-///
-/// undefined
-///
-public class InitMultipartEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/files/multipart/init");
- Permissions("file:upload");
- }
-
- public override async Task HandleAsync(InitMultipartRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new InitMultipartCommand(req.ObjectKey, req.ContentHash, req.TotalParts, req.Size), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Multipart/InitMultipartRequest.cs b/src/BuildFlow.Host/Endpoints/file/Multipart/InitMultipartRequest.cs
deleted file mode 100644
index e4a792a..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Multipart/InitMultipartRequest.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Multipart;
-
-/// 初始化分片上传请求。ContentHash/TotalParts 可选,断点续传时由前端附带。
-public class InitMultipartRequest
-{
- /// S3 对象 key(断点续传建议用内容哈希派生稳定值)。
- public string ObjectKey { get; init; } = default!;
- /// 文件内容哈希(可选),仅落库记录用。
- public string? ContentHash { get; init; }
- /// 预计分片总数(可选),进度参考。
- public int? TotalParts { get; init; }
- /// 文件大小(可选),秒传判定用(防哈希碰撞)。
- public long? Size { get; init; }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Multipart/ListPartsEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Multipart/ListPartsEndpoint.cs
deleted file mode 100644
index f1a9d49..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Multipart/ListPartsEndpoint.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using File.Application.Features.Multipart.DTOs;
-using File.Application.Features.Multipart.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Multipart;
-
-///
-/// 查询分片上传已传分片清单端点。GET /api/files/multipart/parts?upload_id=xxx。
-/// 断点续传恢复点:前端续传前调用,据此跳过已传 partNumber。
-///
-[Authorize]
-///
-/// undefined
-///
-public class ListPartsEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Get("/files/multipart/parts");
- Permissions("file:upload");
- }
-
- public override async Task HandleAsync(ListPartsRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new ListPartsQuery(req.UploadId), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Multipart/ListPartsRequest.cs b/src/BuildFlow.Host/Endpoints/file/Multipart/ListPartsRequest.cs
deleted file mode 100644
index e7f0eba..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Multipart/ListPartsRequest.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Multipart;
-
-/// 查询已传分片清单请求。upload_id 经 query string 传入。
-public class ListPartsRequest
-{
- /// 分片上传会话的 S3 UploadId。
- [QueryParam] public string UploadId { get; init; } = default!;
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Multipart/PartRequest.cs b/src/BuildFlow.Host/Endpoints/file/Multipart/PartRequest.cs
deleted file mode 100644
index eff74e1..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Multipart/PartRequest.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Multipart;
-
-/// 分片上传的单片信息(CompleteMultipart 时用)。
-public class PartRequest
-{
- public int PartNumber { get; init; }
- public string ETag { get; init; } = default!;
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Multipart/UploadPartEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Multipart/UploadPartEndpoint.cs
deleted file mode 100644
index f55b16b..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Multipart/UploadPartEndpoint.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using File.Application.Features.Multipart.Commands;
-using File.Application.Features.Multipart.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Multipart;
-
-
-/// 上传单个分片端点。PUT /api/files/multipart/part。
-[Authorize]
-///
-/// undefined
-///
-public class UploadPartEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Put("/files/multipart/part");
- Permissions("file:upload");
- AllowFileUploads();
- }
-
- public override async Task HandleAsync(UploadPartRequest req, CancellationToken ct)
- {
- await using var stream = req.File.OpenReadStream();
- var result = await mediator.Send(new UploadPartCommand(req.ObjectKey,
- req.UploadId, req.PartNumber, stream), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Multipart/UploadPartRequest.cs b/src/BuildFlow.Host/Endpoints/file/Multipart/UploadPartRequest.cs
deleted file mode 100644
index a485a12..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Multipart/UploadPartRequest.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Multipart;
-
-/// 上传单个分片请求(含 multipart 文件流)。
-public class UploadPartRequest
-{
- public string ObjectKey { get; init; } = default!;
- public string UploadId { get; init; } = default!;
- public int PartNumber { get; init; }
- public IFormFile File { get; init; } = default!;
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Settings/GetFileSettingEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Settings/GetFileSettingEndpoint.cs
deleted file mode 100644
index 02b8e0d..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Settings/GetFileSettingEndpoint.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using File.Application.Features.Settings.DTOs;
-using File.Application.Features.Settings.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Settings;
-
-/// 查询文件系统设置端点。GET /api/file-settings,返回当前默认存储桶。
-[Authorize]
-public class GetFileSettingEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Get("/file-settings");
- Permissions("bucket:read");
- }
-
- public override async Task HandleAsync(EmptyRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new GetFileSettingQuery(), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Settings/UpdateDefaultBucketEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Settings/UpdateDefaultBucketEndpoint.cs
deleted file mode 100644
index 94afdcd..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Settings/UpdateDefaultBucketEndpoint.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using File.Application.Features.Settings.Commands;
-using File.Application.Features.Settings.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Settings;
-
-/// 更新默认存储桶端点。PUT /api/file-settings/default-bucket。
-[Authorize]
-public class UpdateDefaultBucketEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Put("/file-settings/default-bucket");
- Permissions("bucket:write");
- }
-
- public override async Task HandleAsync(UpdateDefaultBucketRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new UpdateDefaultBucketCommand(req.DefaultBucket), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Settings/UpdateDefaultBucketRequest.cs b/src/BuildFlow.Host/Endpoints/file/Settings/UpdateDefaultBucketRequest.cs
deleted file mode 100644
index 5159726..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Settings/UpdateDefaultBucketRequest.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Settings;
-
-/// 更新默认存储桶请求。
-public class UpdateDefaultBucketRequest
-{
- public string DefaultBucket { get; init; } = default!;
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Shares/CreateShareEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Shares/CreateShareEndpoint.cs
deleted file mode 100644
index 2f1a223..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Shares/CreateShareEndpoint.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using File.Application.Features.Shares.Commands;
-using File.Application.Features.Shares.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Shares;
-
-
-/// 创建分享链接端点。POST /api/share。
-[Authorize]
-///
-/// undefined
-///
-public class CreateShareEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/share");
- Permissions("file-share:write");
- }
-
- public override async Task HandleAsync(CreateShareRequest req, CancellationToken ct)
- {
- var expiresAt = string.IsNullOrEmpty(req.ExpiresAt)
- ? (DateTime?)null
- : DateTime.Parse(req.ExpiresAt, null, System.Globalization.DateTimeStyles.RoundtripKind);
- var result = await mediator.Send(new CreateShareCommand(req.ResourceType,
- Guid.Parse(req.ResourceId), req.Password, expiresAt, req.MaxDownloads), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Shares/CreateShareRequest.cs b/src/BuildFlow.Host/Endpoints/file/Shares/CreateShareRequest.cs
deleted file mode 100644
index 11a221b..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Shares/CreateShareRequest.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Shares;
-
-/// 创建分享请求(资源、密码、过期、下载上限)。
-public class CreateShareRequest
-{
- public string ResourceType { get; init; } = default!;
- public string ResourceId { get; init; } = default!;
- public string? Password { get; init; }
- public string? ExpiresAt { get; init; } // ISO 8601 字符串
- public int? MaxDownloads { get; init; }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Shares/DeleteShareEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Shares/DeleteShareEndpoint.cs
deleted file mode 100644
index 600ba32..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Shares/DeleteShareEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using File.Application.Features.Shares.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Shares;
-
-
-/// 删除分享端点。DELETE /api/share/{Id}。
-[Authorize]
-///
-/// undefined
-///
-public class DeleteShareEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Delete("/share/{Id}");
- Permissions("file-share:write");
- }
-
- public override async Task HandleAsync(DeleteShareRequest req, CancellationToken ct)
- {
- await mediator.Send(new DeleteShareCommand(Guid.Parse(req.Id)), ct);
- await Send.OkAsync(new { message = "deleted" }, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Shares/DeleteShareRequest.cs b/src/BuildFlow.Host/Endpoints/file/Shares/DeleteShareRequest.cs
deleted file mode 100644
index 88df3d3..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Shares/DeleteShareRequest.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Shares;
-
-/// 删除分享请求(路由取 Id)。
-public class DeleteShareRequest
-{
- [RouteParam] public string Id { get; init; } = default!;
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Shares/DownloadShareEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Shares/DownloadShareEndpoint.cs
deleted file mode 100644
index 3582eda..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Shares/DownloadShareEndpoint.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using File.Application.Features.Shares.DTOs;
-using File.Application.Features.Shares.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Shares;
-
-
-/// 下载分享端点(匿名访问)。POST /api/share/{Token}/download。
-public class DownloadShareEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/share/{Token}/download");
- AllowAnonymous();
- }
-
- public override async Task HandleAsync(DownloadShareRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new DownloadShareQuery(req.Token, req.Password), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Shares/DownloadShareRequest.cs b/src/BuildFlow.Host/Endpoints/file/Shares/DownloadShareRequest.cs
deleted file mode 100644
index a3d7baf..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Shares/DownloadShareRequest.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Shares;
-
-/// 下载分享请求(Token 与可选密码)。
-public class DownloadShareRequest
-{
- [RouteParam] public string Token { get; init; } = default!;
- public string? Password { get; init; }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Shares/GetShareInfoEndpoint.cs b/src/BuildFlow.Host/Endpoints/file/Shares/GetShareInfoEndpoint.cs
deleted file mode 100644
index 9a89c48..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Shares/GetShareInfoEndpoint.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using File.Application.Features.Shares.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.File.Shares;
-
-
-/// 查询分享信息端点(匿名访问)。GET /api/share/{Token}。
-public class GetShareInfoEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Get("/share/{Token}");
- AllowAnonymous();
- }
-
- public override async Task HandleAsync(GetShareInfoRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new GetShareInfoQuery(req.Token), ct);
- await Send.OkAsync(result!, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/file/Shares/GetShareInfoRequest.cs b/src/BuildFlow.Host/Endpoints/file/Shares/GetShareInfoRequest.cs
deleted file mode 100644
index d0f9f08..0000000
--- a/src/BuildFlow.Host/Endpoints/file/Shares/GetShareInfoRequest.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace BuildFlow.Host.Endpoints.File.Shares;
-
-/// 查询分享信息请求(路由取 Token)。
-public class GetShareInfoRequest
-{
- [RouteParam] public string Token { get; init; } = default!;
-}
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/AddGroupMemberEndpoint.cs b/src/BuildFlow.Host/Endpoints/im/Chat/AddGroupMemberEndpoint.cs
deleted file mode 100644
index 82a43f3..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/AddGroupMemberEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using BuildFlow.Shared.Domain.Common;
-using IM.Application.Chat.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-
-///
-/// 批量添加群成员端点。POST /groups/{GroupId}/members。
-///
-public class AddGroupMemberEndpoint(IMediator mediator, ICurrentUserContext userContext) : Endpoint
-{
- public override void Configure()
- {
- Post("/groups/{GroupId}/members");
- Permissions("im:group:manage");
- }
-
- public override async Task HandleAsync(AddGroupMemberEndpointRequest req, CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserGuid();
- await mediator.Send(new AddGroupMemberCommand(req.GroupId, userId, req.UserIds), ct);
- HttpContext.Response.StatusCode = 204;
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/AddGroupMemberEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/im/Chat/AddGroupMemberEndpointRequest.cs
deleted file mode 100644
index 6c7ead5..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/AddGroupMemberEndpointRequest.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 批量添加群成员请求体。
-///
-public record AddGroupMemberEndpointRequest(Guid GroupId, List UserIds);
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/CreateGroupEndpoint.cs b/src/BuildFlow.Host/Endpoints/im/Chat/CreateGroupEndpoint.cs
deleted file mode 100644
index f3b8c7b..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/CreateGroupEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using BuildFlow.Shared.Domain.Common;
-using IM.Application.Chat.Commands;
-using IM.Application.Chat.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 创建群组端点。POST /groups。
-///
-public class CreateGroupEndpoint(IMediator mediator, ICurrentUserContext userContext) : Endpoint
-{
- public override void Configure()
- {
- Post("/groups");
- Permissions("im:group:create");
- }
-
- public override async Task HandleAsync(CreateGroupRequest req, CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserGuid();
- var result = await mediator.Send(new CreateGroupCommand(req.Name, req.Avatar, req.Description, userId, req.MemberUserIds), ct);
- await Send.ResponseAsync(result, 201, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/CreatePrivateConversationEndpoint.cs b/src/BuildFlow.Host/Endpoints/im/Chat/CreatePrivateConversationEndpoint.cs
deleted file mode 100644
index 8377fd9..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/CreatePrivateConversationEndpoint.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using BuildFlow.Shared.Domain.Common;
-using IM.Application.Chat.Commands;
-using IM.Application.Chat.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 创建或复用私聊会话。若当前用户与目标用户间已存在私聊会话则直接返回,保证幂等。
-///
-public class CreatePrivateConversationEndpoint(
- IMediator mediator,
- ICurrentUserContext userContext) : Endpoint
-{
- public override void Configure()
- {
- Post("/conversations/private");
- Permissions("im:chat");
- }
-
- public override async Task HandleAsync(CreatePrivateConversationRequest req, CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserGuid();
- var result = await mediator.Send(
- new CreatePrivateConversationCommand(userId, req.TargetUserId), ct);
- await Send.ResponseAsync(result, 200, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/DeleteGroupEndpoint.cs b/src/BuildFlow.Host/Endpoints/im/Chat/DeleteGroupEndpoint.cs
deleted file mode 100644
index e1d8e43..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/DeleteGroupEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using BuildFlow.Shared.Domain.Common;
-using IM.Application.Chat.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-
-///
-/// 解散群组端点。DELETE /groups/{GroupId}。
-///
-public class DeleteGroupEndpoint(IMediator mediator, ICurrentUserContext userContext) : Endpoint
-{
- public override void Configure()
- {
- Delete("/groups/{GroupId}");
- Permissions("im:group:manage");
- }
-
- public override async Task HandleAsync(DeleteGroupEndpointRequest req, CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserGuid();
- await mediator.Send(new DeleteGroupCommand(req.GroupId, userId), ct);
- HttpContext.Response.StatusCode = 204;
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/DeleteGroupEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/im/Chat/DeleteGroupEndpointRequest.cs
deleted file mode 100644
index 26fba49..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/DeleteGroupEndpointRequest.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 解散群组请求体(路由参数绑定)。
-///
-public record DeleteGroupEndpointRequest(Guid GroupId);
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/GetConversationsEndpoint.cs b/src/BuildFlow.Host/Endpoints/im/Chat/GetConversationsEndpoint.cs
deleted file mode 100644
index a914eb6..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/GetConversationsEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using BuildFlow.Shared.Domain.Common;
-using IM.Application.Chat.DTOs;
-using IM.Application.Chat.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 查询用户会话列表端点。GET /conversations。
-///
-public class GetConversationsEndpoint(IMediator mediator, ICurrentUserContext userContext) : EndpointWithoutRequest>
-{
- public override void Configure()
- {
- Get("/conversations");
- Permissions("im:read");
- }
-
- public override async Task HandleAsync(CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserGuid();
- var result = await mediator.Send(new GetConversationsQuery(userId), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/GetGroupEndpoint.cs b/src/BuildFlow.Host/Endpoints/im/Chat/GetGroupEndpoint.cs
deleted file mode 100644
index e464c56..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/GetGroupEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using BuildFlow.Shared.Domain.Common;
-using IM.Application.Chat.DTOs;
-using IM.Application.Chat.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 查询单个群详情(含公告/成员数)。
-///
-public class GetGroupEndpoint(IMediator mediator, ICurrentUserContext userContext) : Endpoint
-{
- public override void Configure()
- {
- Get("/groups/{GroupId}");
- Permissions("im:read");
- }
-
- public override async Task HandleAsync(GetGroupEndpointRequest req, CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserGuid();
- var result = await mediator.Send(new GetGroupQuery(req.GroupId, userId), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/GetGroupEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/im/Chat/GetGroupEndpointRequest.cs
deleted file mode 100644
index 94501a9..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/GetGroupEndpointRequest.cs
+++ /dev/null
@@ -1,4 +0,0 @@
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-/// 查询群详情请求。GroupId 由路由参数绑定。
-public record GetGroupEndpointRequest(Guid GroupId);
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/GetGroupMembersEndpoint.cs b/src/BuildFlow.Host/Endpoints/im/Chat/GetGroupMembersEndpoint.cs
deleted file mode 100644
index d8fcc6c..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/GetGroupMembersEndpoint.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using BuildFlow.Shared.Domain.Common;
-using IM.Application.Chat.DTOs;
-using IM.Application.Chat.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-
-///
-/// 查询群成员列表端点。GET /groups/{GroupId}/members。
-///
-public class GetGroupMembersEndpoint(IMediator mediator, ICurrentUserContext userContext) : Endpoint>
-{
- public override void Configure()
- {
- Get("/groups/{GroupId}/members");
- Permissions("im:read");
- }
-
- public override async Task HandleAsync(GetGroupMembersEndpointRequest req, CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserGuid();
- var result = await mediator.Send(new GetGroupMembersQuery(userId, req.GroupId), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/GetGroupMembersEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/im/Chat/GetGroupMembersEndpointRequest.cs
deleted file mode 100644
index 92556b3..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/GetGroupMembersEndpointRequest.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 群成员列表查询请求体(路由参数绑定)。
-///
-public record GetGroupMembersEndpointRequest(Guid GroupId);
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/GetMessageHistoryEndpoint.cs b/src/BuildFlow.Host/Endpoints/im/Chat/GetMessageHistoryEndpoint.cs
deleted file mode 100644
index 47c07e5..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/GetMessageHistoryEndpoint.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using BuildFlow.Shared.Domain.Common;
-using IM.Application.Chat.DTOs;
-using IM.Application.Chat.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-
-///
-/// 查询历史消息端点。GET /conversations/{ConversationId}/messages。
-///
-public class GetMessageHistoryEndpoint(IMediator mediator, ICurrentUserContext userContext) : Endpoint
-{
- public override void Configure()
- {
- Get("/conversations/{ConversationId}/messages");
- Permissions("im:read");
- }
-
- public override async Task HandleAsync(GetMessageHistoryRequest req, CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserGuid();
- var result = await mediator.Send(
- new GetMessageHistoryQuery(userId, req.ConversationId, req.BeforeId, req.Limit), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/GetMessageHistoryRequest.cs b/src/BuildFlow.Host/Endpoints/im/Chat/GetMessageHistoryRequest.cs
deleted file mode 100644
index a4fad1d..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/GetMessageHistoryRequest.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 历史消息查询请求体。含游标与分页大小。
-///
-public record GetMessageHistoryRequest(Guid ConversationId, string? BeforeId, int Limit = 50);
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/GetUnreadCountEndpoint.cs b/src/BuildFlow.Host/Endpoints/im/Chat/GetUnreadCountEndpoint.cs
deleted file mode 100644
index 231954e..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/GetUnreadCountEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using BuildFlow.Shared.Domain.Common;
-using IM.Application.Chat.DTOs;
-using IM.Application.Chat.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 查询未读消息数端点。GET /conversations/unread。
-///
-public class GetUnreadCountEndpoint(IMediator mediator, ICurrentUserContext userContext) : EndpointWithoutRequest
-{
- public override void Configure()
- {
- Get("/unread");
- Permissions("im:read");
- }
-
- public override async Task HandleAsync(CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserGuid();
- var result = await mediator.Send(new GetUnreadCountQuery(userId), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/MarkConversationUnreadEndpoint.cs b/src/BuildFlow.Host/Endpoints/im/Chat/MarkConversationUnreadEndpoint.cs
deleted file mode 100644
index 07a630a..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/MarkConversationUnreadEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using BuildFlow.Shared.Domain.Common;
-using IM.Application.Chat.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 标记会话未读端点。POST /conversations/{ConversationId}/unread。
-///
-public class MarkConversationUnreadEndpoint(IMediator mediator, ICurrentUserContext userContext) : EndpointWithoutRequest
-{
- public override void Configure()
- {
- Post("/conversations/{ConversationId}/unread");
- Permissions("im:conversation:manage");
- }
-
- public override async Task HandleAsync(CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserGuid();
- var conversationId = Route("ConversationId");
- await mediator.Send(new MarkConversationUnreadCommand(conversationId, userId), ct);
- await Send.OkAsync(ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/RecallMessageEndpoint.cs b/src/BuildFlow.Host/Endpoints/im/Chat/RecallMessageEndpoint.cs
deleted file mode 100644
index 3d9b69b..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/RecallMessageEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using BuildFlow.Shared.Domain.Common;
-using IM.Application.Chat.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 撤回消息 REST 端点(SignalR 的非实时兜底通道)。
-/// 权限与时间窗校验在 RecallMessageCommandHandler 内统一执行。
-///
-public class RecallMessageEndpoint(IMediator mediator, ICurrentUserContext userContext) : Endpoint
-{
- public override void Configure()
- {
- Post("/conversations/{ConversationId}/messages/{MessageId}/recall");
- Permissions("im:chat");
- }
-
- public override async Task HandleAsync(RecallMessageEndpointRequest req, CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserGuid();
- await mediator.Send(new RecallMessageCommand(req.ConversationId, req.MessageId, userId), ct);
- await Send.OkAsync(ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/RecallMessageEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/im/Chat/RecallMessageEndpointRequest.cs
deleted file mode 100644
index b3b0731..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/RecallMessageEndpointRequest.cs
+++ /dev/null
@@ -1,4 +0,0 @@
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-/// 撤回消息请求。ConversationId 与 MessageId 由路由参数绑定。
-public record RecallMessageEndpointRequest(Guid ConversationId, string MessageId);
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/RemoveGroupMemberEndpoint.cs b/src/BuildFlow.Host/Endpoints/im/Chat/RemoveGroupMemberEndpoint.cs
deleted file mode 100644
index 55be69f..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/RemoveGroupMemberEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using BuildFlow.Shared.Domain.Common;
-using IM.Application.Chat.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-
-///
-/// 移除群成员端点。DELETE /groups/{GroupId}/members/{UserId}。
-///
-public class RemoveGroupMemberEndpoint(IMediator mediator, ICurrentUserContext userContext) : Endpoint
-{
- public override void Configure()
- {
- Delete("/groups/{GroupId}/members/{TargetUserId}");
- Permissions("im:group:manage");
- }
-
- public override async Task HandleAsync(RemoveGroupMemberEndpointRequest req, CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserGuid();
- await mediator.Send(new RemoveGroupMemberCommand(req.GroupId, userId, req.TargetUserId), ct);
- HttpContext.Response.StatusCode = 204;
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/RemoveGroupMemberEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/im/Chat/RemoveGroupMemberEndpointRequest.cs
deleted file mode 100644
index 925e5c2..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/RemoveGroupMemberEndpointRequest.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 移除群成员请求体(路由参数绑定)。
-///
-public record RemoveGroupMemberEndpointRequest(Guid GroupId, Guid TargetUserId);
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/SetConversationMutedEndpoint.cs b/src/BuildFlow.Host/Endpoints/im/Chat/SetConversationMutedEndpoint.cs
deleted file mode 100644
index a6471de..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/SetConversationMutedEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using BuildFlow.Shared.Domain.Common;
-using IM.Application.Chat.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 设置会话免打扰端点。PUT /conversations/{ConversationId}/muted。
-///
-public class SetConversationMutedEndpoint(IMediator mediator, ICurrentUserContext userContext) : Endpoint
-{
- public override void Configure()
- {
- Put("/conversations/{ConversationId}/muted");
- Permissions("im:conversation:manage");
- }
-
- public override async Task HandleAsync(SetConversationStateRequest req, CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserGuid();
- var conversationId = Route("ConversationId");
- await mediator.Send(new SetConversationMutedCommand(conversationId, userId, req.Value), ct);
- await Send.OkAsync(ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/SetConversationPinnedEndpoint.cs b/src/BuildFlow.Host/Endpoints/im/Chat/SetConversationPinnedEndpoint.cs
deleted file mode 100644
index b402831..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/SetConversationPinnedEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using BuildFlow.Shared.Domain.Common;
-using IM.Application.Chat.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 设置会话置顶端点。PUT /conversations/{ConversationId}/pinned。
-///
-public class SetConversationPinnedEndpoint(IMediator mediator, ICurrentUserContext userContext) : Endpoint
-{
- public override void Configure()
- {
- Put("/conversations/{ConversationId}/pinned");
- Permissions("im:conversation:manage");
- }
-
- public override async Task HandleAsync(SetConversationStateRequest req, CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserGuid();
- var conversationId = Route("ConversationId");
- await mediator.Send(new SetConversationPinnedCommand(conversationId, userId, req.Value), ct);
- await Send.OkAsync(ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/SetConversationRemarkEndpoint.cs b/src/BuildFlow.Host/Endpoints/im/Chat/SetConversationRemarkEndpoint.cs
deleted file mode 100644
index 6c50672..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/SetConversationRemarkEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using BuildFlow.Shared.Domain.Common;
-using IM.Application.Chat.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 设置会话备注名端点。PUT /conversations/{ConversationId}/remark。
-///
-public class SetConversationRemarkEndpoint(IMediator mediator, ICurrentUserContext userContext) : Endpoint
-{
- public override void Configure()
- {
- Put("/conversations/{ConversationId}/remark");
- Permissions("im:conversation:manage");
- }
-
- public override async Task HandleAsync(SetConversationRemarkEndpointRequest req, CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserGuid();
- var conversationId = Route("ConversationId");
- await mediator.Send(new SetConversationRemarkCommand(conversationId, userId, req.Remark), ct);
- await Send.OkAsync(ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/SetConversationRemarkEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/im/Chat/SetConversationRemarkEndpointRequest.cs
deleted file mode 100644
index 3cfaa61..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/SetConversationRemarkEndpointRequest.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 设置会话备注名请求体。Remark 为空或 null 表示清除备注。
-///
-public record SetConversationRemarkEndpointRequest(string? Remark);
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/SetConversationStateRequest.cs b/src/BuildFlow.Host/Endpoints/im/Chat/SetConversationStateRequest.cs
deleted file mode 100644
index 6a5ea5e..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/SetConversationStateRequest.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 设置会话置顶/免打扰状态的请求体。isPinned 与 isMuted 不同时使用,视端点语义而定。
-///
-public record SetConversationStateRequest(bool Value);
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/UpdateGroupEndpoint.cs b/src/BuildFlow.Host/Endpoints/im/Chat/UpdateGroupEndpoint.cs
deleted file mode 100644
index c3512f3..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/UpdateGroupEndpoint.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using BuildFlow.Shared.Domain.Common;
-using IM.Application.Chat.Commands;
-using IM.Application.Chat.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-
-///
-/// 更新群信息端点。PUT /groups/{GroupId}。
-///
-public class UpdateGroupEndpoint(IMediator mediator, ICurrentUserContext userContext) : Endpoint
-{
- public override void Configure()
- {
- Put("/groups/{GroupId}");
- Permissions("im:group:manage");
- }
-
- public override async Task HandleAsync(UpdateGroupEndpointRequest req, CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserGuid();
- var result = await mediator.Send(new UpdateGroupCommand(req.GroupId, userId, req.Name, req.Avatar, req.Description, req.Announcement), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/im/Chat/UpdateGroupEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/im/Chat/UpdateGroupEndpointRequest.cs
deleted file mode 100644
index 79e6d65..0000000
--- a/src/BuildFlow.Host/Endpoints/im/Chat/UpdateGroupEndpointRequest.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace BuildFlow.Host.Endpoints.IM.Chat;
-
-///
-/// 更新群信息请求体。
-///
-public record UpdateGroupEndpointRequest(Guid GroupId, string? Name, string? Avatar, string? Description, string? Announcement = null);
diff --git a/src/BuildFlow.Host/Endpoints/platform/Auth/ChangePasswordEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Auth/ChangePasswordEndpoint.cs
deleted file mode 100644
index 19b45b8..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Auth/ChangePasswordEndpoint.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using BuildFlow.Platform.Infrastructure.Persistence;
-using BuildFlow.Shared.Domain.Common;
-
-namespace BuildFlow.Host.Endpoints.Platform.Auth;
-
-///
-/// 修改当前用户密码。验证旧密码后更新为新密码。
-/// POST /api/user/change-password
-///
-public class ChangePasswordEndpoint(PlatformDbContext db, ICurrentUserContext userContext)
- : Endpoint
-{
- public override void Configure()
- {
- Post("/user/change-password");
- }
-
- public override async Task HandleAsync(ChangePasswordRequest req, CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserId();
-
- var user = await db.Users
- .FirstOrDefaultAsync(u => u.Id.ToString() == userId, ct)
- ?? throw new UnauthorizedException("用户不存在");
-
- // 验证旧密码
- if (!BCrypt.Net.BCrypt.Verify(req.OldPassword, user.PasswordHash))
- {
- throw new BusinessException("旧密码不正确");
- }
-
- // 新密码不能与旧密码相同
- if (req.OldPassword == req.NewPassword)
- {
- throw new BusinessException("新密码不能与旧密码相同");
- }
-
- // 更新密码
- user.PasswordHash = BCrypt.Net.BCrypt.HashPassword(req.NewPassword);
- await db.SaveChangesAsync(ct);
-
- await Send.OkAsync(ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Auth/ChangePasswordRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Auth/ChangePasswordRequest.cs
deleted file mode 100644
index d8fa9e0..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Auth/ChangePasswordRequest.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Auth;
-
-/// 修改密码请求。包含旧密码(用于二次校验)与新密码。
-public class ChangePasswordRequest
-{
- /// 旧密码(登录态下二次校验,防止会话被劫持后改密)。
- public string OldPassword { get; set; } = string.Empty;
-
- /// 新密码(明文传入,服务端 BCrypt 哈希后存储)。
- public string NewPassword { get; set; } = string.Empty;
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Auth/GetAccessCodesEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Auth/GetAccessCodesEndpoint.cs
deleted file mode 100644
index 41a0b20..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Auth/GetAccessCodesEndpoint.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using BuildFlow.Platform.Application.Auth.Queries;
-using BuildFlow.Shared.Domain.Common;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Auth;
-
-///
-/// 获取当前用户的权限码列表。前端据此渲染按钮/菜单的可见性(细粒度前端权限控制)。
-/// 鉴权通过 GetRequiredUserId 强制——未登录直接抛 401。
-///
-public class GetAccessCodesEndpoint(IMediator mediator, ICurrentUserContext userContext) : EndpointWithoutRequest>
-{
- public override void Configure()
- {
- Get("/auth/codes");
- }
-
- public override async Task HandleAsync(CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserId();
- var codes = await mediator.Send(new GetAccessCodesQuery(userId), ct);
- await Send.OkAsync(codes, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Auth/GetCurrentUserEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Auth/GetCurrentUserEndpoint.cs
deleted file mode 100644
index 3f6828b..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Auth/GetCurrentUserEndpoint.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using BuildFlow.Platform.Application.Auth.Queries;
-using BuildFlow.Shared.Domain.Common;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Auth;
-
-///
-/// 获取当前登录用户信息端点。前端登录后调用以填充用户菜单、权限、头像。
-/// GetRequiredUserId 在未登录时抛 UnauthorizedException,等同强制鉴权(无需显式 Permissions)。
-///
-public class GetCurrentUserEndpoint(IMediator mediator, ICurrentUserContext userContext) : EndpointWithoutRequest
-{
- public override void Configure()
- {
- Get("/user/info");
- }
-
- public override async Task HandleAsync(CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserId();
- var result = await mediator.Send(new GetCurrentUserQuery(userId), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Auth/LoginEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Auth/LoginEndpoint.cs
deleted file mode 100644
index 96dc332..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Auth/LoginEndpoint.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using BuildFlow.Platform.Application.Auth.Commands;
-using BuildFlow.Platform.Application.Auth.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Auth;
-
-
-///
-/// 登录端点。
-///
-public class LoginEndpoint(IMediator mediator, IConfiguration config) : Endpoint
-{
- public override void Configure()
- {
- Post("/auth/login");
- AllowAnonymous();
- }
-
- public override async Task HandleAsync(LoginRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new LoginCommand(req.Username, req.Password), ct);
-
- // refresh_token 写入 HttpOnly Cookie:浏览器自动随请求带上,前端 JS 不可读,防 XSS
- HttpContext.Response.Cookies.Append("jwt", result.RefreshToken, new CookieOptions
- {
- HttpOnly = true,
- Secure = config.GetValue("Cookie:Secure"),
- SameSite = SameSiteMode.Lax,
- Expires = DateTimeOffset.UtcNow.AddDays(7),
- Path = "/"
- });
-
- await Send.OkAsync(result, ct);
- }
-}
-
-/// 登录请求校验。规则与 LoginCommandValidator 一致,HTTP 入口层提前拦截非法输入。
diff --git a/src/BuildFlow.Host/Endpoints/platform/Auth/LoginRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Auth/LoginRequestValidator.cs
deleted file mode 100644
index 45d0c22..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Auth/LoginRequestValidator.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using BuildFlow.Platform.Application.Auth.DTOs;
-
-namespace BuildFlow.Host.Endpoints.Platform.Auth;
-
-///
-/// 登录Request的请求校验器(FluentValidation)。
-///
-public class LoginRequestValidator : Validator
-{
- public LoginRequestValidator()
- {
- RuleFor(x => x.Username)
- .NotEmpty().WithMessage("用户名不能为空")
- .MaximumLength(50).WithMessage("用户名长度不能超过 50 个字符")
- .Must(u => u == u.Trim()).WithMessage("用户名前后不能有空格");
-
- RuleFor(x => x.Password)
- .NotEmpty().WithMessage("密码不能为空")
- .MaximumLength(100).WithMessage("密码长度不能超过 100 个字符");
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Auth/LogoutEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Auth/LogoutEndpoint.cs
deleted file mode 100644
index 6a91578..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Auth/LogoutEndpoint.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using BuildFlow.Platform.Application.Auth.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Auth;
-
-///
-/// 登出接口:撤销 refresh token 并清除 jwt Cookie。
-/// 前端通过 baseRequestClient 调用(withCredentials: true 发送 Cookie)。
-///
-public class LogoutEndpoint(IMediator mediator) : EndpointWithoutRequest
-{
- public override void Configure()
- {
- Post("/auth/logout");
- AllowAnonymous();
- }
-
- public override async Task HandleAsync(CancellationToken ct)
- {
- // 从 Cookie 中读取 refresh token
- var refreshToken = HttpContext.Request.Cookies["jwt"];
-
- if (!string.IsNullOrEmpty(refreshToken))
- {
- await mediator.Send(new LogoutCommand(refreshToken), ct);
- }
-
- // 清除 Cookie
- HttpContext.Response.Cookies.Delete("jwt");
-
- await Send.OkAsync(string.Empty, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Auth/RefreshTokenEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Auth/RefreshTokenEndpoint.cs
deleted file mode 100644
index f420b50..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Auth/RefreshTokenEndpoint.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using BuildFlow.Platform.Application.Auth.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Auth;
-
-///
-/// 刷新令牌端点。从 HttpOnly Cookie 读 refresh_token(前端无法读取,只能由浏览器自动随请求带上),
-/// 换取新 access_token 以纯文本响应(被 ApiResponseMiddleware 列入 ExcludedPaths 不包裹)。
-/// ExcludeFromDescription 避免 Swagger 暴露此内部接口。
-///
-public class RefreshTokenEndpoint(IMediator mediator, IConfiguration config) : EndpointWithoutRequest
-{
- public override void Configure()
- {
- Post("/auth/refresh");
- AllowAnonymous();
- Options(b => b.ExcludeFromDescription());
- }
-
- public override async Task HandleAsync(CancellationToken ct)
- {
- var refreshToken = HttpContext.Request.Cookies["jwt"]
- ?? throw new UnauthorizedException("缺少刷新令牌");
-
- var result = await mediator.Send(new RefreshTokenCommand(refreshToken), ct);
-
- // 新 refresh_token 写回 Cookie(Rotation:旧 token 已在 Handler 中作废)
- HttpContext.Response.Cookies.Append("jwt", result.RefreshToken, new CookieOptions
- {
- HttpOnly = true,
- Secure = config.GetValue("Cookie:Secure"),
- SameSite = SameSiteMode.Lax,
- Expires = DateTimeOffset.UtcNow.AddDays(7),
- Path = "/"
- });
-
- // 用 FastEndpoints 的 Send.StringAsync 返回纯文本 access token。
- // 之前用 HttpContext.Response.WriteAsync 被 FastEndpoints 管线覆盖成 204 空响应。
- await Send.StringAsync(result.AccessToken, 200, "text/plain; charset=utf-8", ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Auth/RegisterEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Auth/RegisterEndpoint.cs
deleted file mode 100644
index c19e6bc..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Auth/RegisterEndpoint.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using BuildFlow.Platform.Application.Auth.Commands;
-using BuildFlow.Platform.Application.Auth.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Auth;
-
-
-///
-/// 注册端点。
-///
-public class RegisterEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/auth/register");
- AllowAnonymous();
- }
-
- public override async Task HandleAsync(RegisterRequest req, CancellationToken ct)
- {
- await mediator.Send(new RegisterCommand(req.Username, req.Email, req.Password), ct);
- await Send.OkAsync(true, ct);
- }
-}
-
-/// 自助注册请求校验。
diff --git a/src/BuildFlow.Host/Endpoints/platform/Auth/RegisterRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Auth/RegisterRequestValidator.cs
deleted file mode 100644
index 124cfd2..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Auth/RegisterRequestValidator.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using BuildFlow.Platform.Application.Auth.DTOs;
-
-namespace BuildFlow.Host.Endpoints.Platform.Auth;
-
-///
-/// 注册Request的请求校验器(FluentValidation)。
-///
-public class RegisterRequestValidator : Validator
-{
- public RegisterRequestValidator()
- {
- RuleFor(x => x.Username)
- .NotEmpty().WithMessage("用户名不能为空")
- .Length(3, 50).WithMessage("用户名长度 3-50 个字符");
-
- RuleFor(x => x.Email)
- .NotEmpty().WithMessage("邮箱不能为空")
- .EmailAddress().WithMessage("邮箱格式不正确");
-
- RuleFor(x => x.Password)
- .NotEmpty().WithMessage("密码不能为空")
- .Length(6, 100).WithMessage("密码长度 6-100 个字符");
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Auth/RevokeTokenEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Auth/RevokeTokenEndpoint.cs
deleted file mode 100644
index b3970cd..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Auth/RevokeTokenEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using BuildFlow.Platform.Application.Auth.Commands;
-using BuildFlow.Platform.Application.Auth.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Auth;
-
-
-///
-/// 吊销令牌端点。
-///
-public class RevokeTokenEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/auth/revoke");
- }
-
- public override async Task HandleAsync(RevokeTokenRequest req, CancellationToken ct)
- {
- await mediator.Send(new RevokeTokenCommand(req.RefreshToken), ct);
- await Send.OkAsync(true, ct);
- }
-}
-
-/// 吊销刷新令牌请求校验。
diff --git a/src/BuildFlow.Host/Endpoints/platform/Auth/RevokeTokenRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Auth/RevokeTokenRequestValidator.cs
deleted file mode 100644
index 5af69a8..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Auth/RevokeTokenRequestValidator.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using BuildFlow.Platform.Application.Auth.DTOs;
-
-namespace BuildFlow.Host.Endpoints.Platform.Auth;
-
-///
-/// 吊销令牌Request的请求校验器(FluentValidation)。
-///
-public class RevokeTokenRequestValidator : Validator
-{
- public RevokeTokenRequestValidator()
- {
- RuleFor(x => x.RefreshToken)
- .NotEmpty().WithMessage("RefreshToken 不能为空");
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Auth/UpdateProfileEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Auth/UpdateProfileEndpoint.cs
deleted file mode 100644
index d9b50f4..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Auth/UpdateProfileEndpoint.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using BuildFlow.Platform.Application.Auth.Commands;
-using BuildFlow.Platform.Application.Auth.Queries;
-using BuildFlow.Shared.Domain.Common;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Auth;
-
-///
-/// 更新当前用户个人资料(姓名、头像、简介)。
-/// PUT /api/user/profile
-///
-public class UpdateProfileEndpoint(IMediator mediator, ICurrentUserContext userContext)
- : Endpoint
-{
- public override void Configure()
- {
- Put("/user/profile");
- }
-
- public override async Task HandleAsync(UpdateProfileRequest req, CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserId();
- var result = await mediator.Send(new UpdateProfileCommand(
- UserId: userId,
- RealName: req.RealName,
- Avatar: req.Avatar,
- Description: req.Description), ct);
-
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Auth/UpdateProfileRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Auth/UpdateProfileRequest.cs
deleted file mode 100644
index 0e3526d..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Auth/UpdateProfileRequest.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Auth;
-
-/// 更新个人资料请求。三个字段均可选,仅更新非 null 的字段。
-public class UpdateProfileRequest
-{
- /// 真实姓名(可选)。
- public string? RealName { get; set; }
-
- /// 头像 URL(可选)。
- public string? Avatar { get; set; }
-
- /// 个人简介(可选)。
- public string? Description { get; set; }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Menus/CreateMenuEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Menus/CreateMenuEndpoint.cs
deleted file mode 100644
index b43f321..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Menus/CreateMenuEndpoint.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-using BuildFlow.Platform.Application.Menus.Commands;
-using BuildFlow.Platform.Application.Menus.DTOs;
-using BuildFlow.Platform.Domain.Enums;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Menus;
-
-///
-/// 创建菜单端点。
-///
-public class CreateMenuEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/menus");
- Permissions("menu:create");
- }
-
- public override async Task HandleAsync(CreateMenuRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new CreateMenuCommand
- {
- ParentId = req.ParentId,
- Name = req.Name,
- Path = req.Path,
- Component = req.Component,
- Redirect = req.Redirect,
- RenderType = MenuRuntimeFieldParser.ParseRenderType(req.RenderType) ?? MenuRenderType.Route,
- FormDefinitionId = req.FormDefinitionId,
- RuntimeViewMode = MenuRuntimeFieldParser.ParseRuntimeViewMode(req.RuntimeViewMode) ?? MenuRuntimeViewMode.List,
- Title = req.Title,
- Code = req.Code,
- Icon = req.Icon,
- ActiveIcon = req.ActiveIcon,
- Order = req.Order,
- HideInMenu = req.HideInMenu,
- KeepAlive = req.KeepAlive,
- AffixTab = req.AffixTab,
- Link = req.Link,
- NoBasicLayout = req.NoBasicLayout,
- MenuVisibleWithForbidden = req.MenuVisibleWithForbidden,
- Authority = req.Authority,
- }, ct);
- await Send.ResponseAsync(result, 201, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Menus/CreateMenuRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Menus/CreateMenuRequestValidator.cs
deleted file mode 100644
index 7960fea..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Menus/CreateMenuRequestValidator.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using BuildFlow.Platform.Application.Menus.DTOs;
-
-namespace BuildFlow.Host.Endpoints.Platform.Menus;
-
-///
-/// 创建菜单请求校验。
-///
-public class CreateMenuRequestValidator : Validator
-{
- public CreateMenuRequestValidator()
- {
- // Name 可选:留空时由后端根据 Code 派生,无需用户填写。
- When(x => x.Name is not null, () =>
- {
- RuleFor(x => x.Name!).MaximumLength(100).WithMessage("菜单路由名称长度不能超过 100 个字符");
- });
- RuleFor(x => x.Path).NotEmpty().WithMessage("路由路径不能为空")
- .MaximumLength(200).WithMessage("路由路径长度不能超过 200 个字符");
- RuleFor(x => x.Title).NotEmpty().WithMessage("菜单标题不能为空")
- .MaximumLength(100).WithMessage("菜单标题长度不能超过 100 个字符");
- When(x => x.Component is not null, () =>
- {
- RuleFor(x => x.Component!).MaximumLength(200).WithMessage("组件路径长度不能超过 200 个字符");
- });
- When(x => x.Authority is not null, () =>
- {
- RuleFor(x => x.Authority!).MaximumLength(200).WithMessage("Authority 长度不能超过 200 个字符");
- });
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Menus/DeleteMenuEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Menus/DeleteMenuEndpoint.cs
deleted file mode 100644
index 3c9dc56..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Menus/DeleteMenuEndpoint.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using BuildFlow.Platform.Application.Menus.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Menus;
-
-///
-/// 删除菜单端点。
-///
-public class DeleteMenuEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Delete("/menus/{Id}");
- Permissions("menu:delete");
- }
-
- public override async Task HandleAsync(DeleteMenuEndpointRequest req, CancellationToken ct)
- {
- await mediator.Send(new DeleteMenuCommand(req.Id), ct);
- await Send.OkAsync(true, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Menus/DeleteMenuEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Menus/DeleteMenuEndpointRequest.cs
deleted file mode 100644
index 499cb40..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Menus/DeleteMenuEndpointRequest.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Menus;
-
-///
-/// 删除菜单请求体。携带路由 Id。
-///
-public record DeleteMenuEndpointRequest(long Id);
diff --git a/src/BuildFlow.Host/Endpoints/platform/Menus/DeleteMenuEndpointRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Menus/DeleteMenuEndpointRequestValidator.cs
deleted file mode 100644
index 296a62d..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Menus/DeleteMenuEndpointRequestValidator.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Menus;
-
-///
-/// 删除菜单请求校验。
-///
-public class DeleteMenuEndpointRequestValidator : Validator
-{
- public DeleteMenuEndpointRequestValidator()
- {
- RuleFor(x => x.Id).NotEmpty().WithMessage("菜单 ID 不能为空");
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Menus/GetAllMenusEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Menus/GetAllMenusEndpoint.cs
deleted file mode 100644
index 7cba30b..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Menus/GetAllMenusEndpoint.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using BuildFlow.Platform.Application.Menus.DTOs;
-using BuildFlow.Platform.Application.Menus.Queries;
-using BuildFlow.Shared.Domain.Common;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Menus;
-
-///
-/// GetAll菜单s端点。
-///
-public class GetAllMenusEndpoint(IMediator mediator, ICurrentUserContext userContext) : EndpointWithoutRequest>
-{
- public override void Configure()
- {
- Get("/menu/all");
- }
-
- public override async Task HandleAsync(CancellationToken ct)
- {
- var userId = userContext.GetRequiredUserId();
- var menus = await mediator.Send(new GetAllMenusQuery(userId), ct);
- await Send.OkAsync(menus, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Menus/GetMenuByIdEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Menus/GetMenuByIdEndpoint.cs
deleted file mode 100644
index 90a03de..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Menus/GetMenuByIdEndpoint.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using BuildFlow.Platform.Application.Menus.DTOs;
-using BuildFlow.Platform.Application.Menus.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Menus;
-
-///
-/// 按主键查询单个菜单端点。
-///
-public class GetMenuByIdEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Get("/menus/{Id}");
- Permissions("menu:read");
- }
-
- public override async Task HandleAsync(GetMenuByIdRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new GetMenuByIdQuery(req.Id), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Menus/GetMenuByIdRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Menus/GetMenuByIdRequest.cs
deleted file mode 100644
index 9b8fcc4..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Menus/GetMenuByIdRequest.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Menus;
-
-///
-/// 按主键查询菜单请求体。携带路由 Id。
-///
-public record GetMenuByIdRequest(long Id);
diff --git a/src/BuildFlow.Host/Endpoints/platform/Menus/GetMenuByIdRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Menus/GetMenuByIdRequestValidator.cs
deleted file mode 100644
index dc8dfaf..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Menus/GetMenuByIdRequestValidator.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Menus;
-
-///
-/// 按主键查询菜单请求校验。
-///
-public class GetMenuByIdRequestValidator : Validator
-{
- public GetMenuByIdRequestValidator()
- {
- RuleFor(x => x.Id).NotEmpty().WithMessage("菜单 ID 不能为空");
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Menus/GetMenuTreeEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Menus/GetMenuTreeEndpoint.cs
deleted file mode 100644
index b708816..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Menus/GetMenuTreeEndpoint.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using BuildFlow.Platform.Application.Menus.DTOs;
-using BuildFlow.Platform.Application.Menus.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Menus;
-
-///
-/// 菜单管理树端点。返回全部菜单,不做角色过滤,供管理端展示。
-///
-public class GetMenuTreeEndpoint(IMediator mediator) : EndpointWithoutRequest>
-{
- public override void Configure()
- {
- Get("/menu/tree");
- Permissions("menu:read");
- }
-
- public override async Task HandleAsync(CancellationToken ct)
- {
- var tree = await mediator.Send(new GetMenuTreeQuery(), ct);
- await Send.OkAsync(tree, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Menus/SortMenusEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Menus/SortMenusEndpoint.cs
deleted file mode 100644
index ffcb3b0..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Menus/SortMenusEndpoint.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using BuildFlow.Platform.Application.Menus.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Menus;
-
-///
-/// 批量排序菜单端点。供菜单管理页拖拽排序(同级调整 + 跨层级移动)落库使用。
-/// 路由 PUT /menus/sort,需 menu:update 权限,事务内原子更新多个菜单的 ParentId 与 Order。
-///
-public class SortMenusEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Put("/menus/sort");
- Permissions("menu:update");
- }
-
- public override async Task HandleAsync(SortMenusEndpointRequest req, CancellationToken ct)
- {
- var items = req.Items
- .Select(i => new MenuSortItem(i.Id, i.ParentId, i.Order))
- .ToList();
-
- var affected = await mediator.Send(new SortMenusCommand(items), ct);
- await Send.OkAsync(affected, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Menus/SortMenusEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Menus/SortMenusEndpointRequest.cs
deleted file mode 100644
index c005255..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Menus/SortMenusEndpointRequest.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Menus;
-
-///
-/// 批量排序菜单请求体。
-///
-public record SortMenusEndpointRequest(List Items);
diff --git a/src/BuildFlow.Host/Endpoints/platform/Menus/SortMenusEndpointRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Menus/SortMenusEndpointRequestValidator.cs
deleted file mode 100644
index 0a9ad96..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Menus/SortMenusEndpointRequestValidator.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Menus;
-
-///
-/// 批量排序菜单请求校验。
-///
-public class SortMenusEndpointRequestValidator : Validator
-{
- public SortMenusEndpointRequestValidator()
- {
- RuleFor(x => x.Items).NotEmpty().WithMessage("排序项不能为空");
- RuleForEach(x => x.Items).ChildRules(item =>
- {
- item.RuleFor(i => i.Id).NotEmpty().WithMessage("菜单 ID 不能为空");
- });
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Menus/UpdateMenuEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Menus/UpdateMenuEndpoint.cs
deleted file mode 100644
index ebb66ee..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Menus/UpdateMenuEndpoint.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-using BuildFlow.Platform.Application.Menus.Commands;
-using BuildFlow.Platform.Application.Menus.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Menus;
-
-///
-/// 更新菜单端点。
-///
-public class UpdateMenuEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Put("/menus/{Id}");
- Permissions("menu:update");
- }
-
- public override async Task HandleAsync(UpdateMenuEndpointRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new UpdateMenuCommand
- {
- Id = req.Id,
- ParentId = req.ParentId,
- Name = req.Name,
- Path = req.Path,
- Component = req.Component,
- Redirect = req.Redirect,
- RenderType = MenuRuntimeFieldParser.ParseRenderType(req.RenderType),
- FormDefinitionId = req.FormDefinitionId,
- RuntimeViewMode = MenuRuntimeFieldParser.ParseRuntimeViewMode(req.RuntimeViewMode),
- Title = req.Title,
- Code = req.Code,
- Icon = req.Icon,
- ActiveIcon = req.ActiveIcon,
- Order = req.Order,
- HideInMenu = req.HideInMenu,
- KeepAlive = req.KeepAlive,
- AffixTab = req.AffixTab,
- Link = req.Link,
- NoBasicLayout = req.NoBasicLayout,
- MenuVisibleWithForbidden = req.MenuVisibleWithForbidden,
- Authority = req.Authority,
- }, ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Menus/UpdateMenuEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Menus/UpdateMenuEndpointRequest.cs
deleted file mode 100644
index 2384651..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Menus/UpdateMenuEndpointRequest.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Menus;
-
-///
-/// 更新菜单请求体。携带路由 Id。
-///
-public record UpdateMenuEndpointRequest(
- long Id,
- long? ParentId,
- string? Name,
- string? Path,
- string? Component,
- string? Redirect,
- string? RenderType,
- Guid? FormDefinitionId,
- string? RuntimeViewMode,
- string? Title,
- string? Code,
- string? Icon,
- string? ActiveIcon,
- int? Order,
- bool? HideInMenu,
- bool? KeepAlive,
- bool? AffixTab,
- string? Link,
- bool? NoBasicLayout,
- bool? MenuVisibleWithForbidden,
- string? Authority);
diff --git a/src/BuildFlow.Host/Endpoints/platform/Menus/UpdateMenuEndpointRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Menus/UpdateMenuEndpointRequestValidator.cs
deleted file mode 100644
index ed6a750..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Menus/UpdateMenuEndpointRequestValidator.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Menus;
-
-///
-/// 更新菜单请求校验。
-///
-public class UpdateMenuEndpointRequestValidator : Validator
-{
- public UpdateMenuEndpointRequestValidator()
- {
- RuleFor(x => x.Id).NotEmpty().WithMessage("菜单 ID 不能为空");
- When(x => x.Name is not null, () =>
- {
- RuleFor(x => x.Name!).MaximumLength(100).WithMessage("菜单路由名称长度不能超过 100 个字符");
- });
- When(x => x.Path is not null, () =>
- {
- RuleFor(x => x.Path!).MaximumLength(200).WithMessage("路由路径长度不能超过 200 个字符");
- });
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Notifications/GetNotificationsEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Notifications/GetNotificationsEndpoint.cs
deleted file mode 100644
index 1e08e44..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Notifications/GetNotificationsEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using BuildFlow.Platform.Application.Notifications.DTOs;
-using BuildFlow.Platform.Application.Notifications.Queries;
-using BuildFlow.Shared.Domain.Common;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Notifications;
-
-/// 获取当前用户的通知列表(分页,可只看未读)。
-public class GetNotificationsEndpoint(IMediator mediator, ICurrentUserContext userContext)
- : Endpoint>
-{
- public override void Configure()
- {
- Get("/notifications");
- Permissions("notification:read");
- }
-
- public override async Task HandleAsync(GetNotificationsRequest req, CancellationToken ct)
- {
- var userId = userContext.GetRecipientId();
- var result = await mediator.Send(
- new GetNotificationsQuery(userId, req.UnreadOnly, req.PageIndex, req.PageSize), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Notifications/GetNotificationsRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Notifications/GetNotificationsRequest.cs
deleted file mode 100644
index cf5bf58..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Notifications/GetNotificationsRequest.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Notifications;
-
-///
-/// Get通知s请求体。
-///
-public record GetNotificationsRequest
-{
- public bool UnreadOnly { get; init; }
- public int PageIndex { get; init; } = 1;
- public int PageSize { get; init; } = 20;
-}
-
-/// 查询通知列表请求校验(分页参数取值范围)。
diff --git a/src/BuildFlow.Host/Endpoints/platform/Notifications/GetNotificationsRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Notifications/GetNotificationsRequestValidator.cs
deleted file mode 100644
index f5c590a..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Notifications/GetNotificationsRequestValidator.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Notifications;
-
-///
-/// Get通知sRequest的请求校验器(FluentValidation)。
-///
-public class GetNotificationsRequestValidator : Validator
-{
- public GetNotificationsRequestValidator()
- {
- RuleFor(x => x.PageIndex)
- .InclusiveBetween(1, 1000).WithMessage("页码 PageIndex 取值范围 1-1000");
-
- RuleFor(x => x.PageSize)
- .InclusiveBetween(1, 100).WithMessage("每页数量 PageSize 取值范围 1-100");
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Notifications/GetUnreadNotificationCountEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Notifications/GetUnreadNotificationCountEndpoint.cs
deleted file mode 100644
index 53dede9..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Notifications/GetUnreadNotificationCountEndpoint.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using BuildFlow.Platform.Application.Notifications.Queries;
-using BuildFlow.Shared.Domain.Common;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Notifications;
-
-/// 获取当前用户未读通知数(前端铃铛角标)。
-public class GetUnreadNotificationCountEndpoint(IMediator mediator, ICurrentUserContext userContext)
- : EndpointWithoutRequest
-{
- public override void Configure()
- {
- Get("/notifications/unread-count");
- Permissions("notification:read");
- }
-
- public override async Task HandleAsync(CancellationToken ct)
- {
- var userId = userContext.GetRecipientId();
- var count = await mediator.Send(new GetUnreadNotificationCountQuery(userId), ct);
- await Send.OkAsync(count, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Notifications/MarkAllNotificationsReadEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Notifications/MarkAllNotificationsReadEndpoint.cs
deleted file mode 100644
index 0379e4f..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Notifications/MarkAllNotificationsReadEndpoint.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using BuildFlow.Platform.Application.Notifications.Commands;
-using BuildFlow.Shared.Domain.Common;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Notifications;
-
-/// 标记当前用户所有通知为已读。
-public class MarkAllNotificationsReadEndpoint(IMediator mediator, ICurrentUserContext userContext)
- : EndpointWithoutRequest
-{
- public override void Configure()
- {
- Post("/notifications/read-all");
- Permissions("notification:read");
- }
-
- public override async Task HandleAsync(CancellationToken ct)
- {
- var userId = userContext.GetRecipientId();
- var count = await mediator.Send(new MarkAllNotificationsReadCommand(userId), ct);
- await Send.OkAsync(count, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Notifications/MarkNotificationReadEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Notifications/MarkNotificationReadEndpoint.cs
deleted file mode 100644
index 321523e..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Notifications/MarkNotificationReadEndpoint.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using BuildFlow.Platform.Application.Notifications.Commands;
-using BuildFlow.Shared.Domain.Common;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Notifications;
-
-/// 标记单条通知为已读。
-public class MarkNotificationReadEndpoint(IMediator mediator, ICurrentUserContext userContext)
- : EndpointWithoutRequest
-{
- public override void Configure()
- {
- Post("/notifications/{Id}/read");
- Permissions("notification:read");
- }
-
- public override async Task HandleAsync(CancellationToken ct)
- {
- var id = Route("Id");
- var userId = userContext.GetRecipientId();
- var ok = await mediator.Send(new MarkNotificationReadCommand(id, userId), ct);
- if (!ok)
- throw new NotFoundException("通知不存在");
- await Send.OkAsync(ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Notifications/NotificationEndpointsExtensions.cs b/src/BuildFlow.Host/Endpoints/platform/Notifications/NotificationEndpointsExtensions.cs
deleted file mode 100644
index 68e13e7..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Notifications/NotificationEndpointsExtensions.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using BuildFlow.Shared.Domain.Common;
-
-namespace BuildFlow.Host.Endpoints.Platform.Notifications;
-
-///
-/// 通知EndpointsExtensions扩展方法。
-///
-internal static class NotificationEndpointsExtensions
-{
- public static Guid GetRecipientId(this ICurrentUserContext ctx)
- {
- var id = ctx.GetRequiredUserId();
- return Guid.Parse(id);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Notifications/PublishNotificationEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Notifications/PublishNotificationEndpoint.cs
deleted file mode 100644
index 108d65f..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Notifications/PublishNotificationEndpoint.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using BuildFlow.Platform.Application.Notifications.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Notifications;
-
-/// 发布通知(Fanout 扇出,业务系统只需推一条消息)。
-public class PublishNotificationEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/notifications/publish");
- Permissions("notification:publish");
- }
-
- public override async Task HandleAsync(PublishNotificationRequest req, CancellationToken ct)
- {
- var count = await mediator.Send(new PublishNotificationCommand(
- req.Type, req.Title, req.Content, req.Source,
- req.RelatedId, req.RelatedType,
- req.RecipientUserIds, req.RecipientRoles), ct);
- await Send.OkAsync(count, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Notifications/PublishNotificationRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Notifications/PublishNotificationRequest.cs
deleted file mode 100644
index c822687..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Notifications/PublishNotificationRequest.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Notifications;
-
-///
-/// Publish通知请求体。
-///
-public record PublishNotificationRequest
-{
- public string Type { get; init; } = "system";
- public string Title { get; init; } = default!;
- public string Content { get; init; } = default!;
- public string Source { get; init; } = "system";
- public string? RelatedId { get; init; }
- public string? RelatedType { get; init; }
- /// 精确接收人用户 ID 列表(与 RecipientRoles 二选一或并存)。
- public List? RecipientUserIds { get; init; }
- /// 接收角色名列表(中心按角色展开为用户)。
- public List? RecipientRoles { get; init; }
-}
-
-///
-/// 发布通知请求校验。
-/// 接收人范围(RecipientUserIds / RecipientRoles)可同时为空——表示全量广播,
-/// 具体扇出语义由 PublishNotificationCommand 决定,此处仅校验必填字段与长度。
-///
diff --git a/src/BuildFlow.Host/Endpoints/platform/Notifications/PublishNotificationRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Notifications/PublishNotificationRequestValidator.cs
deleted file mode 100644
index 35a4cba..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Notifications/PublishNotificationRequestValidator.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Notifications;
-
-///
-/// Publish通知Request的请求校验器(FluentValidation)。
-///
-public class PublishNotificationRequestValidator : Validator
-{
- public PublishNotificationRequestValidator()
- {
- RuleFor(x => x.Title)
- .NotEmpty().WithMessage("通知标题不能为空")
- .MaximumLength(200).WithMessage("通知标题不能超过 200 个字符");
-
- RuleFor(x => x.Content)
- .NotEmpty().WithMessage("通知内容不能为空")
- .MaximumLength(5000).WithMessage("通知内容不能超过 5000 个字符");
-
- RuleFor(x => x.Type)
- .MaximumLength(50).WithMessage("通知类型 Type 长度不能超过 50 个字符");
-
- RuleFor(x => x.Source)
- .MaximumLength(50).WithMessage("通知来源 Source 长度不能超过 50 个字符");
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Permissions/CreatePermissionEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Permissions/CreatePermissionEndpoint.cs
deleted file mode 100644
index 7c97835..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Permissions/CreatePermissionEndpoint.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using BuildFlow.Platform.Application.Permissions.Commands;
-using BuildFlow.Platform.Application.Permissions.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Permissions;
-
-///
-/// 创建权限端点。
-///
-public class CreatePermissionEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/permissions");
- Permissions("permission:create");
- }
-
- public override async Task HandleAsync(CreatePermissionRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(
- new CreatePermissionCommand(req.Name, req.Code, req.Description, req.Group), ct);
- await Send.ResponseAsync(result, 201, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Permissions/CreatePermissionRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Permissions/CreatePermissionRequestValidator.cs
deleted file mode 100644
index 8375cfe..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Permissions/CreatePermissionRequestValidator.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using BuildFlow.Platform.Application.Permissions.DTOs;
-
-namespace BuildFlow.Host.Endpoints.Platform.Permissions;
-
-///
-/// 创建权限请求校验。
-///
-public class CreatePermissionRequestValidator : Validator
-{
- public CreatePermissionRequestValidator()
- {
- RuleFor(x => x.Name)
- .NotEmpty().WithMessage("权限名称不能为空")
- .Length(2, 50).WithMessage("权限名称长度 2-50 个字符");
- RuleFor(x => x.Code)
- .NotEmpty().WithMessage("权限编码不能为空")
- .Matches(@"^[a-z][a-z0-9-]*(:[a-z][a-z0-9-]*)+$")
- .WithMessage("权限编码格式应为 resource:action,且仅小写字母、数字、连字符");
- When(x => x.Description is not null, () =>
- {
- RuleFor(x => x.Description!).MaximumLength(500).WithMessage("权限描述长度不能超过 500 个字符");
- });
- When(x => x.Group is not null, () =>
- {
- RuleFor(x => x.Group!).MaximumLength(50).WithMessage("权限分组长度不能超过 50 个字符");
- });
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Permissions/DeletePermissionEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Permissions/DeletePermissionEndpoint.cs
deleted file mode 100644
index 86344e5..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Permissions/DeletePermissionEndpoint.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using BuildFlow.Platform.Application.Permissions.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Permissions;
-
-///
-/// 删除权限端点。
-///
-public class DeletePermissionEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Delete("/permissions/{Id}");
- Permissions("permission:delete");
- }
-
- public override async Task HandleAsync(DeletePermissionEndpointRequest req, CancellationToken ct)
- {
- await mediator.Send(new DeletePermissionCommand(req.Id), ct);
- await Send.OkAsync(true, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Permissions/DeletePermissionEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Permissions/DeletePermissionEndpointRequest.cs
deleted file mode 100644
index 241131e..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Permissions/DeletePermissionEndpointRequest.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Permissions;
-
-///
-/// 删除权限请求体。携带路由 Id。
-///
-public record DeletePermissionEndpointRequest(Guid Id);
diff --git a/src/BuildFlow.Host/Endpoints/platform/Permissions/DeletePermissionEndpointRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Permissions/DeletePermissionEndpointRequestValidator.cs
deleted file mode 100644
index 98b00c7..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Permissions/DeletePermissionEndpointRequestValidator.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Permissions;
-
-///
-/// 删除权限请求校验。
-///
-public class DeletePermissionEndpointRequestValidator : Validator
-{
- public DeletePermissionEndpointRequestValidator()
- {
- RuleFor(x => x.Id).NotEmpty().WithMessage("权限 ID 不能为空");
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionByIdEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionByIdEndpoint.cs
deleted file mode 100644
index 3c37bf7..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionByIdEndpoint.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using BuildFlow.Platform.Application.Permissions.DTOs;
-using BuildFlow.Platform.Application.Permissions.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Permissions;
-
-///
-/// 按主键查询单个权限端点。
-///
-public class GetPermissionByIdEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Get("/permissions/{Id}");
- Permissions("permission:read");
- }
-
- public override async Task HandleAsync(GetPermissionByIdRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new GetPermissionByIdQuery(req.Id), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionByIdRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionByIdRequest.cs
deleted file mode 100644
index ca645e7..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionByIdRequest.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Permissions;
-
-///
-/// 按主键查询权限请求体。携带路由 Id。
-///
-public record GetPermissionByIdRequest(Guid Id);
diff --git a/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionByIdRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionByIdRequestValidator.cs
deleted file mode 100644
index 35f8ac2..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionByIdRequestValidator.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Permissions;
-
-///
-/// 按主键查询权限请求校验。
-///
-public class GetPermissionByIdRequestValidator : Validator
-{
- public GetPermissionByIdRequestValidator()
- {
- RuleFor(x => x.Id).NotEmpty().WithMessage("权限 ID 不能为空");
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionListEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionListEndpoint.cs
deleted file mode 100644
index 559198c..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionListEndpoint.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using BuildFlow.Platform.Application.Permissions.DTOs;
-using BuildFlow.Platform.Application.Permissions.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Permissions;
-
-///
-/// 获取全部权限列表(供角色分配权限页选择)。
-/// 需 permission:read 权限——权限码本身是敏感信息,仅授权用户可见。
-///
-public class GetPermissionListEndpoint(IMediator mediator) : EndpointWithoutRequest>
-{
- public override void Configure()
- {
- Get("/permissions");
- Permissions("permission:read");
- }
-
- public override async Task HandleAsync(CancellationToken ct)
- {
- var result = await mediator.Send(new GetPermissionListQuery(), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionTreeEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionTreeEndpoint.cs
deleted file mode 100644
index 26aab35..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionTreeEndpoint.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using BuildFlow.Platform.Application.Permissions.DTOs;
-using BuildFlow.Platform.Application.Permissions.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Permissions;
-
-///
-/// 获取权限分组树。按 Group 聚合,供管理端树形表格展示。
-/// 需 permission:read 权限——权限码本身是敏感信息,仅授权用户可见。
-///
-public class GetPermissionTreeEndpoint(IMediator mediator)
- : EndpointWithoutRequest>
-{
- public override void Configure()
- {
- Get("/permission/tree");
- Permissions("permission:read");
- }
-
- public override async Task HandleAsync(CancellationToken ct)
- {
- var tree = await mediator.Send(new GetPermissionTreeQuery(), ct);
- await Send.OkAsync(tree, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Permissions/UpdatePermissionEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Permissions/UpdatePermissionEndpoint.cs
deleted file mode 100644
index fd209e6..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Permissions/UpdatePermissionEndpoint.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using BuildFlow.Platform.Application.Permissions.Commands;
-using BuildFlow.Platform.Application.Permissions.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Permissions;
-
-///
-/// 更新权限端点。编码不可改。
-///
-public class UpdatePermissionEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Put("/permissions/{Id}");
- Permissions("permission:update");
- }
-
- public override async Task HandleAsync(UpdatePermissionEndpointRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(
- new UpdatePermissionCommand(req.Id, req.Name, req.Description, req.Group), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Permissions/UpdatePermissionEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Permissions/UpdatePermissionEndpointRequest.cs
deleted file mode 100644
index df8d0b2..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Permissions/UpdatePermissionEndpointRequest.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Permissions;
-
-///
-/// 更新权限请求体。携带路由 Id。
-///
-public record UpdatePermissionEndpointRequest(Guid Id, string? Name, string? Description, string? Group);
diff --git a/src/BuildFlow.Host/Endpoints/platform/Permissions/UpdatePermissionEndpointRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Permissions/UpdatePermissionEndpointRequestValidator.cs
deleted file mode 100644
index 9c64255..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Permissions/UpdatePermissionEndpointRequestValidator.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Permissions;
-
-///
-/// 更新权限请求校验。
-///
-public class UpdatePermissionEndpointRequestValidator : Validator
-{
- public UpdatePermissionEndpointRequestValidator()
- {
- RuleFor(x => x.Id).NotEmpty().WithMessage("权限 ID 不能为空");
- When(x => x.Name is not null, () =>
- {
- RuleFor(x => x.Name!).Length(2, 50).WithMessage("权限名称长度 2-50 个字符");
- });
- When(x => x.Description is not null, () =>
- {
- RuleFor(x => x.Description!).MaximumLength(500).WithMessage("权限描述长度不能超过 500 个字符");
- });
- When(x => x.Group is not null, () =>
- {
- RuleFor(x => x.Group!).MaximumLength(50).WithMessage("权限分组长度不能超过 50 个字符");
- });
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Roles/AssignPermissionsEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Roles/AssignPermissionsEndpoint.cs
deleted file mode 100644
index 71437b8..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Roles/AssignPermissionsEndpoint.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using BuildFlow.Platform.Application.Roles.Commands;
-using BuildFlow.Platform.Application.Roles.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Roles;
-
-
-///
-/// Assign权限s端点。
-///
-public class AssignPermissionsEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/roles/{RoleId}/permissions");
- Permissions("role:assign-permission");
- }
-
- public override async Task HandleAsync(AssignPermissionsEndpointRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new AssignPermissionsCommand(req.RoleId, req.PermissionIds), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Roles/AssignPermissionsEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Roles/AssignPermissionsEndpointRequest.cs
deleted file mode 100644
index 8d6fb10..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Roles/AssignPermissionsEndpointRequest.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Roles;
-
-///
-/// Assign权限sEndpoint请求体。
-///
-public record AssignPermissionsEndpointRequest(Guid RoleId, List PermissionIds);
-
-/// 给角色分配权限请求校验。
diff --git a/src/BuildFlow.Host/Endpoints/platform/Roles/AssignPermissionsEndpointRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Roles/AssignPermissionsEndpointRequestValidator.cs
deleted file mode 100644
index d0364e4..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Roles/AssignPermissionsEndpointRequestValidator.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Roles;
-
-///
-/// Assign权限sEndpointRequest的请求校验器(FluentValidation)。
-///
-public class AssignPermissionsEndpointRequestValidator : Validator
-{
- public AssignPermissionsEndpointRequestValidator()
- {
- RuleFor(x => x.RoleId).NotEmpty().WithMessage("角色 ID 不能为空");
- RuleFor(x => x.PermissionIds)
- .NotEmpty().WithMessage("权限列表不能为空");
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Roles/CreateRoleEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Roles/CreateRoleEndpoint.cs
deleted file mode 100644
index 0ded8a9..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Roles/CreateRoleEndpoint.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using BuildFlow.Platform.Application.Roles.Commands;
-using BuildFlow.Platform.Application.Roles.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Roles;
-
-
-///
-/// Create角色端点。
-///
-public class CreateRoleEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/roles");
- Permissions("role:create");
- }
-
- public override async Task HandleAsync(CreateRoleRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new CreateRoleCommand(req.Name, req.Description), ct);
- await Send.ResponseAsync(result, 201, ct);
- }
-}
-
-/// 创建角色请求校验。
diff --git a/src/BuildFlow.Host/Endpoints/platform/Roles/CreateRoleRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Roles/CreateRoleRequestValidator.cs
deleted file mode 100644
index 0b266a0..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Roles/CreateRoleRequestValidator.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using BuildFlow.Platform.Application.Roles.DTOs;
-
-namespace BuildFlow.Host.Endpoints.Platform.Roles;
-
-///
-/// Create角色Request的请求校验器(FluentValidation)。
-///
-public class CreateRoleRequestValidator : Validator
-{
- public CreateRoleRequestValidator()
- {
- RuleFor(x => x.Name)
- .NotEmpty().WithMessage("角色名称不能为空")
- .Length(2, 50).WithMessage("角色名称长度 2-50 个字符");
-
- When(x => x.Description is not null, () =>
- {
- RuleFor(x => x.Description!)
- .MaximumLength(500).WithMessage("角色描述长度不能超过 500 个字符");
- });
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Roles/DeleteRoleEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Roles/DeleteRoleEndpoint.cs
deleted file mode 100644
index b2f4fb9..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Roles/DeleteRoleEndpoint.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using BuildFlow.Platform.Application.Roles.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Roles;
-
-
-///
-/// Delete角色端点。
-///
-public class DeleteRoleEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Delete("/roles/{Id}");
- Permissions("role:delete");
- }
-
- public override async Task HandleAsync(DeleteRoleEndpointRequest req, CancellationToken ct)
- {
- await mediator.Send(new DeleteRoleCommand(req.Id), ct);
- await Send.OkAsync(true, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Roles/DeleteRoleEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Roles/DeleteRoleEndpointRequest.cs
deleted file mode 100644
index 446f8ec..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Roles/DeleteRoleEndpointRequest.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Roles;
-
-///
-/// Delete角色Endpoint请求体。
-///
-public record DeleteRoleEndpointRequest(Guid Id);
-
-/// 删除角色请求校验(Id 由路由提供)。
diff --git a/src/BuildFlow.Host/Endpoints/platform/Roles/DeleteRoleEndpointRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Roles/DeleteRoleEndpointRequestValidator.cs
deleted file mode 100644
index 81a30d2..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Roles/DeleteRoleEndpointRequestValidator.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Roles;
-
-///
-/// Delete角色EndpointRequest的请求校验器(FluentValidation)。
-///
-public class DeleteRoleEndpointRequestValidator : Validator
-{
- public DeleteRoleEndpointRequestValidator()
- {
- RuleFor(x => x.Id).NotEmpty().WithMessage("角色 ID 不能为空");
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Roles/GetRoleByIdEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Roles/GetRoleByIdEndpoint.cs
deleted file mode 100644
index a310074..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Roles/GetRoleByIdEndpoint.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using BuildFlow.Platform.Application.Roles.DTOs;
-using BuildFlow.Platform.Application.Roles.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Roles;
-
-
-///
-/// Get角色ById端点。
-///
-public class GetRoleByIdEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Get("/roles/{Id}");
- Permissions("role:read");
- }
-
- public override async Task HandleAsync(GetRoleByIdRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new GetRoleByIdQuery(req.Id), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Roles/GetRoleByIdRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Roles/GetRoleByIdRequest.cs
deleted file mode 100644
index 8bdbd17..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Roles/GetRoleByIdRequest.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Roles;
-
-///
-/// Get角色ById请求体。
-///
-public record GetRoleByIdRequest(Guid Id);
-
-/// 根据角色 ID 查询请求校验(Id 由路由提供)。
diff --git a/src/BuildFlow.Host/Endpoints/platform/Roles/GetRoleByIdRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Roles/GetRoleByIdRequestValidator.cs
deleted file mode 100644
index 86ecace..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Roles/GetRoleByIdRequestValidator.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Roles;
-
-///
-/// Get角色ByIdRequest的请求校验器(FluentValidation)。
-///
-public class GetRoleByIdRequestValidator : Validator
-{
- public GetRoleByIdRequestValidator()
- {
- RuleFor(x => x.Id).NotEmpty().WithMessage("角色 ID 不能为空");
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Roles/GetRoleListEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Roles/GetRoleListEndpoint.cs
deleted file mode 100644
index a495061..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Roles/GetRoleListEndpoint.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using BuildFlow.Platform.Application.Roles.DTOs;
-using BuildFlow.Platform.Application.Roles.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Roles;
-
-///
-/// Get角色List端点。
-///
-public class GetRoleListEndpoint(IMediator mediator) : EndpointWithoutRequest>
-{
- public override void Configure()
- {
- Get("/roles");
- Permissions("role:read");
- }
-
- public override async Task HandleAsync(CancellationToken ct)
- {
- var result = await mediator.Send(new GetRoleListQuery(), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Roles/UpdateRoleEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Roles/UpdateRoleEndpoint.cs
deleted file mode 100644
index 05dfac7..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Roles/UpdateRoleEndpoint.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using BuildFlow.Platform.Application.Roles.Commands;
-using BuildFlow.Platform.Application.Roles.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Roles;
-
-
-///
-/// Update角色端点。
-///
-public class UpdateRoleEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Put("/roles/{Id}");
- Permissions("role:update");
- }
-
- public override async Task HandleAsync(UpdateRoleEndpointRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new UpdateRoleCommand(req.Id, req.Name, req.Description), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Roles/UpdateRoleEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Roles/UpdateRoleEndpointRequest.cs
deleted file mode 100644
index 947a922..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Roles/UpdateRoleEndpointRequest.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Roles;
-
-///
-/// Update角色Endpoint请求体。
-///
-public record UpdateRoleEndpointRequest(Guid Id, string? Name, string? Description);
-
-/// 更新角色请求校验。Name 为可选更新字段,仅当提供时校验长度。
diff --git a/src/BuildFlow.Host/Endpoints/platform/Roles/UpdateRoleEndpointRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Roles/UpdateRoleEndpointRequestValidator.cs
deleted file mode 100644
index a413276..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Roles/UpdateRoleEndpointRequestValidator.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Roles;
-
-///
-/// Update角色EndpointRequest的请求校验器(FluentValidation)。
-///
-public class UpdateRoleEndpointRequestValidator : Validator
-{
- public UpdateRoleEndpointRequestValidator()
- {
- RuleFor(x => x.Id).NotEmpty().WithMessage("角色 ID 不能为空");
-
- When(x => x.Name is not null, () =>
- {
- RuleFor(x => x.Name!)
- .Length(2, 50).WithMessage("角色名称长度 2-50 个字符");
- });
-
- When(x => x.Description is not null, () =>
- {
- RuleFor(x => x.Description!)
- .MaximumLength(500).WithMessage("角色描述长度不能超过 500 个字符");
- });
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Users/AssignRolesEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Users/AssignRolesEndpoint.cs
deleted file mode 100644
index 0f7c407..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Users/AssignRolesEndpoint.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using BuildFlow.Platform.Application.Users.Commands;
-using BuildFlow.Platform.Application.Users.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Users;
-
-
-///
-/// Assign角色s端点。
-///
-public class AssignRolesEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/users/{UserId}/roles");
- Permissions("user:assign-role");
- }
-
- public override async Task HandleAsync(AssignRolesEndpointRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new AssignRolesCommand(req.UserId, req.RoleIds), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Users/AssignRolesEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Users/AssignRolesEndpointRequest.cs
deleted file mode 100644
index decb6b1..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Users/AssignRolesEndpointRequest.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Users;
-
-///
-/// Assign角色sEndpoint请求体。
-///
-public record AssignRolesEndpointRequest(Guid UserId, List RoleIds);
-
-/// 给用户分配角色请求校验。
diff --git a/src/BuildFlow.Host/Endpoints/platform/Users/AssignRolesEndpointRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Users/AssignRolesEndpointRequestValidator.cs
deleted file mode 100644
index bf1f367..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Users/AssignRolesEndpointRequestValidator.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Users;
-
-///
-/// Assign角色sEndpointRequest的请求校验器(FluentValidation)。
-///
-public class AssignRolesEndpointRequestValidator : Validator
-{
- public AssignRolesEndpointRequestValidator()
- {
- RuleFor(x => x.UserId).NotEmpty().WithMessage("用户 ID 不能为空");
- RuleFor(x => x.RoleIds)
- .NotEmpty().WithMessage("角色列表不能为空");
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Users/CreateUserEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Users/CreateUserEndpoint.cs
deleted file mode 100644
index 02ea7cd..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Users/CreateUserEndpoint.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using BuildFlow.Platform.Application.Users.Commands;
-using BuildFlow.Platform.Application.Users.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Users;
-
-
-///
-/// Create用户端点。
-///
-public class CreateUserEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/users");
- Permissions("user:create");
- }
-
- public override async Task HandleAsync(CreateUserRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new CreateUserCommand(req.Username, req.Email, req.Password), ct);
- await Send.ResponseAsync(result, 201, ct);
- }
-}
-
-/// 管理员创建用户请求校验。
diff --git a/src/BuildFlow.Host/Endpoints/platform/Users/CreateUserRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Users/CreateUserRequestValidator.cs
deleted file mode 100644
index 826b1b0..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Users/CreateUserRequestValidator.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using BuildFlow.Platform.Application.Users.DTOs;
-
-namespace BuildFlow.Host.Endpoints.Platform.Users;
-
-///
-/// Create用户Request的请求校验器(FluentValidation)。
-///
-public class CreateUserRequestValidator : Validator
-{
- public CreateUserRequestValidator()
- {
- RuleFor(x => x.Username)
- .NotEmpty().WithMessage("用户名不能为空")
- .Length(3, 50).WithMessage("用户名长度 3-50 个字符");
-
- RuleFor(x => x.Email)
- .NotEmpty().WithMessage("邮箱不能为空")
- .EmailAddress().WithMessage("邮箱格式不正确");
-
- RuleFor(x => x.Password)
- .NotEmpty().WithMessage("密码不能为空")
- .Length(6, 100).WithMessage("密码长度 6-100 个字符");
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Users/DeleteUserEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Users/DeleteUserEndpoint.cs
deleted file mode 100644
index 83daebd..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Users/DeleteUserEndpoint.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using BuildFlow.Platform.Application.Users.Commands;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Users;
-
-
-///
-/// Delete用户端点。
-///
-public class DeleteUserEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Delete("/users/{Id}");
- Permissions("user:delete");
- }
-
- public override async Task HandleAsync(DeleteUserEndpointRequest req, CancellationToken ct)
- {
- await mediator.Send(new DeleteUserCommand(req.Id), ct);
- await Send.OkAsync(true, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Users/DeleteUserEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Users/DeleteUserEndpointRequest.cs
deleted file mode 100644
index 85c8c4e..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Users/DeleteUserEndpointRequest.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Users;
-
-///
-/// Delete用户Endpoint请求体。
-///
-public record DeleteUserEndpointRequest(Guid Id);
-
-/// 删除用户请求校验(Id 由路由提供)。
diff --git a/src/BuildFlow.Host/Endpoints/platform/Users/DeleteUserEndpointRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Users/DeleteUserEndpointRequestValidator.cs
deleted file mode 100644
index 76c53fb..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Users/DeleteUserEndpointRequestValidator.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Users;
-
-///
-/// Delete用户EndpointRequest的请求校验器(FluentValidation)。
-///
-public class DeleteUserEndpointRequestValidator : Validator
-{
- public DeleteUserEndpointRequestValidator()
- {
- RuleFor(x => x.Id).NotEmpty().WithMessage("用户 ID 不能为空");
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Users/GetUserByIdEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Users/GetUserByIdEndpoint.cs
deleted file mode 100644
index 25c2192..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Users/GetUserByIdEndpoint.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using BuildFlow.Platform.Application.Users.DTOs;
-using BuildFlow.Platform.Application.Users.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Users;
-
-
-///
-/// Get用户ById端点。
-///
-public class GetUserByIdEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Get("/users/{Id}");
- Permissions("user:read");
- }
-
- public override async Task HandleAsync(GetUserByIdRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new GetUserByIdQuery(req.Id), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Users/GetUserByIdRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Users/GetUserByIdRequest.cs
deleted file mode 100644
index 82c8ec6..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Users/GetUserByIdRequest.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Users;
-
-///
-/// Get用户ById请求体。
-///
-public record GetUserByIdRequest(Guid Id);
-
-/// 根据用户 ID 查询请求校验(Id 由路由提供)。
diff --git a/src/BuildFlow.Host/Endpoints/platform/Users/GetUserByIdRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Users/GetUserByIdRequestValidator.cs
deleted file mode 100644
index 63fa4d1..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Users/GetUserByIdRequestValidator.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Users;
-
-///
-/// Get用户ByIdRequest的请求校验器(FluentValidation)。
-///
-public class GetUserByIdRequestValidator : Validator
-{
- public GetUserByIdRequestValidator()
- {
- RuleFor(x => x.Id).NotEmpty().WithMessage("用户 ID 不能为空");
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Users/GetUserListEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Users/GetUserListEndpoint.cs
deleted file mode 100644
index 709db40..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Users/GetUserListEndpoint.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using BuildFlow.Platform.Application.Users.DTOs;
-using BuildFlow.Platform.Application.Users.Queries;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Users;
-
-
-///
-/// Get用户List端点。
-///
-public class GetUserListEndpoint(IMediator mediator) : Endpoint>
-{
- public override void Configure()
- {
- Get("/users");
- Permissions("user:read");
- }
-
- public override async Task HandleAsync(GetUserListRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new GetUserListQuery(req.Search), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Users/GetUserListRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Users/GetUserListRequest.cs
deleted file mode 100644
index c79fdf9..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Users/GetUserListRequest.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Users;
-
-///
-/// Get用户List请求体。
-///
-public record GetUserListRequest
-{
- public string? Search { get; init; }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Users/UpdateUserEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Users/UpdateUserEndpoint.cs
deleted file mode 100644
index 019b205..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Users/UpdateUserEndpoint.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using BuildFlow.Platform.Application.Users.Commands;
-using BuildFlow.Platform.Application.Users.DTOs;
-using MediatR;
-
-namespace BuildFlow.Host.Endpoints.Platform.Users;
-
-
-///
-/// Update用户端点。
-///
-public class UpdateUserEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Put("/users/{Id}");
- Permissions("user:update");
- }
-
- public override async Task HandleAsync(UpdateUserEndpointRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new UpdateUserCommand(req.Id, req.Email, req.Password, req.IsActive), ct);
- await Send.OkAsync(result, ct);
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/platform/Users/UpdateUserEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/platform/Users/UpdateUserEndpointRequest.cs
deleted file mode 100644
index 203ec94..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Users/UpdateUserEndpointRequest.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Users;
-
-///
-/// Update用户Endpoint请求体。
-///
-public record UpdateUserEndpointRequest(Guid Id, string? Email, string? Password, bool? IsActive);
-
-/// 更新用户请求校验。Id 由路由提供;Email/Password 为可选更新字段,仅当提供时校验格式。
diff --git a/src/BuildFlow.Host/Endpoints/platform/Users/UpdateUserEndpointRequestValidator.cs b/src/BuildFlow.Host/Endpoints/platform/Users/UpdateUserEndpointRequestValidator.cs
deleted file mode 100644
index 56d0be1..0000000
--- a/src/BuildFlow.Host/Endpoints/platform/Users/UpdateUserEndpointRequestValidator.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-namespace BuildFlow.Host.Endpoints.Platform.Users;
-
-///
-/// Update用户EndpointRequest的请求校验器(FluentValidation)。
-///
-public class UpdateUserEndpointRequestValidator : Validator
-{
- public UpdateUserEndpointRequestValidator()
- {
- RuleFor(x => x.Id).NotEmpty().WithMessage("用户 ID 不能为空");
-
- When(x => x.Email is not null, () =>
- {
- RuleFor(x => x.Email!)
- .EmailAddress().WithMessage("邮箱格式不正确");
- });
-
- When(x => x.Password is not null, () =>
- {
- RuleFor(x => x.Password!)
- .Length(6, 100).WithMessage("密码长度 6-100 个字符");
- });
- }
-}
diff --git a/src/BuildFlow.Host/Endpoints/rag/AiModel/AiModelEndpoints.cs b/src/BuildFlow.Host/Endpoints/rag/AiModel/AiModelEndpoints.cs
deleted file mode 100644
index b99f533..0000000
--- a/src/BuildFlow.Host/Endpoints/rag/AiModel/AiModelEndpoints.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-using MediatR;
-using BuildFlow.Application.AiModel.Commands;
-using BuildFlow.Application.AiModel.DTOs;
-using BuildFlow.Application.AiModel.Queries;
-
-namespace BuildFlow.Host.Endpoints.Rag.AiModel;
-
-/// 查询模型列表。可选 modelType 筛选(0=Chat, 1=Embedding)。
-public class GetAiModelsEndpoint(IMediator mediator) : EndpointWithoutRequest>
-{
- public override void Configure()
- {
- Get("/ai/models");
- Permissions("ai-model:read");
- }
-
- public override async Task HandleAsync(CancellationToken ct)
- {
- // Query 第三参数 isRequired=false,让 modelType 成为可选参数
- var modelType = Query("modelType", false);
- var result = await mediator.Send(new GetAiModelsQuery(modelType), ct);
- await Send.OkAsync(result, ct);
- }
-}
-
-/// 新建模型。
-public class CreateAiModelEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Post("/ai/models");
- Permissions("ai-model:write");
- }
-
- public override async Task HandleAsync(CreateAiModelRequest req, CancellationToken ct)
- {
- var result = await mediator.Send(new CreateAiModelCommand(
- req.Name, req.Provider, req.ModelId, req.BaseUrl, req.ApiKey,
- req.ModelType, req.IsDefault, req.Temperature, req.MaxTokens, req.DefaultInstructions), ct);
- await Send.ResponseAsync(result, 201, ct);
- }
-}
-
-/// 更新模型。
-public class UpdateAiModelEndpoint(IMediator mediator) : Endpoint
-{
- public override void Configure()
- {
- Put("/ai/models/{Id}");
- Permissions("ai-model:write");
- }
-
- public override async Task HandleAsync(UpdateAiModelRequest req, CancellationToken ct)
- {
- var id = Route("Id");
- var result = await mediator.Send(new UpdateAiModelCommand(
- id, req.Name, req.Provider, req.ModelId, req.BaseUrl, req.ApiKey,
- req.ModelType, req.IsActive, req.Temperature, req.MaxTokens, req.DefaultInstructions), ct);
- await Send.OkAsync(result, ct);
- }
-}
-
-/// 删除模型。
-public class DeleteAiModelEndpoint(IMediator mediator) : EndpointWithoutRequest