From d41c45c74d8cfbafdc649b2fcdd37986c1f1a357 Mon Sep 17 00:00:00 2001 From: xiangning Date: Fri, 17 Jul 2026 13:33:17 +0800 Subject: [PATCH] =?UTF-8?q?fix(cicd):=20=E5=88=A0=E9=99=A4=20Endpoints/=20?= =?UTF-8?q?=E5=B0=8F=E5=86=99=E9=87=8D=E5=A4=8D=E7=9B=AE=E5=BD=95=EF=BC=8C?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=20PascalCase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 小写目录是大写目录内容完全一致的冗余副本,Linux 构建 duplicate items --- .../file/Buckets/CreateBucketEndpoint.cs | 25 ----- .../file/Buckets/CreateBucketRequest.cs | 7 -- .../file/Buckets/DeleteBucketEndpoint.cs | 25 ----- .../file/Buckets/DeleteBucketRequest.cs | 7 -- .../file/Buckets/ListBucketsEndpoint.cs | 24 ----- .../Endpoints/file/Files/CheckFileEndpoint.cs | 25 ----- .../Endpoints/file/Files/CheckFileRequest.cs | 10 -- .../file/Files/DeleteFileEndpoint.cs | 25 ----- .../Endpoints/file/Files/DeleteFileRequest.cs | 7 -- .../file/Files/DownloadFileEndpoint.cs | 45 --------- .../file/Files/DownloadFileRequest.cs | 7 -- .../file/Files/GetFileContentEndpoint.cs | 26 ----- .../file/Files/GetFileContentRequest.cs | 7 -- .../file/Files/GetFilePreviewEndpoint.cs | 43 --------- .../file/Files/GetFilePreviewRequest.cs | 19 ---- .../file/Files/GetOfficePreviewEndpoint.cs | 28 ------ .../file/Files/GetOfficePreviewRequest.cs | 7 -- .../Endpoints/file/Files/ListFilesEndpoint.cs | 26 ----- .../Endpoints/file/Files/ListFilesRequest.cs | 9 -- .../file/Files/UploadFileEndpoint.cs | 29 ------ .../Endpoints/file/Files/UploadFileRequest.cs | 10 -- .../file/Folders/CreateFolderEndpoint.cs | 27 ------ .../file/Folders/CreateFolderRequest.cs | 8 -- .../file/Folders/DeleteFolderEndpoint.cs | 25 ----- .../file/Folders/DeleteFolderRequest.cs | 7 -- .../file/Folders/GetFolderEndpoint.cs | 25 ----- .../file/Folders/GetFolderRequest.cs | 7 -- .../file/Folders/GetFolderTreeEndpoint.cs | 25 ----- .../file/Folders/GetRootFilesEndpoint.cs | 26 ----- .../file/Folders/MoveFileEndpoint.cs | 26 ----- .../Endpoints/file/Folders/MoveFileRequest.cs | 8 -- .../file/Folders/RenameFolderEndpoint.cs | 26 ----- .../file/Folders/RenameFolderRequest.cs | 8 -- .../file/Folders/UploadToFolderEndpoint.cs | 29 ------ .../file/Folders/UploadToFolderRequest.cs | 11 --- .../file/Multipart/AbortMultipartEndpoint.cs | 25 ----- .../file/Multipart/AbortMultipartRequest.cs | 8 -- .../Multipart/CompleteMultipartEndpoint.cs | 27 ------ .../Multipart/CompleteMultipartRequest.cs | 13 --- .../file/Multipart/InitMultipartEndpoint.cs | 26 ----- .../file/Multipart/InitMultipartRequest.cs | 14 --- .../file/Multipart/ListPartsEndpoint.cs | 28 ------ .../file/Multipart/ListPartsRequest.cs | 8 -- .../Endpoints/file/Multipart/PartRequest.cs | 8 -- .../file/Multipart/UploadPartEndpoint.cs | 29 ------ .../file/Multipart/UploadPartRequest.cs | 10 -- .../file/Settings/GetFileSettingEndpoint.cs | 22 ----- .../Settings/UpdateDefaultBucketEndpoint.cs | 22 ----- .../Settings/UpdateDefaultBucketRequest.cs | 7 -- .../file/Shares/CreateShareEndpoint.cs | 30 ------ .../file/Shares/CreateShareRequest.cs | 11 --- .../file/Shares/DeleteShareEndpoint.cs | 25 ----- .../file/Shares/DeleteShareRequest.cs | 7 -- .../file/Shares/DownloadShareEndpoint.cs | 22 ----- .../file/Shares/DownloadShareRequest.cs | 8 -- .../file/Shares/GetShareInfoEndpoint.cs | 21 ---- .../file/Shares/GetShareInfoRequest.cs | 7 -- .../im/Chat/AddGroupMemberEndpoint.cs | 25 ----- .../im/Chat/AddGroupMemberEndpointRequest.cs | 6 -- .../Endpoints/im/Chat/CreateGroupEndpoint.cs | 25 ----- .../Chat/CreatePrivateConversationEndpoint.cs | 28 ------ .../Endpoints/im/Chat/DeleteGroupEndpoint.cs | 25 ----- .../im/Chat/DeleteGroupEndpointRequest.cs | 6 -- .../im/Chat/GetConversationsEndpoint.cs | 25 ----- .../Endpoints/im/Chat/GetGroupEndpoint.cs | 25 ----- .../im/Chat/GetGroupEndpointRequest.cs | 4 - .../im/Chat/GetGroupMembersEndpoint.cs | 26 ----- .../im/Chat/GetGroupMembersEndpointRequest.cs | 6 -- .../im/Chat/GetMessageHistoryEndpoint.cs | 27 ------ .../im/Chat/GetMessageHistoryRequest.cs | 6 -- .../im/Chat/GetUnreadCountEndpoint.cs | 25 ----- .../im/Chat/MarkConversationUnreadEndpoint.cs | 25 ----- .../im/Chat/RecallMessageEndpoint.cs | 25 ----- .../im/Chat/RecallMessageEndpointRequest.cs | 4 - .../im/Chat/RemoveGroupMemberEndpoint.cs | 25 ----- .../Chat/RemoveGroupMemberEndpointRequest.cs | 6 -- .../im/Chat/SetConversationMutedEndpoint.cs | 25 ----- .../im/Chat/SetConversationPinnedEndpoint.cs | 25 ----- .../im/Chat/SetConversationRemarkEndpoint.cs | 25 ----- .../SetConversationRemarkEndpointRequest.cs | 6 -- .../im/Chat/SetConversationStateRequest.cs | 6 -- .../Endpoints/im/Chat/UpdateGroupEndpoint.cs | 26 ----- .../im/Chat/UpdateGroupEndpointRequest.cs | 6 -- .../platform/Auth/ChangePasswordEndpoint.cs | 44 --------- .../platform/Auth/ChangePasswordRequest.cs | 11 --- .../platform/Auth/GetAccessCodesEndpoint.cs | 24 ----- .../platform/Auth/GetCurrentUserEndpoint.cs | 24 ----- .../Endpoints/platform/Auth/LoginEndpoint.cs | 37 -------- .../platform/Auth/LoginRequestValidator.cs | 21 ---- .../Endpoints/platform/Auth/LogoutEndpoint.cs | 33 ------- .../platform/Auth/RefreshTokenEndpoint.cs | 41 -------- .../platform/Auth/RegisterEndpoint.cs | 26 ----- .../platform/Auth/RegisterRequestValidator.cs | 24 ----- .../platform/Auth/RevokeTokenEndpoint.cs | 25 ----- .../Auth/RevokeTokenRequestValidator.cs | 15 --- .../platform/Auth/UpdateProfileEndpoint.cs | 31 ------ .../platform/Auth/UpdateProfileRequest.cs | 14 --- .../platform/Menus/CreateMenuEndpoint.cs | 46 --------- .../Menus/CreateMenuRequestValidator.cs | 30 ------ .../platform/Menus/DeleteMenuEndpoint.cs | 22 ----- .../Menus/DeleteMenuEndpointRequest.cs | 6 -- .../DeleteMenuEndpointRequestValidator.cs | 12 --- .../platform/Menus/GetAllMenusEndpoint.cs | 24 ----- .../platform/Menus/GetMenuByIdEndpoint.cs | 23 ----- .../platform/Menus/GetMenuByIdRequest.cs | 6 -- .../Menus/GetMenuByIdRequestValidator.cs | 12 --- .../platform/Menus/GetMenuTreeEndpoint.cs | 23 ----- .../platform/Menus/SortMenusEndpoint.cs | 27 ------ .../Menus/SortMenusEndpointRequest.cs | 6 -- .../SortMenusEndpointRequestValidator.cs | 16 ---- .../platform/Menus/UpdateMenuEndpoint.cs | 46 --------- .../Menus/UpdateMenuEndpointRequest.cs | 27 ------ .../UpdateMenuEndpointRequestValidator.cs | 20 ---- .../Notifications/GetNotificationsEndpoint.cs | 25 ----- .../Notifications/GetNotificationsRequest.cs | 13 --- .../GetNotificationsRequestValidator.cs | 16 ---- .../GetUnreadNotificationCountEndpoint.cs | 23 ----- .../MarkAllNotificationsReadEndpoint.cs | 23 ----- .../MarkNotificationReadEndpoint.cs | 26 ----- .../NotificationEndpointsExtensions.cs | 15 --- .../PublishNotificationEndpoint.cs | 23 ----- .../PublishNotificationRequest.cs | 24 ----- .../PublishNotificationRequestValidator.cs | 24 ----- .../Permissions/CreatePermissionEndpoint.cs | 24 ----- .../CreatePermissionRequestValidator.cs | 28 ------ .../Permissions/DeletePermissionEndpoint.cs | 22 ----- .../DeletePermissionEndpointRequest.cs | 6 -- ...eletePermissionEndpointRequestValidator.cs | 12 --- .../Permissions/GetPermissionByIdEndpoint.cs | 23 ----- .../Permissions/GetPermissionByIdRequest.cs | 6 -- .../GetPermissionByIdRequestValidator.cs | 12 --- .../Permissions/GetPermissionListEndpoint.cs | 24 ----- .../Permissions/GetPermissionTreeEndpoint.cs | 25 ----- .../Permissions/UpdatePermissionEndpoint.cs | 24 ----- .../UpdatePermissionEndpointRequest.cs | 6 -- ...pdatePermissionEndpointRequestValidator.cs | 24 ----- .../Roles/AssignPermissionsEndpoint.cs | 24 ----- .../Roles/AssignPermissionsEndpointRequest.cs | 8 -- ...signPermissionsEndpointRequestValidator.cs | 14 --- .../platform/Roles/CreateRoleEndpoint.cs | 26 ----- .../Roles/CreateRoleRequestValidator.cs | 22 ----- .../platform/Roles/DeleteRoleEndpoint.cs | 23 ----- .../Roles/DeleteRoleEndpointRequest.cs | 8 -- .../DeleteRoleEndpointRequestValidator.cs | 12 --- .../platform/Roles/GetRoleByIdEndpoint.cs | 24 ----- .../platform/Roles/GetRoleByIdRequest.cs | 8 -- .../Roles/GetRoleByIdRequestValidator.cs | 12 --- .../platform/Roles/GetRoleListEndpoint.cs | 23 ----- .../platform/Roles/UpdateRoleEndpoint.cs | 24 ----- .../Roles/UpdateRoleEndpointRequest.cs | 8 -- .../UpdateRoleEndpointRequestValidator.cs | 24 ----- .../platform/Users/AssignRolesEndpoint.cs | 24 ----- .../Users/AssignRolesEndpointRequest.cs | 8 -- .../AssignRolesEndpointRequestValidator.cs | 14 --- .../platform/Users/CreateUserEndpoint.cs | 26 ----- .../Users/CreateUserRequestValidator.cs | 24 ----- .../platform/Users/DeleteUserEndpoint.cs | 23 ----- .../Users/DeleteUserEndpointRequest.cs | 8 -- .../DeleteUserEndpointRequestValidator.cs | 12 --- .../platform/Users/GetUserByIdEndpoint.cs | 24 ----- .../platform/Users/GetUserByIdRequest.cs | 8 -- .../Users/GetUserByIdRequestValidator.cs | 12 --- .../platform/Users/GetUserListEndpoint.cs | 24 ----- .../platform/Users/GetUserListRequest.cs | 9 -- .../platform/Users/UpdateUserEndpoint.cs | 24 ----- .../Users/UpdateUserEndpointRequest.cs | 8 -- .../UpdateUserEndpointRequestValidator.cs | 24 ----- .../Endpoints/rag/AiModel/AiModelEndpoints.cs | 95 ------------------- .../rag/Chat/CreateConversationEndpoint.cs | 36 ------- .../rag/Chat/CreateConversationRequest.cs | 9 -- .../CreateConversationRequestValidator.cs | 14 --- .../rag/Chat/DeleteConversationEndpoint.cs | 26 ----- .../Chat/DeleteConversationEndpointRequest.cs | 8 -- ...eteConversationEndpointRequestValidator.cs | 12 --- .../rag/Chat/GetConversationDetailEndpoint.cs | 24 ----- .../rag/Chat/GetConversationDetailRequest.cs | 8 -- .../GetConversationDetailRequestValidator.cs | 12 --- .../rag/Chat/GetConversationsEndpoint.cs | 23 ----- .../Endpoints/rag/Chat/SendMessageEndpoint.cs | 25 ----- .../Endpoints/rag/Chat/SendMessageRequest.cs | 8 -- .../rag/Chat/SendMessageRequestValidator.cs | 14 --- .../rag/Chat/StreamMessageEndpoint.cs | 83 ---------------- .../rag/Chat/StreamMessageRequest.cs | 8 -- .../rag/Chat/StreamMessageRequestValidator.cs | 14 --- .../rag/Document/ChunkUploadSession.cs | 22 ----- .../rag/Document/ChunkUploadStore.cs | 13 --- .../Document/CompleteChunkUploadEndpoint.cs | 64 ------------- .../Document/CompleteChunkUploadRequest.cs | 11 --- .../CompleteChunkUploadRequestValidator.cs | 16 ---- .../rag/Document/GetDocumentChunksEndpoint.cs | 24 ----- .../Document/ImportFromFileManagerEndpoint.cs | 59 ------------ .../Document/ImportFromFileManagerRequest.cs | 23 ----- .../rag/Document/InitChunkUploadEndpoint.cs | 26 ----- .../rag/Document/InitChunkUploadRequest.cs | 13 --- .../InitChunkUploadRequestValidator.cs | 20 ---- .../rag/Document/ListDocumentsEndpoint.cs | 24 ----- .../rag/Document/ProcessDocumentEndpoint.cs | 25 ----- .../Document/ProcessKnowledgeBaseEndpoint.cs | 27 ------ .../rag/Document/UploadChunkEndpoint.cs | 43 --------- .../rag/Document/UploadDocumentEndpoint.cs | 43 --------- .../rag/Document/UploadDocumentRequest.cs | 8 -- .../UploadDocumentRequestValidator.cs | 20 ---- .../rag/Embedding/EmbedBatchEndpoint.cs | 24 ----- .../rag/Embedding/EmbedBatchRequest.cs | 8 -- .../Embedding/EmbedBatchRequestValidator.cs | 14 --- .../rag/Embedding/EmbedTextEndpoint.cs | 24 ----- .../rag/Embedding/EmbedTextRequest.cs | 8 -- .../Embedding/EmbedTextRequestValidator.cs | 14 --- .../rag/KnowledgeBase/CreateKBEndpoint.cs | 34 ------- .../CreateKnowledgeBaseRequestValidator.cs | 58 ----------- .../rag/KnowledgeBase/DeleteKBEndpoint.cs | 23 ----- .../KnowledgeBase/DeleteKBEndpointRequest.cs | 8 -- .../DeleteKBEndpointRequestValidator.cs | 12 --- .../rag/KnowledgeBase/GetKBsEndpoint.cs | 23 ----- .../rag/KnowledgeBase/UpdateKBEndpoint.cs | 33 ------- .../UpdateKnowledgeBaseRequestValidator.cs | 61 ------------ .../Obsidian/ObsidianSyncRequestValidator.cs | 20 ---- .../rag/Obsidian/SyncObsidianVaultEndpoint.cs | 36 ------- .../Endpoints/rag/RAG/RAGQueryEndpoint.cs | 28 ------ .../rag/RAG/RAGQueryRequestValidator.cs | 18 ---- .../Endpoints/rag/RAG/RAGStreamEndpoint.cs | 84 ---------------- .../CreateBuildFlowApplicationEndpoint.cs | 24 ----- .../CreateBuildFlowApplicationRequest.cs | 4 - .../GetBuildFlowApplicationListEndpoint.cs | 25 ----- .../GetBuildFlowApplicationListRequest.cs | 12 --- ...CreateBuildFlowButtonDefinitionEndpoint.cs | 40 -------- .../CreateBuildFlowButtonDefinitionRequest.cs | 22 ----- .../Buttons/ExecuteBuildFlowButtonEndpoint.cs | 22 ----- .../Buttons/ExecuteBuildFlowButtonRequest.cs | 4 - ...etBuildFlowButtonDefinitionListEndpoint.cs | 33 ------- ...GetBuildFlowButtonDefinitionListRequest.cs | 16 ---- .../CreateBuildFlowPageDefinitionEndpoint.cs | 29 ------ .../CreateBuildFlowPageDefinitionRequest.cs | 11 --- .../GetBuildFlowPageDefinitionListEndpoint.cs | 30 ------ .../GetBuildFlowPageDefinitionListRequest.cs | 13 --- .../Form/CompareFormVersionsEndpoint.cs | 33 ------- .../Form/CompareFormVersionsRequest.cs | 11 --- .../Form/CreateFormComponentEndpoint.cs | 35 ------- .../Form/CreateFormComponentRequest.cs | 14 --- .../Form/CreateFormDefinitionEndpoint.cs | 29 ------ .../Form/CreateFormDefinitionRequest.cs | 15 --- .../Form/DeleteFormComponentEndpoint.cs | 34 ------- .../Form/DeleteFormComponentRequest.cs | 9 -- .../Form/DeleteFormDefinitionEndpoint.cs | 34 ------- .../Form/DeleteFormDefinitionRequest.cs | 9 -- .../Form/DisableFormDefinitionEndpoint.cs | 30 ------ .../Form/DisableFormDefinitionRequest.cs | 9 -- .../Form/GetFormComponentByIdEndpoint.cs | 32 ------- .../Form/GetFormComponentByIdRequest.cs | 9 -- .../Form/GetFormComponentsEndpoint.cs | 33 ------- .../Form/GetFormDataByInstanceEndpoint.cs | 33 ------- .../Form/GetFormDataByInstanceRequest.cs | 9 -- .../Form/GetFormDefinitionByIdEndpoint.cs | 33 ------- .../Form/GetFormDefinitionByIdRequest.cs | 9 -- .../Form/GetFormDefinitionListEndpoint.cs | 33 ------- .../Form/GetFormDefinitionListRequest.cs | 13 --- .../workflow/Form/GetFormVersionsEndpoint.cs | 32 ------- .../Form/PublishFormDefinitionEndpoint.cs | 29 ------ .../workflow/Form/SubmitFormDataEndpoint.cs | 32 ------- .../workflow/Form/SubmitFormDataRequest.cs | 11 --- .../Form/UpdateFormComponentEndpoint.cs | 35 ------- .../Form/UpdateFormComponentRequest.cs | 15 --- .../Form/UpdateFormDefinitionEndpoint.cs | 36 ------- .../Form/UpdateFormDefinitionRequest.cs | 15 --- .../Notification/GetNotificationsEndpoint.cs | 27 ------ .../Notification/GetNotificationsRequest.cs | 11 --- .../GetUnreadNotificationCountEndpoint.cs | 24 ----- .../MarkAllNotificationsReadEndpoint.cs | 26 ----- .../MarkNotificationReadEndpoint.cs | 26 ----- .../NotificationClaimsExtensions.cs | 17 ---- .../WorkflowDefinition/CreateEdgeEndpoint.cs | 35 ------- .../WorkflowDefinition/CreateEdgeRequest.cs | 15 --- .../WorkflowDefinition/CreateNodeEndpoint.cs | 42 -------- .../WorkflowDefinition/CreateNodeRequest.cs | 15 --- .../CreateWorkflowDefinitionEndpoint.cs | 33 ------- .../CreateWorkflowDefinitionRequest.cs | 12 --- .../WorkflowDefinition/DeleteEdgeEndpoint.cs | 35 ------- .../WorkflowDefinition/DeleteEdgeRequest.cs | 10 -- .../WorkflowDefinition/DeleteNodeEndpoint.cs | 35 ------- .../WorkflowDefinition/DeleteNodeRequest.cs | 10 -- .../DeleteWorkflowDefinitionEndpoint.cs | 34 ------- .../DeleteWorkflowDefinitionRequest.cs | 9 -- .../DisableWorkflowDefinitionEndpoint.cs | 29 ------ .../GetWorkflowDefinitionByIdEndpoint.cs | 33 ------- .../GetWorkflowDefinitionByIdRequest.cs | 9 -- .../GetWorkflowDefinitionListEndpoint.cs | 34 ------- .../GetWorkflowDefinitionListRequest.cs | 13 --- .../PublishWorkflowDefinitionEndpoint.cs | 29 ------ .../WorkflowDefinition/UpdateEdgeEndpoint.cs | 35 ------- .../WorkflowDefinition/UpdateEdgeRequest.cs | 14 --- .../WorkflowDefinition/UpdateNodeEndpoint.cs | 40 -------- .../WorkflowDefinition/UpdateNodeRequest.cs | 15 --- .../UpdateWorkflowDefinitionEndpoint.cs | 33 ------- .../UpdateWorkflowDefinitionRequest.cs | 13 --- .../GetWorkflowInstanceByIdEndpoint.cs | 33 ------- .../GetWorkflowInstanceByIdRequest.cs | 9 -- .../GetWorkflowInstanceListEndpoint.cs | 34 ------- .../GetWorkflowInstanceListRequest.cs | 14 --- .../MonitorWorkflowInstancesEndpoint.cs | 32 ------- .../ResumeWorkflowInstanceEndpoint.cs | 29 ------ .../StartWorkflowInstanceRequest.cs | 12 --- .../SuspendWorkflowInstanceEndpoint.cs | 29 ------ .../WithdrawWorkflowInstanceEndpoint.cs | 32 ------- .../WorkflowTask/AddSignerEndpoint.cs | 24 ----- .../workflow/WorkflowTask/AddSignerRequest.cs | 14 --- .../WorkflowTask/ApproveTaskEndpoint.cs | 32 ------- .../WorkflowTask/ApproveTaskRequest.cs | 12 --- .../WorkflowTask/DelegateTaskEndpoint.cs | 34 ------- .../WorkflowTask/DelegateTaskRequest.cs | 11 --- .../WorkflowTask/GetCcTasksEndpoint.cs | 34 ------- .../WorkflowTask/GetCcTasksRequest.cs | 11 --- .../WorkflowTask/GetHistoryTasksEndpoint.cs | 34 ------- .../WorkflowTask/GetHistoryTasksRequest.cs | 11 --- .../WorkflowTask/GetOverdueTasksEndpoint.cs | 34 ------- .../WorkflowTask/GetOverdueTasksRequest.cs | 11 --- .../WorkflowTask/GetPendingTasksEndpoint.cs | 34 ------- .../WorkflowTask/GetPendingTasksRequest.cs | 11 --- .../WorkflowTask/GetTaskByIdEndpoint.cs | 33 ------- .../WorkflowTask/GetTaskByIdRequest.cs | 9 -- .../WorkflowTask/MarkCcTaskReadEndpoint.cs | 34 ------- .../WorkflowTask/MarkCcTaskReadRequest.cs | 10 -- .../WorkflowTask/RejectTaskEndpoint.cs | 32 ------- .../WorkflowTask/RejectTaskRequest.cs | 11 --- .../WorkflowTask/ReturnTaskEndpoint.cs | 24 ----- .../WorkflowTask/ReturnTaskRequest.cs | 8 -- .../WorkflowTask/TransferTaskEndpoint.cs | 34 ------- .../WorkflowTask/TransferTaskRequest.cs | 11 --- .../workflow/WorkflowTask/UrgeTaskEndpoint.cs | 34 ------- .../workflow/WorkflowTask/UrgeTaskRequest.cs | 10 -- 329 files changed, 7086 deletions(-) delete mode 100644 src/BuildFlow.Host/Endpoints/file/Buckets/CreateBucketEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Buckets/CreateBucketRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Buckets/DeleteBucketEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Buckets/DeleteBucketRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Buckets/ListBucketsEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Files/CheckFileEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Files/CheckFileRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Files/DeleteFileEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Files/DeleteFileRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Files/DownloadFileEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Files/DownloadFileRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Files/GetFileContentEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Files/GetFileContentRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Files/GetFilePreviewEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Files/GetFilePreviewRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Files/GetOfficePreviewEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Files/GetOfficePreviewRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Files/ListFilesEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Files/ListFilesRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Files/UploadFileEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Files/UploadFileRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Folders/CreateFolderEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Folders/CreateFolderRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Folders/DeleteFolderEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Folders/DeleteFolderRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Folders/GetFolderEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Folders/GetFolderRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Folders/GetFolderTreeEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Folders/GetRootFilesEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Folders/MoveFileEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Folders/MoveFileRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Folders/RenameFolderEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Folders/RenameFolderRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Folders/UploadToFolderEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Folders/UploadToFolderRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Multipart/AbortMultipartEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Multipart/AbortMultipartRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Multipart/CompleteMultipartEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Multipart/CompleteMultipartRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Multipart/InitMultipartEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Multipart/InitMultipartRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Multipart/ListPartsEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Multipart/ListPartsRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Multipart/PartRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Multipart/UploadPartEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Multipart/UploadPartRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Settings/GetFileSettingEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Settings/UpdateDefaultBucketEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Settings/UpdateDefaultBucketRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Shares/CreateShareEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Shares/CreateShareRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Shares/DeleteShareEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Shares/DeleteShareRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Shares/DownloadShareEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Shares/DownloadShareRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Shares/GetShareInfoEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/file/Shares/GetShareInfoRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/AddGroupMemberEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/AddGroupMemberEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/CreateGroupEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/CreatePrivateConversationEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/DeleteGroupEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/DeleteGroupEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/GetConversationsEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/GetGroupEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/GetGroupEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/GetGroupMembersEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/GetGroupMembersEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/GetMessageHistoryEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/GetMessageHistoryRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/GetUnreadCountEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/MarkConversationUnreadEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/RecallMessageEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/RecallMessageEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/RemoveGroupMemberEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/RemoveGroupMemberEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/SetConversationMutedEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/SetConversationPinnedEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/SetConversationRemarkEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/SetConversationRemarkEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/SetConversationStateRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/UpdateGroupEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/im/Chat/UpdateGroupEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Auth/ChangePasswordEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Auth/ChangePasswordRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Auth/GetAccessCodesEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Auth/GetCurrentUserEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Auth/LoginEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Auth/LoginRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Auth/LogoutEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Auth/RefreshTokenEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Auth/RegisterEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Auth/RegisterRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Auth/RevokeTokenEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Auth/RevokeTokenRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Auth/UpdateProfileEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Auth/UpdateProfileRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Menus/CreateMenuEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Menus/CreateMenuRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Menus/DeleteMenuEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Menus/DeleteMenuEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Menus/DeleteMenuEndpointRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Menus/GetAllMenusEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Menus/GetMenuByIdEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Menus/GetMenuByIdRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Menus/GetMenuByIdRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Menus/GetMenuTreeEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Menus/SortMenusEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Menus/SortMenusEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Menus/SortMenusEndpointRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Menus/UpdateMenuEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Menus/UpdateMenuEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Menus/UpdateMenuEndpointRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Notifications/GetNotificationsEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Notifications/GetNotificationsRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Notifications/GetNotificationsRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Notifications/GetUnreadNotificationCountEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Notifications/MarkAllNotificationsReadEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Notifications/MarkNotificationReadEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Notifications/NotificationEndpointsExtensions.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Notifications/PublishNotificationEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Notifications/PublishNotificationRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Notifications/PublishNotificationRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Permissions/CreatePermissionEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Permissions/CreatePermissionRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Permissions/DeletePermissionEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Permissions/DeletePermissionEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Permissions/DeletePermissionEndpointRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionByIdEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionByIdRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionByIdRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionListEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionTreeEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Permissions/UpdatePermissionEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Permissions/UpdatePermissionEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Permissions/UpdatePermissionEndpointRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Roles/AssignPermissionsEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Roles/AssignPermissionsEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Roles/AssignPermissionsEndpointRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Roles/CreateRoleEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Roles/CreateRoleRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Roles/DeleteRoleEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Roles/DeleteRoleEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Roles/DeleteRoleEndpointRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Roles/GetRoleByIdEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Roles/GetRoleByIdRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Roles/GetRoleByIdRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Roles/GetRoleListEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Roles/UpdateRoleEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Roles/UpdateRoleEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Roles/UpdateRoleEndpointRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Users/AssignRolesEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Users/AssignRolesEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Users/AssignRolesEndpointRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Users/CreateUserEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Users/CreateUserRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Users/DeleteUserEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Users/DeleteUserEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Users/DeleteUserEndpointRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Users/GetUserByIdEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Users/GetUserByIdRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Users/GetUserByIdRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Users/GetUserListEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Users/GetUserListRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Users/UpdateUserEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Users/UpdateUserEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/platform/Users/UpdateUserEndpointRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/AiModel/AiModelEndpoints.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Chat/CreateConversationEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Chat/CreateConversationRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Chat/CreateConversationRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Chat/DeleteConversationEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Chat/DeleteConversationEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Chat/DeleteConversationEndpointRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Chat/GetConversationDetailEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Chat/GetConversationDetailRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Chat/GetConversationDetailRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Chat/GetConversationsEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Chat/SendMessageEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Chat/SendMessageRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Chat/SendMessageRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Chat/StreamMessageEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Chat/StreamMessageRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Chat/StreamMessageRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/ChunkUploadSession.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/ChunkUploadStore.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/CompleteChunkUploadEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/CompleteChunkUploadRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/CompleteChunkUploadRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/GetDocumentChunksEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/ImportFromFileManagerEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/ImportFromFileManagerRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/InitChunkUploadEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/InitChunkUploadRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/InitChunkUploadRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/ListDocumentsEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/ProcessDocumentEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/ProcessKnowledgeBaseEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/UploadChunkEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/UploadDocumentEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/UploadDocumentRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Document/UploadDocumentRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedBatchEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedBatchRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedBatchRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedTextEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedTextRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedTextRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/CreateKBEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/CreateKnowledgeBaseRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/DeleteKBEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/DeleteKBEndpointRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/DeleteKBEndpointRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/GetKBsEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/UpdateKBEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/UpdateKnowledgeBaseRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Obsidian/ObsidianSyncRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/Obsidian/SyncObsidianVaultEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/RAG/RAGQueryEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/RAG/RAGQueryRequestValidator.cs delete mode 100644 src/BuildFlow.Host/Endpoints/rag/RAG/RAGStreamEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Applications/CreateBuildFlowApplicationEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Applications/CreateBuildFlowApplicationRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Applications/GetBuildFlowApplicationListEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Applications/GetBuildFlowApplicationListRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/CreateBuildFlowButtonDefinitionEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/CreateBuildFlowButtonDefinitionRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/ExecuteBuildFlowButtonEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/ExecuteBuildFlowButtonRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/GetBuildFlowButtonDefinitionListEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/GetBuildFlowButtonDefinitionListRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Pages/CreateBuildFlowPageDefinitionEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Pages/CreateBuildFlowPageDefinitionRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Pages/GetBuildFlowPageDefinitionListEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Pages/GetBuildFlowPageDefinitionListRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/CompareFormVersionsEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/CompareFormVersionsRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/CreateFormComponentEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/CreateFormComponentRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/CreateFormDefinitionEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/CreateFormDefinitionRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/DeleteFormComponentEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/DeleteFormComponentRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/DeleteFormDefinitionEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/DeleteFormDefinitionRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/DisableFormDefinitionEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/DisableFormDefinitionRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/GetFormComponentByIdEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/GetFormComponentByIdRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/GetFormComponentsEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDataByInstanceEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDataByInstanceRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDefinitionByIdEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDefinitionByIdRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDefinitionListEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDefinitionListRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/GetFormVersionsEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/PublishFormDefinitionEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/SubmitFormDataEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/SubmitFormDataRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/UpdateFormComponentEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/UpdateFormComponentRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/UpdateFormDefinitionEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Form/UpdateFormDefinitionRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Notification/GetNotificationsEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Notification/GetNotificationsRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Notification/GetUnreadNotificationCountEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Notification/MarkAllNotificationsReadEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Notification/MarkNotificationReadEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/Notification/NotificationClaimsExtensions.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateEdgeEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateEdgeRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateNodeEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateNodeRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateWorkflowDefinitionEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateWorkflowDefinitionRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteEdgeEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteEdgeRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteNodeEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteNodeRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteWorkflowDefinitionEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteWorkflowDefinitionRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DisableWorkflowDefinitionEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/GetWorkflowDefinitionByIdEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/GetWorkflowDefinitionByIdRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/GetWorkflowDefinitionListEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/GetWorkflowDefinitionListRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/PublishWorkflowDefinitionEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateEdgeEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateEdgeRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateNodeEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateNodeRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateWorkflowDefinitionEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateWorkflowDefinitionRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/GetWorkflowInstanceByIdEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/GetWorkflowInstanceByIdRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/GetWorkflowInstanceListEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/GetWorkflowInstanceListRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/MonitorWorkflowInstancesEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/ResumeWorkflowInstanceEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/StartWorkflowInstanceRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/SuspendWorkflowInstanceEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/WithdrawWorkflowInstanceEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/AddSignerEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/AddSignerRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/ApproveTaskEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/ApproveTaskRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/DelegateTaskEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/DelegateTaskRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetCcTasksEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetCcTasksRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetHistoryTasksEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetHistoryTasksRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetOverdueTasksEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetOverdueTasksRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetPendingTasksEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetPendingTasksRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetTaskByIdEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetTaskByIdRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/MarkCcTaskReadEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/MarkCcTaskReadRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/RejectTaskEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/RejectTaskRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/ReturnTaskEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/ReturnTaskRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/TransferTaskEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/TransferTaskRequest.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/UrgeTaskEndpoint.cs delete mode 100644 src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/UrgeTaskRequest.cs 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 -{ - public override void Configure() - { - Delete("/ai/models/{Id}"); - Permissions("ai-model:write"); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var id = Route("Id"); - await mediator.Send(new DeleteAiModelCommand(id), ct); - await Send.OkAsync(true, ct); - } -} - -/// 设为默认模型。 -public class SetDefaultAiModelEndpoint(IMediator mediator) : EndpointWithoutRequest -{ - public override void Configure() - { - Post("/ai/models/{Id}/default"); - Permissions("ai-model:write"); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var id = Route("Id"); - var result = await mediator.Send(new SetDefaultAiModelCommand(id), ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Chat/CreateConversationEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Chat/CreateConversationEndpoint.cs deleted file mode 100644 index d661c57..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Chat/CreateConversationEndpoint.cs +++ /dev/null @@ -1,36 +0,0 @@ -using BuildFlow.Application.Chat.Commands; -using BuildFlow.Application.Chat.DTOs; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.Chat; - -public class CreateConversationEndpoint(IMediator mediator) : Endpoint -{ - public override void Configure() - { - Post("/chat/conversations"); - Permissions("conversation:write"); - } - - public override async Task HandleAsync(CreateConversationRequest req, CancellationToken ct) - { - var result = await mediator.Send(new CreateConversationCommand(req.Title, req.KnowledgeBaseId), ct); - await Send.ResponseAsync(result, 201, ct); - } -} - -public class UpdateConversationEndpoint(IMediator mediator) : Endpoint -{ - public override void Configure() - { - Put("/chat/conversations/{Id}"); - Permissions("conversation:write"); - } - - public override async Task HandleAsync(UpdateConversationRequest req, CancellationToken ct) - { - var id = Route("Id"); - var result = await mediator.Send(new UpdateConversationCommand(id, req.Title, req.KnowledgeBaseId), ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Chat/CreateConversationRequest.cs b/src/BuildFlow.Host/Endpoints/rag/Chat/CreateConversationRequest.cs deleted file mode 100644 index 628aab5..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Chat/CreateConversationRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Chat; - -/// -/// Create会话请求体。KnowledgeBaseId 可选,关联后对话走 RAG 检索增强。 -/// -public record CreateConversationRequest(string Title, Guid? KnowledgeBaseId = null); - -/// 更新会话请求体(重命名 / 切换知识库)。 -public record UpdateConversationRequest(string? Title, Guid? KnowledgeBaseId = null); diff --git a/src/BuildFlow.Host/Endpoints/rag/Chat/CreateConversationRequestValidator.cs b/src/BuildFlow.Host/Endpoints/rag/Chat/CreateConversationRequestValidator.cs deleted file mode 100644 index 7d0f719..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Chat/CreateConversationRequestValidator.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Chat; - -/// -/// Create会话Request的请求校验器(FluentValidation)。 -/// -public class CreateConversationRequestValidator : Validator -{ - public CreateConversationRequestValidator() - { - RuleFor(x => x.Title) - .NotEmpty().WithMessage("会话标题不能为空") - .MaximumLength(200).WithMessage("会话标题不能超过 200 个字符"); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Chat/DeleteConversationEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Chat/DeleteConversationEndpoint.cs deleted file mode 100644 index e08f175..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Chat/DeleteConversationEndpoint.cs +++ /dev/null @@ -1,26 +0,0 @@ -using BuildFlow.Application.Chat.Commands; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.Chat; - - -/// -/// Delete会话端点。 -/// -public class DeleteConversationEndpoint(IMediator mediator) : Endpoint -{ - public override void Configure() - { - Delete("/chat/conversations/{Id}"); - Permissions("conversation:write"); - } - - public override async Task HandleAsync(DeleteConversationEndpointRequest req, CancellationToken ct) - { - await mediator.Send(new DeleteConversationCommand(req.Id), ct); - // 返回 200 + 非空 JSON(true),让 ApiResponseMiddleware 包裹为标准 - // { code:0, data:true, message:"ok" }。不能用 204/空 body——前端 - // responseReturn:'data' 拦截器会把空响应当错误抛出,导致"删除失败"。 - await Send.OkAsync(true, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Chat/DeleteConversationEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/rag/Chat/DeleteConversationEndpointRequest.cs deleted file mode 100644 index 464db70..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Chat/DeleteConversationEndpointRequest.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Chat; - -/// -/// Delete会话Endpoint请求体。 -/// -public record DeleteConversationEndpointRequest(Guid Id); - -/// 删除会话请求校验(Id 由路由提供)。 diff --git a/src/BuildFlow.Host/Endpoints/rag/Chat/DeleteConversationEndpointRequestValidator.cs b/src/BuildFlow.Host/Endpoints/rag/Chat/DeleteConversationEndpointRequestValidator.cs deleted file mode 100644 index 5903b99..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Chat/DeleteConversationEndpointRequestValidator.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Chat; - -/// -/// Delete会话EndpointRequest的请求校验器(FluentValidation)。 -/// -public class DeleteConversationEndpointRequestValidator : Validator -{ - public DeleteConversationEndpointRequestValidator() - { - RuleFor(x => x.Id).NotEmpty().WithMessage("会话 ID 不能为空"); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Chat/GetConversationDetailEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Chat/GetConversationDetailEndpoint.cs deleted file mode 100644 index f18be9b..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Chat/GetConversationDetailEndpoint.cs +++ /dev/null @@ -1,24 +0,0 @@ -using BuildFlow.Application.Chat.DTOs; -using BuildFlow.Application.Chat.Queries; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.Chat; - - -/// -/// Get会话Detail端点。 -/// -public class GetConversationDetailEndpoint(IMediator mediator) : Endpoint -{ - public override void Configure() - { - Get("/chat/conversations/{Id}"); - Permissions("conversation:read"); - } - - public override async Task HandleAsync(GetConversationDetailRequest req, CancellationToken ct) - { - var result = await mediator.Send(new GetConversationDetailQuery(req.Id), ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Chat/GetConversationDetailRequest.cs b/src/BuildFlow.Host/Endpoints/rag/Chat/GetConversationDetailRequest.cs deleted file mode 100644 index 74237c1..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Chat/GetConversationDetailRequest.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Chat; - -/// -/// Get会话Detail请求体。 -/// -public record GetConversationDetailRequest(Guid Id); - -/// 查询会话详情请求校验(Id 由路由提供)。 diff --git a/src/BuildFlow.Host/Endpoints/rag/Chat/GetConversationDetailRequestValidator.cs b/src/BuildFlow.Host/Endpoints/rag/Chat/GetConversationDetailRequestValidator.cs deleted file mode 100644 index d5bcb00..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Chat/GetConversationDetailRequestValidator.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Chat; - -/// -/// Get会话DetailRequest的请求校验器(FluentValidation)。 -/// -public class GetConversationDetailRequestValidator : Validator -{ - public GetConversationDetailRequestValidator() - { - RuleFor(x => x.Id).NotEmpty().WithMessage("会话 ID 不能为空"); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Chat/GetConversationsEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Chat/GetConversationsEndpoint.cs deleted file mode 100644 index 1447fa4..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Chat/GetConversationsEndpoint.cs +++ /dev/null @@ -1,23 +0,0 @@ -using BuildFlow.Application.Chat.DTOs; -using BuildFlow.Application.Chat.Queries; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.Chat; - -/// -/// Get会话s端点。 -/// -public class GetConversationsEndpoint(IMediator mediator) : EndpointWithoutRequest> -{ - public override void Configure() - { - Get("/chat/conversations"); - Permissions("conversation:read"); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var result = await mediator.Send(new GetConversationsQuery(), ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Chat/SendMessageEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Chat/SendMessageEndpoint.cs deleted file mode 100644 index 8671add..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Chat/SendMessageEndpoint.cs +++ /dev/null @@ -1,25 +0,0 @@ -using BuildFlow.Application.Chat.Commands; -using BuildFlow.Application.Chat.DTOs; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.Chat; - - -/// -/// Send消息端点。 -/// -public class SendMessageEndpoint(IMediator mediator) : Endpoint -{ - public override void Configure() - { - Post("/chat/conversations/{ConversationId}/messages"); - Permissions("chat:send"); - } - - public override async Task HandleAsync(SendMessageRequest req, CancellationToken ct) - { - var conversationId = Route("ConversationId"); - var result = await mediator.Send(new SendMessageCommand(conversationId, req.Content), ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Chat/SendMessageRequest.cs b/src/BuildFlow.Host/Endpoints/rag/Chat/SendMessageRequest.cs deleted file mode 100644 index c64869f..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Chat/SendMessageRequest.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Chat; - -/// -/// Send消息请求体。 -/// -public record SendMessageRequest(string Content); - -/// 发送消息请求校验。 diff --git a/src/BuildFlow.Host/Endpoints/rag/Chat/SendMessageRequestValidator.cs b/src/BuildFlow.Host/Endpoints/rag/Chat/SendMessageRequestValidator.cs deleted file mode 100644 index da92dec..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Chat/SendMessageRequestValidator.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Chat; - -/// -/// Send消息Request的请求校验器(FluentValidation)。 -/// -public class SendMessageRequestValidator : Validator -{ - public SendMessageRequestValidator() - { - RuleFor(x => x.Content) - .NotEmpty().WithMessage("消息内容不能为空") - .MaximumLength(10000).WithMessage("消息内容不能超过 10000 个字符"); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Chat/StreamMessageEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Chat/StreamMessageEndpoint.cs deleted file mode 100644 index c3f8fc0..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Chat/StreamMessageEndpoint.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System.Text; -using System.Text.Json; -using BuildFlow.Domain.Entities; -using BuildFlow.Domain.Enums; -using BuildFlow.Domain.Interfaces; -using BuildFlow.Infrastructure.Persistence; -using AiChatMessage = Microsoft.Extensions.AI.ChatMessage; -using AiChatRole = Microsoft.Extensions.AI.ChatRole; - -namespace BuildFlow.Host.Endpoints.Rag.Chat; - -public class StreamMessageEndpoint(RagDbContext db, IAIChatAgent chatAgent, IChatMessageCache cache) - : Endpoint -{ - public override void Configure() - { - Post("/chat/conversations/{ConversationId}/stream"); - Permissions("chat:send"); - } - - public override async Task HandleAsync(StreamMessageRequest req, CancellationToken ct) - { - var conversationId = Route("ConversationId"); - - var conversation = await db.Conversations.FindAsync([conversationId], ct); - if (conversation is null) - { - HttpContext.Response.StatusCode = 404; - return; - } - - var userMessage = new ChatMessage - { - ConversationId = conversationId, - Role = ChatRole.User, - Content = req.Content - }; - await db.ChatMessages.AddAsync(userMessage, ct); - await db.SaveChangesAsync(ct); - await cache.AppendMessageAsync(conversationId, - new CachedChatMessage(userMessage.Id, ChatRole.User.ToString(), userMessage.Content, null, userMessage.CreatedAt), ct); - - var dbMessages = await db.ChatMessages - .Where(m => m.ConversationId == conversationId) - .OrderBy(m => m.CreatedAt) - .ToListAsync(ct); - - var chatMessages = dbMessages.Select(m => new AiChatMessage( - m.Role == ChatRole.User ? AiChatRole.User : AiChatRole.Assistant, - m.Content)).ToList(); - - HttpContext.Response.ContentType = "text/event-stream"; - HttpContext.Response.Headers.CacheControl = "no-cache"; - HttpContext.Response.Headers.Connection = "keep-alive"; - - var fullReply = new StringBuilder(); - - await foreach (var chunk in chatAgent.RunStreamingAsync(chatMessages, ct)) - { - fullReply.Append(chunk); - var sseData = JsonSerializer.Serialize(new { content = chunk }); - await HttpContext.Response.WriteAsync($"data: {sseData}\n\n", ct); - await HttpContext.Response.Body.FlushAsync(ct); - } - - var replyText = fullReply.ToString(); - - var assistantMessage = new ChatMessage - { - ConversationId = conversationId, - Role = ChatRole.Assistant, - Content = replyText - }; - await db.ChatMessages.AddAsync(assistantMessage, ct); - await db.SaveChangesAsync(ct); - await cache.AppendMessageAsync(conversationId, - new CachedChatMessage(assistantMessage.Id, ChatRole.Assistant.ToString(), assistantMessage.Content, null, assistantMessage.CreatedAt), ct); - - var doneData = JsonSerializer.Serialize(new { messageId = assistantMessage.Id }); - await HttpContext.Response.WriteAsync($"event: done\ndata: {doneData}\n\n", ct); - await HttpContext.Response.Body.FlushAsync(ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Chat/StreamMessageRequest.cs b/src/BuildFlow.Host/Endpoints/rag/Chat/StreamMessageRequest.cs deleted file mode 100644 index a8738fe..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Chat/StreamMessageRequest.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Chat; - -/// -/// Stream消息请求体。 -/// -public record StreamMessageRequest(string Content); - -/// 流式发送消息请求校验。 diff --git a/src/BuildFlow.Host/Endpoints/rag/Chat/StreamMessageRequestValidator.cs b/src/BuildFlow.Host/Endpoints/rag/Chat/StreamMessageRequestValidator.cs deleted file mode 100644 index 10d21fd..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Chat/StreamMessageRequestValidator.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Chat; - -/// -/// Stream消息Request的请求校验器(FluentValidation)。 -/// -public class StreamMessageRequestValidator : Validator -{ - public StreamMessageRequestValidator() - { - RuleFor(x => x.Content) - .NotEmpty().WithMessage("消息内容不能为空") - .MaximumLength(10000).WithMessage("消息内容不能超过 10000 个字符"); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/ChunkUploadSession.cs b/src/BuildFlow.Host/Endpoints/rag/Document/ChunkUploadSession.cs deleted file mode 100644 index e7b1b75..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/ChunkUploadSession.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Collections.Concurrent; - -namespace BuildFlow.Host.Endpoints.Rag.Document; - -/// -/// 分块上传Session类型。 -/// -public class ChunkUploadSession(string sessionId, Guid knowledgeBaseId, string fileName, long fileSize, int chunkCount, string tempDir) -{ - public string SessionId { get; } = sessionId; - public Guid KnowledgeBaseId { get; } = knowledgeBaseId; - public string FileName { get; } = fileName; - public long FileSize { get; } = fileSize; - public int ChunkCount { get; } = chunkCount; - public string TempDir { get; } = tempDir; - public ConcurrentDictionary UploadedChunks { get; } = []; -} - -/// -/// 分片上传会话的进程内存储。单机内存方案(ConcurrentDictionary),不适用于多实例部署—— -/// 横向扩展时需替换为 Redis 等共享存储。会话无 TTL 清理,依赖客户端调用 complete 触发清理。 -/// diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/ChunkUploadStore.cs b/src/BuildFlow.Host/Endpoints/rag/Document/ChunkUploadStore.cs deleted file mode 100644 index 52bc422..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/ChunkUploadStore.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Collections.Concurrent; - -namespace BuildFlow.Host.Endpoints.Rag.Document; - -/// -/// 分块上传Store类型。 -/// -public static class ChunkUploadStore -{ - public static readonly ConcurrentDictionary Sessions = []; -} - -// ===== 初始化 ===== diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/CompleteChunkUploadEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Document/CompleteChunkUploadEndpoint.cs deleted file mode 100644 index ecae53e..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/CompleteChunkUploadEndpoint.cs +++ /dev/null @@ -1,64 +0,0 @@ -using BuildFlow.Application.Document.Commands; -using BuildFlow.Application.Document.DTOs; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.Document; - -/// -/// 合并完成。客户端所有分片上传完毕后调用:按分片索引顺序合并为完整文件,再走入库流程。 -/// -public class CompleteChunkUploadEndpoint(IMediator mediator) : Endpoint -{ - public override void Configure() - { - Post("/documents/chunk-upload/{SessionId}/complete"); - Permissions("document:write"); - } - - public override async Task HandleAsync(CompleteChunkUploadRequest req, CancellationToken ct) - { - var sessionId = Route("SessionId"); - - if (!ChunkUploadStore.Sessions.TryGetValue(sessionId!, out var session)) - { - HttpContext.Response.StatusCode = 404; - return; - } - - // 完整性校验:分片数必须与声明一致,否则拒绝合并避免产出残缺文件 - if (session.UploadedChunks.Count != session.ChunkCount) - { - ThrowError($"分片不完整:已上传 {session.UploadedChunks.Count}/{session.ChunkCount}"); - return; - } - - var ext = Path.GetExtension(session.FileName); - var mergedPath = Path.Combine(Path.GetTempPath(), $"rag_{Guid.NewGuid()}{ext}"); - // 按索引顺序拼接分片:分片上传到达顺序不确定,必须按 ChunkIndex 重建原文件 - await using (var mergedStream = System.IO.File.Create(mergedPath)) - { - for (var i = 0; i < session.ChunkCount; i++) - { - if (!session.UploadedChunks.TryGetValue(i, out var chunkPath)) continue; - await using var chunkStream = System.IO.File.OpenRead(chunkPath); - await chunkStream.CopyToAsync(mergedStream, ct); - } - } - - // Command 需要 Stream(对接 file-system),打开合并后的文件传入。 - var fileStream = System.IO.File.OpenRead(mergedPath); - var result = await mediator.Send(new UploadDocumentCommand( - session.KnowledgeBaseId, - req.Title ?? session.FileName, - session.FileName, - fileStream, - session.FileSize, - "application/octet-stream" - ), ct); - - try { Directory.Delete(session.TempDir, true); } catch { /* ignore */ } - ChunkUploadStore.Sessions.TryRemove(sessionId!, out _); - - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/CompleteChunkUploadRequest.cs b/src/BuildFlow.Host/Endpoints/rag/Document/CompleteChunkUploadRequest.cs deleted file mode 100644 index c1f1172..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/CompleteChunkUploadRequest.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Document; - -/// -/// Complete分块上传请求体。 -/// -public class CompleteChunkUploadRequest -{ - public string? Title { get; set; } -} - -/// 分片上传合并完成请求校验。Title 可选(不传则用原文件名)。 diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/CompleteChunkUploadRequestValidator.cs b/src/BuildFlow.Host/Endpoints/rag/Document/CompleteChunkUploadRequestValidator.cs deleted file mode 100644 index de29816..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/CompleteChunkUploadRequestValidator.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Document; - -/// -/// Complete分块上传Request的请求校验器(FluentValidation)。 -/// -public class CompleteChunkUploadRequestValidator : Validator -{ - public CompleteChunkUploadRequestValidator() - { - When(x => x.Title is not null, () => - { - RuleFor(x => x.Title!) - .MaximumLength(500).WithMessage("文档标题不能超过 500 个字符"); - }); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/GetDocumentChunksEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Document/GetDocumentChunksEndpoint.cs deleted file mode 100644 index 02e7b5a..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/GetDocumentChunksEndpoint.cs +++ /dev/null @@ -1,24 +0,0 @@ -using BuildFlow.Application.Document.DTOs; -using BuildFlow.Application.Document.Queries; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.Document; - -/// -/// Get文档分块端点。 -/// -public class GetDocumentChunksEndpoint(IMediator mediator) : EndpointWithoutRequest> -{ - public override void Configure() - { - Get("/documents/{DocumentId}/chunks"); - Permissions("document:read"); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var docId = Route("DocumentId"); - var result = await mediator.Send(new GetDocumentChunksQuery(docId), ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/ImportFromFileManagerEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Document/ImportFromFileManagerEndpoint.cs deleted file mode 100644 index 3a74a8f..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/ImportFromFileManagerEndpoint.cs +++ /dev/null @@ -1,59 +0,0 @@ -using BuildFlow.Application.Document.Commands; -using BuildFlow.Application.Document.DTOs; -using BuildFlow.Domain.Enums; -using File.Infrastructure.Storage; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.Document; - -/// -/// 从文件管理(S3)入库文档到知识库。 -/// 串联:文件管理上传的文件 → 直接成为 RAG 知识库的语料(分片+向量化)。 -/// 这打通了"文件 → 知识库 → AI对话"的核心 RAG 闭环。 -/// -public class ImportFromFileManagerEndpoint( - IMediator mediator, - IS3StorageService s3) : Endpoint -{ - public override void Configure() - { - Post("/knowledge-bases/{KnowledgeBaseId}/import-file"); - Permissions("document:write"); - } - - public override async Task HandleAsync(ImportFromFileManagerRequest req, CancellationToken ct) - { - var kbId = Route("KnowledgeBaseId"); - - // 1. 从 S3 下载文件(文件管理存储的文件) - var (stream, contentType) = await s3.DownloadFileAsync(req.BucketName, req.ObjectKey, ct); - using var fileStream = stream; - - // 2. 获取文件大小(从请求传入,或从 stream 推断) - var fileSize = req.FileSize > 0 ? req.FileSize : fileStream.Length; - var fileName = string.IsNullOrEmpty(req.FileName) ? req.ObjectKey : req.FileName; - var title = string.IsNullOrEmpty(req.Title) ? fileName : req.Title; - - // 3. 调 RAG 上传文档(写入 RAG 的 Document 表 + 存储文件引用) - ChunkingMode? overrideMode = req.ChunkingMode switch - { - >= 0 and <= 5 => (ChunkingMode)req.ChunkingMode.Value, - _ => null, - }; - - var doc = await mediator.Send(new UploadDocumentCommand( - KnowledgeBaseId: kbId, - Title: title, - FileName: fileName, - FileStream: fileStream, - FileSize: fileSize, - ContentType: contentType, - ChunkingModeOverride: overrideMode - ), ct); - - // 4. 自动触发文档处理(分片 + 向量化)—— 异步不阻塞响应 - _ = mediator.Send(new ProcessDocumentCommand(doc.Id), ct); - - await Send.ResponseAsync(doc, 201, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/ImportFromFileManagerRequest.cs b/src/BuildFlow.Host/Endpoints/rag/Document/ImportFromFileManagerRequest.cs deleted file mode 100644 index ad571b6..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/ImportFromFileManagerRequest.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Document; - -/// 从文件管理入库的请求。指定 S3 桶与对象,服务端下载后写入 RAG 知识库。 -public class ImportFromFileManagerRequest -{ - /// S3 桶名(文件管理的 bucket)。 - public string BucketName { get; set; } = string.Empty; - - /// S3 对象 key(文件管理存储的 UUID key)。 - public string ObjectKey { get; set; } = string.Empty; - - /// 文件名(可选,默认用 ObjectKey)。 - public string? FileName { get; set; } - - /// 文档标题(可选,默认用文件名)。 - public string? Title { get; set; } - - /// 文件大小(可选)。 - public long FileSize { get; set; } - - /// 分块策略覆盖(-1=跟随知识库默认, 0-5=指定策略)。 - public int? ChunkingMode { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/InitChunkUploadEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Document/InitChunkUploadEndpoint.cs deleted file mode 100644 index 88154fd..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/InitChunkUploadEndpoint.cs +++ /dev/null @@ -1,26 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Document; - -/// -/// Init分块上传端点。 -/// -public class InitChunkUploadEndpoint : Endpoint -{ - public override void Configure() - { - Post("/knowledge-bases/{KnowledgeBaseId}/documents/chunk-upload/init"); - Permissions("document:write"); - } - - public override async Task HandleAsync(InitChunkUploadRequest req, CancellationToken ct) - { - var kbId = Route("KnowledgeBaseId"); - var sessionId = Guid.NewGuid().ToString("N"); - var tempDir = Path.Combine(Path.GetTempPath(), "rag_chunks", sessionId); - Directory.CreateDirectory(tempDir); - - var session = new ChunkUploadSession(sessionId, kbId, req.FileName, req.FileSize, req.ChunkCount, tempDir); - ChunkUploadStore.Sessions[sessionId] = session; - - await Send.OkAsync(session, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/InitChunkUploadRequest.cs b/src/BuildFlow.Host/Endpoints/rag/Document/InitChunkUploadRequest.cs deleted file mode 100644 index 5110731..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/InitChunkUploadRequest.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Document; - -/// -/// Init分块上传请求体。 -/// -public class InitChunkUploadRequest -{ - public string FileName { get; set; } = default!; - public long FileSize { get; set; } - public int ChunkCount { get; set; } -} - -/// 分片上传初始化请求校验。 diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/InitChunkUploadRequestValidator.cs b/src/BuildFlow.Host/Endpoints/rag/Document/InitChunkUploadRequestValidator.cs deleted file mode 100644 index 930c1ee..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/InitChunkUploadRequestValidator.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Document; - -/// -/// Init分块上传Request的请求校验器(FluentValidation)。 -/// -public class InitChunkUploadRequestValidator : Validator -{ - public InitChunkUploadRequestValidator() - { - RuleFor(x => x.FileName) - .NotEmpty().WithMessage("文件名不能为空") - .MaximumLength(500).WithMessage("文件名不能超过 500 个字符"); - - RuleFor(x => x.FileSize) - .GreaterThan(0).WithMessage("文件大小必须大于 0"); - - RuleFor(x => x.ChunkCount) - .InclusiveBetween(1, 10000).WithMessage("分片数量 ChunkCount 取值范围 1-10000"); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/ListDocumentsEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Document/ListDocumentsEndpoint.cs deleted file mode 100644 index 96c85f7..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/ListDocumentsEndpoint.cs +++ /dev/null @@ -1,24 +0,0 @@ -using BuildFlow.Application.Document.DTOs; -using BuildFlow.Application.Document.Queries; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.Document; - -/// -/// List文档s端点。 -/// -public class ListDocumentsEndpoint(IMediator mediator) : EndpointWithoutRequest> -{ - public override void Configure() - { - Get("/knowledge-bases/{KnowledgeBaseId}/documents"); - Permissions("document:read"); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var kbId = Route("KnowledgeBaseId"); - var result = await mediator.Send(new GetDocumentsQuery(kbId), ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/ProcessDocumentEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Document/ProcessDocumentEndpoint.cs deleted file mode 100644 index 85c6246..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/ProcessDocumentEndpoint.cs +++ /dev/null @@ -1,25 +0,0 @@ -using BuildFlow.Application.Document.Commands; -using BuildFlow.Application.Document.DTOs; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.Document; - -/// -/// 触发单文档处理流水线(提取→分块→向量化→入库)。 -/// 上传后须调用此端点才能让文档进入可检索状态;失败文档也可重复调用重试。 -/// -public class ProcessDocumentEndpoint(IMediator mediator) : Endpoint -{ - public override void Configure() - { - Post("/documents/{DocumentId}/process"); - Permissions("document:write"); - } - - public override async Task HandleAsync(EmptyRequest req, CancellationToken ct) - { - var docId = Route("DocumentId"); - var result = await mediator.Send(new ProcessDocumentCommand(docId), ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/ProcessKnowledgeBaseEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Document/ProcessKnowledgeBaseEndpoint.cs deleted file mode 100644 index 1b14778..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/ProcessKnowledgeBaseEndpoint.cs +++ /dev/null @@ -1,27 +0,0 @@ -using BuildFlow.Application.Document.Commands; -using BuildFlow.Application.Document.DTOs; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.Document; - -/// -/// 批量处理知识库内所有待处理/失败的文档。 -/// POST /api/knowledge-bases/{KnowledgeBaseId}/process-all -/// 返回处理统计(成功/失败/错误明细)。Obsidian 同步后可调用此接口一键入库。 -/// -public class ProcessKnowledgeBaseEndpoint(IMediator mediator) - : Endpoint -{ - public override void Configure() - { - Post("/knowledge-bases/{KnowledgeBaseId}/process-all"); - Permissions("document:write"); - } - - public override async Task HandleAsync(EmptyRequest req, CancellationToken ct) - { - var kbId = Route("KnowledgeBaseId"); - var result = await mediator.Send(new ProcessKnowledgeBaseCommand(kbId), ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/UploadChunkEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Document/UploadChunkEndpoint.cs deleted file mode 100644 index 9ad45ee..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/UploadChunkEndpoint.cs +++ /dev/null @@ -1,43 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Document; - -/// -/// 上传单个分片。客户端按分片索引逐个上传,服务端写入临时目录。 -/// -public class UploadChunkEndpoint : EndpointWithoutRequest -{ - public override void Configure() - { - Post("/documents/chunk-upload/{SessionId}/chunks/{ChunkIndex}"); - Permissions("document:write"); - AllowFileUploads(); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var sessionId = Route("SessionId"); - var chunkIndex = Route("ChunkIndex"); - - if (!ChunkUploadStore.Sessions.TryGetValue(sessionId!, out var session)) - { - HttpContext.Response.StatusCode = 404; - return; - } - - var file = Files.FirstOrDefault(); - if (file is null) - { - ThrowError("请上传分片文件"); - return; - } - - var chunkPath = Path.Combine(session.TempDir, $"chunk_{chunkIndex}"); - await using (var stream = System.IO.File.Create(chunkPath)) - { - await file.CopyToAsync(stream, ct); - } - - session.UploadedChunks.TryAdd(chunkIndex, chunkPath); - HttpContext.Response.StatusCode = 200; - await HttpContext.Response.WriteAsJsonAsync(new { uploaded = session.UploadedChunks.Count, total = session.ChunkCount }, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/UploadDocumentEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Document/UploadDocumentEndpoint.cs deleted file mode 100644 index 56e9a3f..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/UploadDocumentEndpoint.cs +++ /dev/null @@ -1,43 +0,0 @@ -using BuildFlow.Application.Document.Commands; -using BuildFlow.Application.Document.DTOs; -using BuildFlow.Domain.Enums; -using MediatR; -using DomainExceptions = BuildFlow.Shared.Domain.Exceptions; - -namespace BuildFlow.Host.Endpoints.Rag.Document; - - -/// -/// 上传文档端点。 -/// -public class UploadDocumentEndpoint(IMediator mediator) : Endpoint -{ - public override void Configure() - { - Post("/knowledge-bases/{KnowledgeBaseId}/documents"); - Permissions("document:write"); - AllowFileUploads(); - } - - public override async Task HandleAsync(UploadDocumentRequest req, CancellationToken ct) - { - var kbId = Route("KnowledgeBaseId"); - var file = Files.FirstOrDefault(); - if (file is null) - throw new DomainExceptions.BusinessException("请上传文件"); - - // 分块策略覆盖:null=用知识库默认;0-5 与知识库策略枚举保持一致。 - ChunkingMode? overrideMode = req.ChunkingMode switch - { - >= 0 and <= 5 => (ChunkingMode)req.ChunkingMode.Value, - _ => null - }; - - // 直接把文件流传给 command,由 command 上传到文件服务 S3(不再存临时目录) - await using var stream = file.OpenReadStream(); - var result = await mediator.Send(new UploadDocumentCommand(kbId, req.Title ?? file.FileName, - file.FileName, stream, file.Length, file.ContentType, overrideMode), ct); - - await Send.ResponseAsync(result, 201, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/UploadDocumentRequest.cs b/src/BuildFlow.Host/Endpoints/rag/Document/UploadDocumentRequest.cs deleted file mode 100644 index cd26a55..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/UploadDocumentRequest.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Document; - -/// -/// 上传文档请求体。 -/// -public record UploadDocumentRequest(string? Title, int? ChunkingMode = null); - -/// 单文件上传请求校验。Title 可选(不传则用文件名),ChunkingMode 仅当提供时校验取值。 diff --git a/src/BuildFlow.Host/Endpoints/rag/Document/UploadDocumentRequestValidator.cs b/src/BuildFlow.Host/Endpoints/rag/Document/UploadDocumentRequestValidator.cs deleted file mode 100644 index 9d05a2c..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Document/UploadDocumentRequestValidator.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Document; - -/// -/// 上传文档Request的请求校验器(FluentValidation)。 -/// -public class UploadDocumentRequestValidator : Validator -{ - public UploadDocumentRequestValidator() - { - When(x => x.Title is not null, () => - { - RuleFor(x => x.Title!) - .MaximumLength(500).WithMessage("文档标题不能超过 500 个字符"); - }); - - RuleFor(x => x.ChunkingMode) - .InclusiveBetween(0, 5).When(x => x.ChunkingMode.HasValue) - .WithMessage("分块模式 ChunkingMode 取值 0=General,1=Heading,2=ParentChild,3=Separator,4=ByPage,5=Token"); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedBatchEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedBatchEndpoint.cs deleted file mode 100644 index 63005b8..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedBatchEndpoint.cs +++ /dev/null @@ -1,24 +0,0 @@ -using BuildFlow.Application.Embedding.Commands; -using BuildFlow.Application.Embedding.DTOs; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.Embedding; - - -/// -/// 批量向量化端点。 -/// -public class EmbedBatchEndpoint(IMediator mediator) : Endpoint -{ - public override void Configure() - { - Post("/embeddings/batch"); - Permissions("embedding:write"); - } - - public override async Task HandleAsync(EmbedBatchRequest req, CancellationToken ct) - { - var result = await mediator.Send(new EmbedBatchCommand(req.Texts), ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedBatchRequest.cs b/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedBatchRequest.cs deleted file mode 100644 index 2d90a3e..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedBatchRequest.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Embedding; - -/// -/// 批量向量化请求体。 -/// -public record EmbedBatchRequest(List Texts); - -/// 批量文本向量化请求校验。 diff --git a/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedBatchRequestValidator.cs b/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedBatchRequestValidator.cs deleted file mode 100644 index 5f907e3..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedBatchRequestValidator.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Embedding; - -/// -/// 批量向量化Request的请求校验器(FluentValidation)。 -/// -public class EmbedBatchRequestValidator : Validator -{ - public EmbedBatchRequestValidator() - { - RuleFor(x => x.Texts) - .NotEmpty().WithMessage("文本列表不能为空") - .Must(t => t.Count <= 100).WithMessage("批量文本不能超过 100 条"); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedTextEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedTextEndpoint.cs deleted file mode 100644 index c3e371b..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedTextEndpoint.cs +++ /dev/null @@ -1,24 +0,0 @@ -using BuildFlow.Application.Embedding.Commands; -using BuildFlow.Application.Embedding.DTOs; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.Embedding; - - -/// -/// 文本向量化端点。 -/// -public class EmbedTextEndpoint(IMediator mediator) : Endpoint -{ - public override void Configure() - { - Post("/embeddings"); - Permissions("embedding:write"); - } - - public override async Task HandleAsync(EmbedTextRequest req, CancellationToken ct) - { - var result = await mediator.Send(new EmbedTextCommand(req.Text), ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedTextRequest.cs b/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedTextRequest.cs deleted file mode 100644 index c6d724e..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedTextRequest.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Embedding; - -/// -/// 文本向量化请求体。 -/// -public record EmbedTextRequest(string Text); - -/// 单条文本向量化请求校验。 diff --git a/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedTextRequestValidator.cs b/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedTextRequestValidator.cs deleted file mode 100644 index 2590ca3..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Embedding/EmbedTextRequestValidator.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.Embedding; - -/// -/// 文本向量化Request的请求校验器(FluentValidation)。 -/// -public class EmbedTextRequestValidator : Validator -{ - public EmbedTextRequestValidator() - { - RuleFor(x => x.Text) - .NotEmpty().WithMessage("文本内容不能为空") - .MaximumLength(10000).WithMessage("单条文本不能超过 10000 个字符"); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/CreateKBEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/CreateKBEndpoint.cs deleted file mode 100644 index b9a25fe..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/CreateKBEndpoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -using BuildFlow.Application.KnowledgeBase.Commands; -using BuildFlow.Application.KnowledgeBase.DTOs; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.KnowledgeBase; - - -/// -/// Create知识库端点。 -/// -public class CreateKBEndpoint(IMediator mediator) : Endpoint -{ - public override void Configure() - { - Post("/knowledge-bases"); - Permissions("knowledge:write"); - } - - public override async Task HandleAsync(CreateKnowledgeBaseRequest req, CancellationToken ct) - { - var result = await mediator.Send( - new CreateKnowledgeBaseCommand( - req.Name, req.Description, req.EmbeddingModel, req.ChunkSize, req.ChunkOverlap, - req.ChunkingMode, req.Separator, req.RetrievalMode, req.RerankStrategy, - req.RetrievalTopK, req.ContextTopK, req.SimilarityThreshold, req.VectorWeight), - ct); - await Send.ResponseAsync(result, 201, ct); - } -} - -/// -/// 创建知识库请求校验。 -/// 名称必填;数值参数(分块/检索配置)限定合理取值范围,避免传入非法值导致下游处理异常。 -/// diff --git a/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/CreateKnowledgeBaseRequestValidator.cs b/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/CreateKnowledgeBaseRequestValidator.cs deleted file mode 100644 index 244336c..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/CreateKnowledgeBaseRequestValidator.cs +++ /dev/null @@ -1,58 +0,0 @@ -using BuildFlow.Application.KnowledgeBase.DTOs; - -namespace BuildFlow.Host.Endpoints.Rag.KnowledgeBase; - -/// -/// Create知识库Request的请求校验器(FluentValidation)。 -/// -public class CreateKnowledgeBaseRequestValidator : Validator -{ - public CreateKnowledgeBaseRequestValidator() - { - RuleFor(x => x.Name) - .NotEmpty().WithMessage("知识库名称不能为空") - .MaximumLength(200).WithMessage("名称不能超过 200 个字符"); - - When(x => x.Description is not null, () => - { - RuleFor(x => x.Description!) - .MaximumLength(1000).WithMessage("描述不能超过 1000 个字符"); - }); - - RuleFor(x => x.ChunkSize) - .InclusiveBetween(100, 8000).When(x => x.ChunkSize.HasValue) - .WithMessage("分块大小 ChunkSize 取值范围 100-8000"); - - RuleFor(x => x.ChunkOverlap) - .InclusiveBetween(0, 1000).When(x => x.ChunkOverlap.HasValue) - .WithMessage("分块重叠 ChunkOverlap 取值范围 0-1000"); - - RuleFor(x => x.ChunkingMode) - .InclusiveBetween(0, 5).When(x => x.ChunkingMode.HasValue) - .WithMessage("分块模式 ChunkingMode 取值 0=General,1=Heading,2=ParentChild,3=Separator,4=ByPage,5=Token"); - - RuleFor(x => x.RetrievalMode) - .InclusiveBetween(0, 2).When(x => x.RetrievalMode.HasValue) - .WithMessage("检索模式 RetrievalMode 取值范围 0-2"); - - RuleFor(x => x.RerankStrategy) - .InclusiveBetween(0, 2).When(x => x.RerankStrategy.HasValue) - .WithMessage("重排策略 RerankStrategy 取值范围 0-2"); - - RuleFor(x => x.RetrievalTopK) - .InclusiveBetween(1, 50).When(x => x.RetrievalTopK.HasValue) - .WithMessage("检索数量 RetrievalTopK 取值范围 1-50"); - - RuleFor(x => x.ContextTopK) - .InclusiveBetween(1, 50).When(x => x.ContextTopK.HasValue) - .WithMessage("上下文数量 ContextTopK 取值范围 1-50"); - - RuleFor(x => x.SimilarityThreshold) - .InclusiveBetween(0, 1).When(x => x.SimilarityThreshold.HasValue) - .WithMessage("相似度阈值 SimilarityThreshold 取值范围 0-1"); - - RuleFor(x => x.VectorWeight) - .InclusiveBetween(0, 1).When(x => x.VectorWeight.HasValue) - .WithMessage("向量权重 VectorWeight 取值范围 0-1"); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/DeleteKBEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/DeleteKBEndpoint.cs deleted file mode 100644 index 9cf57c3..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/DeleteKBEndpoint.cs +++ /dev/null @@ -1,23 +0,0 @@ -using BuildFlow.Application.KnowledgeBase.Commands; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.KnowledgeBase; - - -/// -/// Delete知识库端点。 -/// -public class DeleteKBEndpoint(IMediator mediator) : Endpoint -{ - public override void Configure() - { - Delete("/knowledge-bases/{Id}"); - Permissions("knowledge:write"); - } - - public override async Task HandleAsync(DeleteKBEndpointRequest req, CancellationToken ct) - { - await mediator.Send(new DeleteKnowledgeBaseCommand(req.Id), ct); - await Send.OkAsync(true, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/DeleteKBEndpointRequest.cs b/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/DeleteKBEndpointRequest.cs deleted file mode 100644 index cac2bf0..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/DeleteKBEndpointRequest.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.KnowledgeBase; - -/// -/// Delete知识库Endpoint请求体。 -/// -public record DeleteKBEndpointRequest(Guid Id); - -/// 删除知识库请求校验(Id 由路由提供)。 diff --git a/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/DeleteKBEndpointRequestValidator.cs b/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/DeleteKBEndpointRequestValidator.cs deleted file mode 100644 index ec17392..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/DeleteKBEndpointRequestValidator.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Rag.KnowledgeBase; - -/// -/// Delete知识库EndpointRequest的请求校验器(FluentValidation)。 -/// -public class DeleteKBEndpointRequestValidator : Validator -{ - public DeleteKBEndpointRequestValidator() - { - RuleFor(x => x.Id).NotEmpty().WithMessage("知识库 ID 不能为空"); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/GetKBsEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/GetKBsEndpoint.cs deleted file mode 100644 index 6666c0f..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/GetKBsEndpoint.cs +++ /dev/null @@ -1,23 +0,0 @@ -using BuildFlow.Application.KnowledgeBase.DTOs; -using BuildFlow.Application.KnowledgeBase.Queries; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.KnowledgeBase; - -/// -/// Get知识库s端点。 -/// -public class GetKBsEndpoint(IMediator mediator) : EndpointWithoutRequest> -{ - public override void Configure() - { - Get("/knowledge-bases"); - Permissions("knowledge:read"); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var result = await mediator.Send(new GetKnowledgeBasesQuery(), ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/UpdateKBEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/UpdateKBEndpoint.cs deleted file mode 100644 index bbb944e..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/UpdateKBEndpoint.cs +++ /dev/null @@ -1,33 +0,0 @@ -using BuildFlow.Application.KnowledgeBase.Commands; -using BuildFlow.Application.KnowledgeBase.DTOs; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.KnowledgeBase; - - -/// -/// Update知识库端点。 -/// -public class UpdateKBEndpoint(IMediator mediator) - : Endpoint -{ - public override void Configure() - { - Put("/knowledge-bases/{KnowledgeBaseId}"); - Permissions("knowledge:write"); - } - - public override async Task HandleAsync(UpdateKnowledgeBaseRequest req, CancellationToken ct) - { - var kbId = Route("KnowledgeBaseId"); - var result = await mediator.Send( - new UpdateKnowledgeBaseCommand( - kbId, req.Name, req.Description, req.ChunkSize, req.ChunkOverlap, - req.ChunkingMode, req.Separator, req.RetrievalMode, req.RerankStrategy, - req.RetrievalTopK, req.ContextTopK, req.SimilarityThreshold, req.VectorWeight), - ct); - await Send.OkAsync(result, ct); - } -} - -/// 更新知识库请求校验。仅校验请求体中提供的字段(非 null 时才校验)。 diff --git a/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/UpdateKnowledgeBaseRequestValidator.cs b/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/UpdateKnowledgeBaseRequestValidator.cs deleted file mode 100644 index 361ff79..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/KnowledgeBase/UpdateKnowledgeBaseRequestValidator.cs +++ /dev/null @@ -1,61 +0,0 @@ -using BuildFlow.Application.KnowledgeBase.DTOs; - -namespace BuildFlow.Host.Endpoints.Rag.KnowledgeBase; - -/// -/// Update知识库Request的请求校验器(FluentValidation)。 -/// -public class UpdateKnowledgeBaseRequestValidator : Validator -{ - public UpdateKnowledgeBaseRequestValidator() - { - When(x => x.Name is not null, () => - { - RuleFor(x => x.Name!) - .NotEmpty().WithMessage("知识库名称不能为空") - .MaximumLength(200).WithMessage("名称不能超过 200 个字符"); - }); - - When(x => x.Description is not null, () => - { - RuleFor(x => x.Description!) - .MaximumLength(1000).WithMessage("描述不能超过 1000 个字符"); - }); - - RuleFor(x => x.ChunkSize) - .InclusiveBetween(100, 8000).When(x => x.ChunkSize.HasValue) - .WithMessage("分块大小 ChunkSize 取值范围 100-8000"); - - RuleFor(x => x.ChunkOverlap) - .InclusiveBetween(0, 1000).When(x => x.ChunkOverlap.HasValue) - .WithMessage("分块重叠 ChunkOverlap 取值范围 0-1000"); - - RuleFor(x => x.ChunkingMode) - .InclusiveBetween(0, 5).When(x => x.ChunkingMode.HasValue) - .WithMessage("分块模式 ChunkingMode 取值 0=General,1=Heading,2=ParentChild,3=Separator,4=ByPage,5=Token"); - - RuleFor(x => x.RetrievalMode) - .InclusiveBetween(0, 2).When(x => x.RetrievalMode.HasValue) - .WithMessage("检索模式 RetrievalMode 取值范围 0-2"); - - RuleFor(x => x.RerankStrategy) - .InclusiveBetween(0, 2).When(x => x.RerankStrategy.HasValue) - .WithMessage("重排策略 RerankStrategy 取值范围 0-2"); - - RuleFor(x => x.RetrievalTopK) - .InclusiveBetween(1, 50).When(x => x.RetrievalTopK.HasValue) - .WithMessage("检索数量 RetrievalTopK 取值范围 1-50"); - - RuleFor(x => x.ContextTopK) - .InclusiveBetween(1, 50).When(x => x.ContextTopK.HasValue) - .WithMessage("上下文数量 ContextTopK 取值范围 1-50"); - - RuleFor(x => x.SimilarityThreshold) - .InclusiveBetween(0, 1).When(x => x.SimilarityThreshold.HasValue) - .WithMessage("相似度阈值 SimilarityThreshold 取值范围 0-1"); - - RuleFor(x => x.VectorWeight) - .InclusiveBetween(0, 1).When(x => x.VectorWeight.HasValue) - .WithMessage("向量权重 VectorWeight 取值范围 0-1"); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Obsidian/ObsidianSyncRequestValidator.cs b/src/BuildFlow.Host/Endpoints/rag/Obsidian/ObsidianSyncRequestValidator.cs deleted file mode 100644 index 011eb60..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Obsidian/ObsidianSyncRequestValidator.cs +++ /dev/null @@ -1,20 +0,0 @@ -using BuildFlow.Application.Obsidian.DTOs; - -namespace BuildFlow.Host.Endpoints.Rag.Obsidian; - -/// -/// Obsidian同步SyncRequest的请求校验器(FluentValidation)。 -/// -public class ObsidianSyncRequestValidator : Validator -{ - public ObsidianSyncRequestValidator() - { - RuleFor(x => x.VaultDirectory) - .NotEmpty().WithMessage("Vault 目录不能为空") - .MaximumLength(1000).WithMessage("Vault 目录路径不能超过 1000 个字符"); - - RuleFor(x => x.ChunkingMode) - .InclusiveBetween(0, 2).When(x => x.ChunkingMode.HasValue) - .WithMessage("分块模式 ChunkingMode 取值 0=General,1=Heading,2=ParentChild"); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/Obsidian/SyncObsidianVaultEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/Obsidian/SyncObsidianVaultEndpoint.cs deleted file mode 100644 index eef3cb7..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/Obsidian/SyncObsidianVaultEndpoint.cs +++ /dev/null @@ -1,36 +0,0 @@ -using BuildFlow.Application.Obsidian.Commands; -using BuildFlow.Application.Obsidian.DTOs; -using BuildFlow.Domain.Enums; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.Obsidian; - - -/// -/// SyncObsidian同步仓库端点。 -/// -public class SyncObsidianVaultEndpoint(IMediator mediator) - : Endpoint -{ - public override void Configure() - { - Post("/knowledge-bases/{KnowledgeBaseId}/obsidian/sync"); - AllowAnonymous(); - } - - public override async Task HandleAsync(ObsidianSyncRequest req, CancellationToken ct) - { - var kbId = Route("KnowledgeBaseId"); - ChunkingMode? overrideMode = req.ChunkingMode is >= 0 and <= 2 - ? (ChunkingMode)req.ChunkingMode.Value - : null; - var result = await mediator.Send(new SyncObsidianVaultCommand(kbId, req.VaultDirectory, overrideMode), ct); - await Send.OkAsync(result, ct); - } -} - -/// -/// Obsidian vault 同步请求校验。 -/// 注意:目录存在性属于 IO 层校验,留给 handler 处理(避免 validator 内做磁盘 IO); -/// 此处仅校验非空、长度与枚举取值。 -/// diff --git a/src/BuildFlow.Host/Endpoints/rag/RAG/RAGQueryEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/RAG/RAGQueryEndpoint.cs deleted file mode 100644 index 4d17df2..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/RAG/RAGQueryEndpoint.cs +++ /dev/null @@ -1,28 +0,0 @@ -using BuildFlow.Application.RagQA.Commands; -using BuildFlow.Application.RagQA.DTOs; -using MediatR; - -namespace BuildFlow.Host.Endpoints.Rag.RAG; - - -/// -/// RAG检索问答查询端点。 -/// -public class RAGQueryEndpoint(IMediator mediator) : Endpoint -{ - public override void Configure() - { - Post("/rag/query"); - Permissions("rag:query"); - } - - public override async Task HandleAsync(RAGQueryRequest req, CancellationToken ct) - { - var result = await mediator.Send(new RAGQueryCommand(req.KnowledgeBaseId, req.Question), ct); - await Send.OkAsync(result, ct); - } -} - -/// -/// RAG 问答请求校验。/rag/query 与 /rag/stream 共用同一请求 DTO,故此校验对两个端点同时生效。 -/// diff --git a/src/BuildFlow.Host/Endpoints/rag/RAG/RAGQueryRequestValidator.cs b/src/BuildFlow.Host/Endpoints/rag/RAG/RAGQueryRequestValidator.cs deleted file mode 100644 index 9c7b2a4..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/RAG/RAGQueryRequestValidator.cs +++ /dev/null @@ -1,18 +0,0 @@ -using BuildFlow.Application.RagQA.DTOs; - -namespace BuildFlow.Host.Endpoints.Rag.RAG; - -/// -/// RAG检索问答查询Request的请求校验器(FluentValidation)。 -/// -public class RAGQueryRequestValidator : Validator -{ - public RAGQueryRequestValidator() - { - RuleFor(x => x.KnowledgeBaseId).NotEmpty().WithMessage("知识库 ID 不能为空"); - - RuleFor(x => x.Question) - .NotEmpty().WithMessage("问题不能为空") - .MaximumLength(1000).WithMessage("问题不能超过 1000 个字符"); - } -} diff --git a/src/BuildFlow.Host/Endpoints/rag/RAG/RAGStreamEndpoint.cs b/src/BuildFlow.Host/Endpoints/rag/RAG/RAGStreamEndpoint.cs deleted file mode 100644 index 7e6609d..0000000 --- a/src/BuildFlow.Host/Endpoints/rag/RAG/RAGStreamEndpoint.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System.Text; -using System.Text.Json; -using BuildFlow.Application.RagQA.DTOs; -using BuildFlow.Domain.Interfaces; -using BuildFlow.Infrastructure.Persistence; -// 别名消歧义 -using AiChatMessage = Microsoft.Extensions.AI.ChatMessage; -using AiChatRole = Microsoft.Extensions.AI.ChatRole; - -namespace BuildFlow.Host.Endpoints.Rag.RAG; - -/// -/// RAG 流式问答端点,以 Server-Sent Events 推送。 -/// 协议分三段:1) event:sources 推送命中的来源片段(前端即时展示引用);2) data: 流式推送 LLM 生成内容; -/// 3) data:[DONE] 标记结束。被 ApiResponseMiddleware 通过 IsStreamEndpoint 排除包裹,直接透传字节流。 -/// -public class RAGStreamEndpoint( - RagDbContext db, - IRagRetrievalService retrievalService, - IAIChatAgent chatAgent) - : Endpoint -{ - public override void Configure() - { - Post("/rag/stream"); - Permissions("rag:query"); - } - - public override async Task HandleAsync(RAGQueryRequest req, CancellationToken ct) - { - var kb = await db.KnowledgeBases.FindAsync([req.KnowledgeBaseId], ct) - ?? throw new NotFoundException("知识库不存在"); - - // 检索流水线(策略由知识库配置决定) - var hits = await retrievalService.RetrieveAsync(kb, req.Question, ct); - - // SSE:声明流式响应头,必须先于任何 body 写入 - HttpContext.Response.ContentType = "text/event-stream"; - HttpContext.Response.Headers.CacheControl = "no-cache"; - HttpContext.Response.Headers.Connection = "keep-alive"; - - if (hits.Count == 0) - { - var noData = JsonSerializer.Serialize(new { content = "未在知识库中找到相关内容。" }); - await HttpContext.Response.WriteAsync($"data: {noData}\n\n", ct); - await HttpContext.Response.WriteAsync("data: [DONE]\n\n", ct); - await HttpContext.Response.Body.FlushAsync(ct); - return; - } - - // 先推送命中的来源片段 - var sources = hits.Select(h => new SourceChunk( - h.DocumentId, - h.DocumentTitle, - h.ContextContent.Length > 200 ? h.ContextContent[..200] + "..." : h.ContextContent, - Math.Round(h.Score, 4) - )).ToList(); - var sourcesData = JsonSerializer.Serialize(new { sources }); - await HttpContext.Response.WriteAsync($"event: sources\ndata: {sourcesData}\n\n", ct); - await HttpContext.Response.Body.FlushAsync(ct); - - // 构建 MAF ChatMessage(RAG 上下文 + 用户问题) - var contextBuilder = new StringBuilder(); - contextBuilder.AppendLine("以下是检索到的相关上下文:"); - for (var i = 0; i < hits.Count; i++) - contextBuilder.AppendLine($"\n--- 上下文 {i + 1} ---\n{hits[i].ContextContent}"); - - var ragMessages = new List - { - new(AiChatRole.System, "基于提供的上下文直接回答问题。不要输出身份开场、Markdown标题或推理过程;上下文没有依据时,只用一句话说明未检索到相关内容。"), - new(AiChatRole.User, $"{contextBuilder}\n\n问题:{req.Question}"), - }; - - await foreach (var chunk in chatAgent.RunStreamingAsync(ragMessages, ct)) - { - var sseData = JsonSerializer.Serialize(new { content = chunk }); - await HttpContext.Response.WriteAsync($"data: {sseData}\n\n", ct); - await HttpContext.Response.Body.FlushAsync(ct); - } - - await HttpContext.Response.WriteAsync("data: [DONE]\n\n", ct); - await HttpContext.Response.Body.FlushAsync(ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Applications/CreateBuildFlowApplicationEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Applications/CreateBuildFlowApplicationEndpoint.cs deleted file mode 100644 index 8bf457d..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Applications/CreateBuildFlowApplicationEndpoint.cs +++ /dev/null @@ -1,24 +0,0 @@ -using MediatR; -using Workflow.Application.BuildFlow.Applications.Commands; -using Workflow.Application.BuildFlow.Applications.DTOs; - -namespace BuildFlow.Host.Endpoints.Workflow.BuildFlow.Applications; - -/// 创建 BuildFlow 应用端点。POST /buildflow/applications。 -public class CreateBuildFlowApplicationEndpoint(IMediator mediator) - : Endpoint -{ - public override void Configure() - { - Post("/buildflow/applications"); - Permissions("buildflow:application:create"); - } - - public override async Task HandleAsync(CreateBuildFlowApplicationRequest req, CancellationToken ct) - { - var result = await mediator.Send( - new CreateBuildFlowApplicationCommand(req.Code, req.Name, req.Description), - ct); - await Send.ResponseAsync(result, 201, ct); - } -} \ No newline at end of file diff --git a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Applications/CreateBuildFlowApplicationRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Applications/CreateBuildFlowApplicationRequest.cs deleted file mode 100644 index be9804a..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Applications/CreateBuildFlowApplicationRequest.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.BuildFlow.Applications; - -/// 创建 BuildFlow 应用请求。 -public sealed record CreateBuildFlowApplicationRequest(string Code, string Name, string? Description); diff --git a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Applications/GetBuildFlowApplicationListEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Applications/GetBuildFlowApplicationListEndpoint.cs deleted file mode 100644 index 2575d8a..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Applications/GetBuildFlowApplicationListEndpoint.cs +++ /dev/null @@ -1,25 +0,0 @@ -using MediatR; -using Workflow.Application.BuildFlow.Applications.DTOs; -using Workflow.Application.BuildFlow.Applications.Queries; -using Workflow.Application.Common; - -namespace BuildFlow.Host.Endpoints.Workflow.BuildFlow.Applications; - -/// BuildFlow 应用分页查询端点。GET /buildflow/applications。 -public class GetBuildFlowApplicationListEndpoint(IMediator mediator) - : Endpoint> -{ - public override void Configure() - { - Get("/buildflow/applications"); - Permissions("buildflow:application:read"); - } - - public override async Task HandleAsync(GetBuildFlowApplicationListRequest req, CancellationToken ct) - { - var result = await mediator.Send( - new GetBuildFlowApplicationListQuery(req.PageIndex, req.PageSize, req.Status, req.Keyword), - ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Applications/GetBuildFlowApplicationListRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Applications/GetBuildFlowApplicationListRequest.cs deleted file mode 100644 index 4bd3880..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Applications/GetBuildFlowApplicationListRequest.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Workflow.Domain.Enums; - -namespace BuildFlow.Host.Endpoints.Workflow.BuildFlow.Applications; - -/// BuildFlow 应用分页查询请求。 -public class GetBuildFlowApplicationListRequest -{ - public int PageIndex { get; set; } = 1; - public int PageSize { get; set; } = 20; - public BuildFlowMetadataStatus? Status { get; set; } - public string? Keyword { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/CreateBuildFlowButtonDefinitionEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/CreateBuildFlowButtonDefinitionEndpoint.cs deleted file mode 100644 index 5a94862..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/CreateBuildFlowButtonDefinitionEndpoint.cs +++ /dev/null @@ -1,40 +0,0 @@ -using MediatR; -using Workflow.Application.BuildFlow.Buttons.Commands; -using Workflow.Application.BuildFlow.Buttons.DTOs; - -namespace BuildFlow.Host.Endpoints.Workflow.BuildFlow.Buttons; - -/// 创建 BuildFlow 按钮定义端点。POST /buildflow/buttons。 -public class CreateBuildFlowButtonDefinitionEndpoint(IMediator mediator) - : Endpoint -{ - public override void Configure() - { - Post("/buildflow/buttons"); - Permissions("buildflow:button:create"); - } - - public override async Task HandleAsync(CreateBuildFlowButtonDefinitionRequest req, CancellationToken ct) - { - var result = await mediator.Send( - new CreateBuildFlowButtonDefinitionCommand( - req.ApplicationId, - req.PageDefinitionId, - req.FormDefinitionId, - req.WorkflowDefinitionId, - req.Code, - req.Label, - req.Icon, - req.Placement, - req.PermissionCode, - req.VisibleWhenJson, - req.DisabledWhenJson, - req.ConfirmJson, - req.BeforeActionsJson, - req.ActionsJson, - req.AfterActionsJson, - req.SortOrder), - ct); - await Send.ResponseAsync(result, 201, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/CreateBuildFlowButtonDefinitionRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/CreateBuildFlowButtonDefinitionRequest.cs deleted file mode 100644 index f2e32a6..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/CreateBuildFlowButtonDefinitionRequest.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Workflow.Domain.Enums; - -namespace BuildFlow.Host.Endpoints.Workflow.BuildFlow.Buttons; - -/// 创建 BuildFlow 按钮定义请求。含三阶段动作链(before/main/after)。 -public sealed record CreateBuildFlowButtonDefinitionRequest( - Guid? ApplicationId, - Guid? PageDefinitionId, - Guid? FormDefinitionId, - Guid? WorkflowDefinitionId, - string Code, - string Label, - string? Icon, - BuildFlowButtonPlacement Placement, - string? PermissionCode, - string? VisibleWhenJson, - string? DisabledWhenJson, - string? ConfirmJson, - string? BeforeActionsJson, - string ActionsJson, - string? AfterActionsJson, - int SortOrder); diff --git a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/ExecuteBuildFlowButtonEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/ExecuteBuildFlowButtonEndpoint.cs deleted file mode 100644 index 913b946..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/ExecuteBuildFlowButtonEndpoint.cs +++ /dev/null @@ -1,22 +0,0 @@ -using MediatR; -using Workflow.Application.BuildFlow.Buttons.Commands; -using Workflow.Application.BuildFlow.Buttons.DTOs; - -namespace BuildFlow.Host.Endpoints.Workflow.BuildFlow.Buttons; - -/// 执行 BuildFlow 按钮动作链端点。POST /buildflow/buttons/{id}/execute。 -public class ExecuteBuildFlowButtonEndpoint(IMediator mediator) - : Endpoint -{ - public override void Configure() - { - Post("/buildflow/buttons/{id}/execute"); - Permissions("buildflow:button:execute"); - } - - public override async Task HandleAsync(ExecuteBuildFlowButtonRequest req, CancellationToken ct) - { - var result = await mediator.Send(new ExecuteBuildFlowButtonCommand(req.Id, req.InputJson), ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/ExecuteBuildFlowButtonRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/ExecuteBuildFlowButtonRequest.cs deleted file mode 100644 index b075509..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/ExecuteBuildFlowButtonRequest.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.BuildFlow.Buttons; - -/// 执行 BuildFlow 按钮动作链请求。 -public sealed record ExecuteBuildFlowButtonRequest(Guid Id, string InputJson); diff --git a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/GetBuildFlowButtonDefinitionListEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/GetBuildFlowButtonDefinitionListEndpoint.cs deleted file mode 100644 index cdfc731..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/GetBuildFlowButtonDefinitionListEndpoint.cs +++ /dev/null @@ -1,33 +0,0 @@ -using MediatR; -using Workflow.Application.BuildFlow.Buttons.DTOs; -using Workflow.Application.BuildFlow.Buttons.Queries; -using Workflow.Application.Common; - -namespace BuildFlow.Host.Endpoints.Workflow.BuildFlow.Buttons; - -/// BuildFlow 按钮定义分页查询端点。GET /buildflow/buttons。 -public class GetBuildFlowButtonDefinitionListEndpoint(IMediator mediator) - : Endpoint> -{ - public override void Configure() - { - Get("/buildflow/buttons"); - Permissions("buildflow:button:read"); - } - - public override async Task HandleAsync(GetBuildFlowButtonDefinitionListRequest req, CancellationToken ct) - { - var result = await mediator.Send( - new GetBuildFlowButtonDefinitionListQuery( - req.PageIndex, - req.PageSize, - req.ApplicationId, - req.PageDefinitionId, - req.FormDefinitionId, - req.WorkflowDefinitionId, - req.Placement, - req.Status), - ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/GetBuildFlowButtonDefinitionListRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/GetBuildFlowButtonDefinitionListRequest.cs deleted file mode 100644 index 2683fe3..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Buttons/GetBuildFlowButtonDefinitionListRequest.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Workflow.Domain.Enums; - -namespace BuildFlow.Host.Endpoints.Workflow.BuildFlow.Buttons; - -/// BuildFlow 按钮定义分页查询请求。 -public class GetBuildFlowButtonDefinitionListRequest -{ - public int PageIndex { get; set; } = 1; - public int PageSize { get; set; } = 20; - public Guid? ApplicationId { get; set; } - public Guid? PageDefinitionId { get; set; } - public Guid? FormDefinitionId { get; set; } - public Guid? WorkflowDefinitionId { get; set; } - public BuildFlowButtonPlacement? Placement { get; set; } - public BuildFlowMetadataStatus? Status { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Pages/CreateBuildFlowPageDefinitionEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Pages/CreateBuildFlowPageDefinitionEndpoint.cs deleted file mode 100644 index a1aa723..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Pages/CreateBuildFlowPageDefinitionEndpoint.cs +++ /dev/null @@ -1,29 +0,0 @@ -using MediatR; -using Workflow.Application.BuildFlow.Pages.Commands; -using Workflow.Application.BuildFlow.Pages.DTOs; - -namespace BuildFlow.Host.Endpoints.Workflow.BuildFlow.Pages; - -/// 创建 BuildFlow 页面定义端点。POST /buildflow/pages。 -public class CreateBuildFlowPageDefinitionEndpoint(IMediator mediator) - : Endpoint -{ - public override void Configure() - { - Post("/buildflow/pages"); - Permissions("buildflow:page:create"); - } - - public override async Task HandleAsync(CreateBuildFlowPageDefinitionRequest req, CancellationToken ct) - { - var result = await mediator.Send( - new CreateBuildFlowPageDefinitionCommand( - req.ApplicationId, - req.Code, - req.Name, - req.PageType, - req.SchemaJson), - ct); - await Send.ResponseAsync(result, 201, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Pages/CreateBuildFlowPageDefinitionRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Pages/CreateBuildFlowPageDefinitionRequest.cs deleted file mode 100644 index c5a8452..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Pages/CreateBuildFlowPageDefinitionRequest.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Workflow.Domain.Enums; - -namespace BuildFlow.Host.Endpoints.Workflow.BuildFlow.Pages; - -/// 创建 BuildFlow 页面定义请求。 -public sealed record CreateBuildFlowPageDefinitionRequest( - Guid ApplicationId, - string Code, - string Name, - BuildFlowPageType PageType, - string SchemaJson); diff --git a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Pages/GetBuildFlowPageDefinitionListEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Pages/GetBuildFlowPageDefinitionListEndpoint.cs deleted file mode 100644 index a020916..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Pages/GetBuildFlowPageDefinitionListEndpoint.cs +++ /dev/null @@ -1,30 +0,0 @@ -using MediatR; -using Workflow.Application.BuildFlow.Pages.DTOs; -using Workflow.Application.BuildFlow.Pages.Queries; -using Workflow.Application.Common; - -namespace BuildFlow.Host.Endpoints.Workflow.BuildFlow.Pages; - -/// BuildFlow 页面定义分页查询端点。GET /buildflow/pages。 -public class GetBuildFlowPageDefinitionListEndpoint(IMediator mediator) - : Endpoint> -{ - public override void Configure() - { - Get("/buildflow/pages"); - Permissions("buildflow:page:read"); - } - - public override async Task HandleAsync(GetBuildFlowPageDefinitionListRequest req, CancellationToken ct) - { - var result = await mediator.Send( - new GetBuildFlowPageDefinitionListQuery( - req.PageIndex, - req.PageSize, - req.ApplicationId, - req.PageType, - req.Status), - ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Pages/GetBuildFlowPageDefinitionListRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Pages/GetBuildFlowPageDefinitionListRequest.cs deleted file mode 100644 index 3bf80d1..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/BuildFlow/Pages/GetBuildFlowPageDefinitionListRequest.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Workflow.Domain.Enums; - -namespace BuildFlow.Host.Endpoints.Workflow.BuildFlow.Pages; - -/// BuildFlow 页面定义分页查询请求。 -public class GetBuildFlowPageDefinitionListRequest -{ - public int PageIndex { get; set; } = 1; - public int PageSize { get; set; } = 20; - public Guid? ApplicationId { get; set; } - public BuildFlowPageType? PageType { get; set; } - public BuildFlowMetadataStatus? Status { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/CompareFormVersionsEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/CompareFormVersionsEndpoint.cs deleted file mode 100644 index 3fb85e9..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/CompareFormVersionsEndpoint.cs +++ /dev/null @@ -1,33 +0,0 @@ -using MediatR; -using Workflow.Application.Form.DTOs; -using Workflow.Application.Form.FormDefinition.Queries; - -namespace BuildFlow.Host.Endpoints.Workflow.Form; - - -/// -/// 对比两个表单版本差异端点。 -/// -public class CompareFormVersionsEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public CompareFormVersionsEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Get("/forms/{Id}/versions/compare"); - Permissions("form:read"); - Summary(s => - { - s.Summary = "对比表单的两个版本"; - }); - } - - public override async Task HandleAsync(CompareFormVersionsRequest req, CancellationToken ct) - { - var query = new CompareFormVersionsQuery(req.Id, req.OldVersionId, req.NewVersionId); - var result = await _mediator.Send(query, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/CompareFormVersionsRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/CompareFormVersionsRequest.cs deleted file mode 100644 index 3f1bb78..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/CompareFormVersionsRequest.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.Form; - -/// -/// 版本对比请求体。含两个版本 ID。 -/// -public class CompareFormVersionsRequest -{ - public Guid Id { get; set; } - public Guid? OldVersionId { get; set; } - public Guid? NewVersionId { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/CreateFormComponentEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/CreateFormComponentEndpoint.cs deleted file mode 100644 index 239130e..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/CreateFormComponentEndpoint.cs +++ /dev/null @@ -1,35 +0,0 @@ -using MediatR; -using Workflow.Application.Form.ComponentRegistry.Commands; -using Workflow.Application.Form.ComponentRegistry.DTOs; - -namespace BuildFlow.Host.Endpoints.Workflow.Form; - - -/// -/// 创建表单组件端点(可复用组件库)。 -/// -public class CreateFormComponentEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public CreateFormComponentEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Post("/form-components"); - Permissions("form:write"); - Summary(s => - { - s.Summary = "创建组件注册"; - }); - } - - public override async Task HandleAsync(CreateFormComponentRequest req, CancellationToken ct) - { - var command = new CreateFormComponentCommand( - req.Name, req.DisplayName, req.Category, req.Icon, - req.DefaultSchema, req.SupportedProps); - var result = await _mediator.Send(command, ct); - await Send.ResponseAsync(result, 201, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/CreateFormComponentRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/CreateFormComponentRequest.cs deleted file mode 100644 index 274b548..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/CreateFormComponentRequest.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.Form; - -/// -/// 创建表单组件请求体。 -/// -public class CreateFormComponentRequest -{ - public string Name { get; set; } = string.Empty; - public string DisplayName { get; set; } = string.Empty; - public string Category { get; set; } = string.Empty; - public string Icon { get; set; } = string.Empty; - public string DefaultSchema { get; set; } = string.Empty; - public string SupportedProps { get; set; } = "{}"; -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/CreateFormDefinitionEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/CreateFormDefinitionEndpoint.cs deleted file mode 100644 index 74537e6..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/CreateFormDefinitionEndpoint.cs +++ /dev/null @@ -1,29 +0,0 @@ -using MediatR; -using Workflow.Application.Form.DTOs; -using Workflow.Application.Form.FormDefinition.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.Form; - - -/// -/// 创建表单定义端点。POST /forms,含字段 schema。 -/// -public class CreateFormDefinitionEndpoint(IMediator mediator) : Endpoint -{ - public override void Configure() - { - Post("/forms"); - Permissions("form:write"); - Summary(s => - { - s.Summary = "创建表单定义(传入 Formily JSON Schema)"; - }); - } - - public override async Task HandleAsync(CreateFormDefinitionRequest req, CancellationToken ct) - { - var command = new CreateFormDefinitionCommand(req.Name, req.Code, req.Description, req.SchemaJson); - var result = await mediator.Send(command, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/CreateFormDefinitionRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/CreateFormDefinitionRequest.cs deleted file mode 100644 index 728ee53..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/CreateFormDefinitionRequest.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.Form; - -/// -/// 创建表单定义请求体。含表单名与字段 schema。 -/// -public class CreateFormDefinitionRequest -{ - public string Name { get; set; } = string.Empty; - public string Code { get; set; } = string.Empty; - public string? Description { get; set; } - /// - /// Formily JSON Schema 字符串。 - /// - public string SchemaJson { get; set; } = string.Empty; -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/DeleteFormComponentEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/DeleteFormComponentEndpoint.cs deleted file mode 100644 index c54fb75..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/DeleteFormComponentEndpoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MediatR; -using Workflow.Application.Form.ComponentRegistry.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.Form; - - -/// -/// 删除表单组件端点。 -/// -public class DeleteFormComponentEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public DeleteFormComponentEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Delete("/form-components/{Id}"); - Permissions("form:write"); - Summary(s => - { - s.Summary = "删除组件注册(软删除)"; - }); - } - - public override async Task HandleAsync(DeleteFormComponentRequest req, CancellationToken ct) - { - var command = new DeleteFormComponentCommand(req.Id); - await _mediator.Send(command, ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/DeleteFormComponentRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/DeleteFormComponentRequest.cs deleted file mode 100644 index 7213cc2..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/DeleteFormComponentRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.Form; - -/// -/// 删除表单组件请求体(路由参数绑定)。 -/// -public class DeleteFormComponentRequest -{ - public Guid Id { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/DeleteFormDefinitionEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/DeleteFormDefinitionEndpoint.cs deleted file mode 100644 index 0e9a1bf..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/DeleteFormDefinitionEndpoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MediatR; -using Workflow.Application.Form.FormDefinition.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.Form; - - -/// -/// 删除表单定义端点。DELETE /forms/{Id}(校验无流程引用)。 -/// -public class DeleteFormDefinitionEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public DeleteFormDefinitionEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Delete("/forms/{Id}"); - Permissions("form:write"); - Summary(s => - { - s.Summary = "Delete a form definition (soft delete)"; - }); - } - - public override async Task HandleAsync(DeleteFormDefinitionRequest req, CancellationToken ct) - { - var command = new DeleteFormDefinitionCommand(req.Id); - await _mediator.Send(command, ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/DeleteFormDefinitionRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/DeleteFormDefinitionRequest.cs deleted file mode 100644 index 39f0bf9..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/DeleteFormDefinitionRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.Form; - -/// -/// 删除表单定义请求体(路由参数绑定)。 -/// -public class DeleteFormDefinitionRequest -{ - public Guid Id { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/DisableFormDefinitionEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/DisableFormDefinitionEndpoint.cs deleted file mode 100644 index 772cddb..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/DisableFormDefinitionEndpoint.cs +++ /dev/null @@ -1,30 +0,0 @@ -using MediatR; -using Workflow.Application.Form.FormDefinition.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.Form; - - -/// -/// 停用表单定义端点。阻断新流程引用。 -/// -public class DisableFormDefinitionEndpoint(IMediator mediator) : Endpoint -{ - public override void Configure() - { - Post("/forms/{Id}/disable"); - Permissions("form:write"); - Summary(s => - { - s.Summary = "禁用表单定义"; - }); - } - - public override async Task HandleAsync(DisableFormDefinitionRequest req, CancellationToken ct) - { - var command = new DisableFormDefinitionCommand(req.Id); - await mediator.Send(command, ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/DisableFormDefinitionRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/DisableFormDefinitionRequest.cs deleted file mode 100644 index 1855f62..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/DisableFormDefinitionRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.Form; - -/// -/// 停用表单定义请求体(路由参数绑定)。 -/// -public class DisableFormDefinitionRequest -{ - public Guid Id { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormComponentByIdEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormComponentByIdEndpoint.cs deleted file mode 100644 index eb5c02f..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormComponentByIdEndpoint.cs +++ /dev/null @@ -1,32 +0,0 @@ -using MediatR; -using Workflow.Application.Form.ComponentRegistry.DTOs; -using Workflow.Application.Form.ComponentRegistry.Queries; - -namespace BuildFlow.Host.Endpoints.Workflow.Form; - - -/// -/// 查询单个表单组件端点。 -/// -public class GetFormComponentByIdEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public GetFormComponentByIdEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Get("/form-components/{Id}"); - Permissions("form:read"); - Summary(s => - { - s.Summary = "根据ID获取组件注册详情"; - }); - } - - public override async Task HandleAsync(GetFormComponentByIdRequest req, CancellationToken ct) - { - var result = await _mediator.Send(new GetFormComponentByIdQuery(req.Id), ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormComponentByIdRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormComponentByIdRequest.cs deleted file mode 100644 index ccd2492..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormComponentByIdRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.Form; - -/// -/// 表单组件查询请求体(路由参数绑定)。 -/// -public class GetFormComponentByIdRequest -{ - public Guid Id { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormComponentsEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormComponentsEndpoint.cs deleted file mode 100644 index 80b46e9..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormComponentsEndpoint.cs +++ /dev/null @@ -1,33 +0,0 @@ -using MediatR; -using Workflow.Application.Form.ComponentRegistry.DTOs; -using Workflow.Application.Form.ComponentRegistry.Queries; - -namespace BuildFlow.Host.Endpoints.Workflow.Form; - -/// -/// 查询表单组件库列表端点。 -/// -public class GetFormComponentsEndpoint : EndpointWithoutRequest> -{ - private readonly IMediator _mediator; - - public GetFormComponentsEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Get("/form-components"); - Permissions("form:read"); - Summary(s => - { - s.Summary = "获取组件注册列表"; - }); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var category = Query("category", isRequired: false); - var isActive = Query("isActive", isRequired: false); - var result = await _mediator.Send(new GetFormComponentsQuery(category, isActive), ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDataByInstanceEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDataByInstanceEndpoint.cs deleted file mode 100644 index 757f43f..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDataByInstanceEndpoint.cs +++ /dev/null @@ -1,33 +0,0 @@ -using MediatR; -using Workflow.Application.Form.DTOs; -using Workflow.Application.Form.FormData.Queries; - -namespace BuildFlow.Host.Endpoints.Workflow.Form; - - -/// -/// 按流程实例查询表单数据端点。 -/// -public class GetFormDataByInstanceEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public GetFormDataByInstanceEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Get("/forms/data/{InstanceId}"); - Permissions("form:read"); - Summary(s => - { - s.Summary = "Get form data by workflow instance id"; - }); - } - - public override async Task HandleAsync(GetFormDataByInstanceRequest req, CancellationToken ct) - { - var query = new GetFormDataByInstanceQuery(req.InstanceId); - var result = await _mediator.Send(query, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDataByInstanceRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDataByInstanceRequest.cs deleted file mode 100644 index 52fea89..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDataByInstanceRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.Form; - -/// -/// 实例表单数据查询请求体。 -/// -public class GetFormDataByInstanceRequest -{ - public Guid InstanceId { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDefinitionByIdEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDefinitionByIdEndpoint.cs deleted file mode 100644 index 467395b..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDefinitionByIdEndpoint.cs +++ /dev/null @@ -1,33 +0,0 @@ -using MediatR; -using Workflow.Application.Form.DTOs; -using Workflow.Application.Form.FormDefinition.Queries; - -namespace BuildFlow.Host.Endpoints.Workflow.Form; - - -/// -/// 查询表单定义详情端点。GET /forms/{Id}。 -/// -public class GetFormDefinitionByIdEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public GetFormDefinitionByIdEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Get("/forms/{Id}"); - Permissions("form:read"); - Summary(s => - { - s.Summary = "Get form definition detail by id (includes fields)"; - }); - } - - public override async Task HandleAsync(GetFormDefinitionByIdRequest req, CancellationToken ct) - { - var query = new GetFormDefinitionByIdQuery(req.Id); - var result = await _mediator.Send(query, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDefinitionByIdRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDefinitionByIdRequest.cs deleted file mode 100644 index d09c45c..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDefinitionByIdRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.Form; - -/// -/// 表单定义详情查询请求体(路由参数绑定)。 -/// -public class GetFormDefinitionByIdRequest -{ - public Guid Id { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDefinitionListEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDefinitionListEndpoint.cs deleted file mode 100644 index d1a1db5..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDefinitionListEndpoint.cs +++ /dev/null @@ -1,33 +0,0 @@ -using MediatR; -using Workflow.Application.Form.DTOs; -using Workflow.Application.Form.FormDefinition.Queries; - -namespace BuildFlow.Host.Endpoints.Workflow.Form; - - -/// -/// 查询表单定义列表端点。GET /forms。 -/// -public class GetFormDefinitionListEndpoint : Endpoint> -{ - private readonly IMediator _mediator; - - public GetFormDefinitionListEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Get("/forms"); - Permissions("form:read"); - Summary(s => - { - s.Summary = "Get paginated list of form definitions"; - }); - } - - public override async Task HandleAsync(GetFormDefinitionListRequest req, CancellationToken ct) - { - var query = new GetFormDefinitionListQuery(req.PageIndex, req.PageSize, req.Status); - var result = await _mediator.Send(query, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDefinitionListRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDefinitionListRequest.cs deleted file mode 100644 index 803692a..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormDefinitionListRequest.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Workflow.Domain.Enums; - -namespace BuildFlow.Host.Endpoints.Workflow.Form; - -/// -/// 表单定义列表查询请求体。含分页与状态过滤。 -/// -public class GetFormDefinitionListRequest -{ - public int PageIndex { get; set; } = 1; - public int PageSize { get; set; } = 20; - public FormStatus? Status { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormVersionsEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormVersionsEndpoint.cs deleted file mode 100644 index 6c9ed7e..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/GetFormVersionsEndpoint.cs +++ /dev/null @@ -1,32 +0,0 @@ -using MediatR; -using Workflow.Application.Form.DTOs; -using Workflow.Application.Form.FormDefinition.Queries; - -namespace BuildFlow.Host.Endpoints.Workflow.Form; - -/// -/// 查询表单版本历史端点。GET /forms/{Id}/versions。 -/// -public class GetFormVersionsEndpoint : EndpointWithoutRequest> -{ - private readonly IMediator _mediator; - - public GetFormVersionsEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Get("/forms/{Id}/versions"); - Permissions("form:read"); - Summary(s => - { - s.Summary = "获取表单的历史版本列表"; - }); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var id = Route("Id"); - var result = await _mediator.Send(new GetFormVersionsQuery(id), ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/PublishFormDefinitionEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/PublishFormDefinitionEndpoint.cs deleted file mode 100644 index 4dbba4c..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/PublishFormDefinitionEndpoint.cs +++ /dev/null @@ -1,29 +0,0 @@ -using MediatR; -using Workflow.Application.Form.FormDefinition.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.Form; - -/// -/// 发布表单定义端点。锁定 schema,可供流程引用。 -/// -public class PublishFormDefinitionEndpoint(IMediator mediator) : EndpointWithoutRequest -{ - public override void Configure() - { - Post("/forms/{Id}/publish"); - Permissions("form:write"); - Summary(s => - { - s.Summary = "Publish a form definition"; - }); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var id = Route("Id"); - await mediator.Send(new PublishFormDefinitionCommand(id), ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/SubmitFormDataEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/SubmitFormDataEndpoint.cs deleted file mode 100644 index e2c3a43..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/SubmitFormDataEndpoint.cs +++ /dev/null @@ -1,32 +0,0 @@ -using MediatR; -using Workflow.Application.Form.FormData.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.Form; - - -/// -/// 提交表单数据端点。关联流程实例写入 formData。 -/// -public class SubmitFormDataEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public SubmitFormDataEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Post("/forms/data"); - Permissions("form:submit"); - Summary(s => - { - s.Summary = "Submit form data for a workflow instance"; - }); - } - - public override async Task HandleAsync(SubmitFormDataRequest req, CancellationToken ct) - { - var command = new SubmitFormDataCommand(req.FormDefinitionId, req.InstanceId, req.DataJson); - var result = await _mediator.Send(command, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/SubmitFormDataRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/SubmitFormDataRequest.cs deleted file mode 100644 index 93d896d..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/SubmitFormDataRequest.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.Form; - -/// -/// 提交表单数据请求体。含表单定义 ID 与数据 JSON。 -/// -public class SubmitFormDataRequest -{ - public Guid FormDefinitionId { get; set; } - public Guid InstanceId { get; set; } - public string DataJson { get; set; } = string.Empty; -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/UpdateFormComponentEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/UpdateFormComponentEndpoint.cs deleted file mode 100644 index 6034fc2..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/UpdateFormComponentEndpoint.cs +++ /dev/null @@ -1,35 +0,0 @@ -using MediatR; -using Workflow.Application.Form.ComponentRegistry.Commands; -using Workflow.Application.Form.ComponentRegistry.DTOs; - -namespace BuildFlow.Host.Endpoints.Workflow.Form; - - -/// -/// 更新表单组件端点。 -/// -public class UpdateFormComponentEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public UpdateFormComponentEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Put("/form-components/{Id}"); - Permissions("form:write"); - Summary(s => - { - s.Summary = "更新组件注册"; - }); - } - - public override async Task HandleAsync(UpdateFormComponentRequest req, CancellationToken ct) - { - var command = new UpdateFormComponentCommand( - req.Id, req.DisplayName, req.Category, req.Icon, - req.DefaultSchema, req.SupportedProps, req.IsActive); - var result = await _mediator.Send(command, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/UpdateFormComponentRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/UpdateFormComponentRequest.cs deleted file mode 100644 index 84022c8..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/UpdateFormComponentRequest.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.Form; - -/// -/// 更新表单组件请求体。 -/// -public class UpdateFormComponentRequest -{ - public Guid Id { get; set; } - public string DisplayName { get; set; } = string.Empty; - public string Category { get; set; } = string.Empty; - public string Icon { get; set; } = string.Empty; - public string DefaultSchema { get; set; } = string.Empty; - public string SupportedProps { get; set; } = "{}"; - public bool IsActive { get; set; } = true; -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/UpdateFormDefinitionEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/UpdateFormDefinitionEndpoint.cs deleted file mode 100644 index 649cc43..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/UpdateFormDefinitionEndpoint.cs +++ /dev/null @@ -1,36 +0,0 @@ -using MediatR; -using Workflow.Application.Form.DTOs; -using Workflow.Application.Form.FormDefinition.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.Form; - - -/// -/// 更新表单定义端点。PUT /forms/{Id}(仅 Draft 态可改)。 -/// -public class UpdateFormDefinitionEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public UpdateFormDefinitionEndpoint(IMediator mediator) - { - _mediator = mediator; - } - - public override void Configure() - { - Put("/forms/{Id}"); - Permissions("form:write"); - Summary(s => - { - s.Summary = "更新表单定义(传入新的 Formily JSON Schema)"; - }); - } - - public override async Task HandleAsync(UpdateFormDefinitionRequest req, CancellationToken ct) - { - var command = new UpdateFormDefinitionCommand(req.Id, req.Name, req.Description, req.SchemaJson); - var result = await _mediator.Send(command, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Form/UpdateFormDefinitionRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/Form/UpdateFormDefinitionRequest.cs deleted file mode 100644 index d901d1f..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Form/UpdateFormDefinitionRequest.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.Form; - -/// -/// 更新表单定义请求体。 -/// -public class UpdateFormDefinitionRequest -{ - public Guid Id { get; set; } - public string Name { get; set; } = string.Empty; - public string? Description { get; set; } - /// - /// Formily JSON Schema 字符串。 - /// - public string SchemaJson { get; set; } = string.Empty; -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Notification/GetNotificationsEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Notification/GetNotificationsEndpoint.cs deleted file mode 100644 index 85c4e65..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Notification/GetNotificationsEndpoint.cs +++ /dev/null @@ -1,27 +0,0 @@ -using BuildFlow.Host.Services.Users; -using BuildFlow.Shared.Domain.Common; -using MediatR; -using Workflow.Application.Common; -using Workflow.Application.Features.Notifications; - -namespace BuildFlow.Host.Endpoints.Workflow.Notification; - -/// 获取当前用户的通知列表(含按角色匹配的通知)。 -public class GetNotificationsEndpoint(IMediator mediator, ICurrentUserContext userContext) - : Endpoint> -{ - public override void Configure() - { - Get("/wf/notifications"); - Permissions("wf-notification:read"); - } - - public override async Task HandleAsync(GetNotificationsRequest req, CancellationToken ct) - { - var userId = userContext.GetUserIdGuid(); - var roles = User.GetUserRoles(); - var result = await mediator.Send( - new GetNotificationsQuery(userId, roles, req.UnreadOnly, req.PageIndex, req.PageSize), ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Notification/GetNotificationsRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/Notification/GetNotificationsRequest.cs deleted file mode 100644 index 3446af5..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Notification/GetNotificationsRequest.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.Notification; - -/// -/// 通知列表查询请求体。含分页与已读过滤。 -/// -public class GetNotificationsRequest -{ - public bool UnreadOnly { get; set; } - public int PageIndex { get; set; } = 1; - public int PageSize { get; set; } = 20; -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Notification/GetUnreadNotificationCountEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Notification/GetUnreadNotificationCountEndpoint.cs deleted file mode 100644 index b8bf4ec..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Notification/GetUnreadNotificationCountEndpoint.cs +++ /dev/null @@ -1,24 +0,0 @@ -using BuildFlow.Host.Services.Users; -using BuildFlow.Shared.Domain.Common; -using MediatR; -using Workflow.Application.Features.Notifications; - -namespace BuildFlow.Host.Endpoints.Workflow.Notification; - -/// 获取当前用户的未读通知数(前端角标用)。 -public class GetUnreadNotificationCountEndpoint(IMediator mediator, ICurrentUserContext userContext) : EndpointWithoutRequest -{ - public override void Configure() - { - Get("/wf/notifications/unread-count"); - Permissions("wf-notification:read"); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var userId = userContext.GetUserIdGuid(); - var roles = User.GetUserRoles(); - var count = await mediator.Send(new GetUnreadNotificationCountQuery(userId, roles), ct); - await Send.OkAsync(count, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Notification/MarkAllNotificationsReadEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Notification/MarkAllNotificationsReadEndpoint.cs deleted file mode 100644 index 30ffa1a..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Notification/MarkAllNotificationsReadEndpoint.cs +++ /dev/null @@ -1,26 +0,0 @@ -using BuildFlow.Host.Services.Users; -using BuildFlow.Shared.Domain.Common; -using MediatR; -using Workflow.Application.Features.Notifications; - -namespace BuildFlow.Host.Endpoints.Workflow.Notification; - -/// 标记当前用户所有通知为已读。 -public class MarkAllNotificationsReadEndpoint(IMediator mediator, ICurrentUserContext userContext) : EndpointWithoutRequest -{ - public override void Configure() - { - Post("/wf/notifications/read-all"); - Permissions("wf-notification:write"); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var userId = userContext.GetUserIdGuid(); - var roles = User.GetUserRoles(); - await mediator.Send(new MarkAllNotificationsReadCommand(userId, roles), ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Notification/MarkNotificationReadEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/Notification/MarkNotificationReadEndpoint.cs deleted file mode 100644 index c1875e4..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Notification/MarkNotificationReadEndpoint.cs +++ /dev/null @@ -1,26 +0,0 @@ -using BuildFlow.Host.Services.Users; -using BuildFlow.Shared.Domain.Common; -using MediatR; -using Workflow.Application.Features.Notifications; - -namespace BuildFlow.Host.Endpoints.Workflow.Notification; - -/// 标记单条通知为已读。 -public class MarkNotificationReadEndpoint(IMediator mediator, ICurrentUserContext userContext) : EndpointWithoutRequest -{ - public override void Configure() - { - Post("/wf/notifications/{Id}/read"); - Permissions("wf-notification:write"); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var id = Route("Id"); - var userId = userContext.GetUserIdGuid(); - await mediator.Send(new MarkNotificationReadCommand(id, userId), ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/Notification/NotificationClaimsExtensions.cs b/src/BuildFlow.Host/Endpoints/workflow/Notification/NotificationClaimsExtensions.cs deleted file mode 100644 index c4a8355..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/Notification/NotificationClaimsExtensions.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Security.Claims; - -namespace BuildFlow.Host.Endpoints.Workflow.Notification; - -/// ClaimsPrincipal 扩展。从 JWT claims 提取用户角色列表(兼容短名 role 与长名 ClaimTypes.Role)。 -internal static class NotificationClaimsExtensions -{ - public static IReadOnlyList GetUserRoles(this ClaimsPrincipal user) - { - return user.FindAll("role") - .Concat(user.FindAll(ClaimTypes.Role)) - .Select(c => c.Value) - .Where(v => !string.IsNullOrWhiteSpace(v)) - .Distinct() - .ToList(); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateEdgeEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateEdgeEndpoint.cs deleted file mode 100644 index 1131308..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateEdgeEndpoint.cs +++ /dev/null @@ -1,35 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowDefinitions.Commands; -using Workflow.Application.Features.WorkflowDefinitions.DTOs; -using Workflow.Domain.Enums; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - - -/// -/// 创建流程边端点。 -/// -[Obsolete("已废弃,改用整图 PUT 保存(过渡期保留)")] -public class CreateEdgeEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public CreateEdgeEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Post("/workflow-definitions/{DefinitionId}/edges"); - Permissions("workflow-definition:write"); - Summary(s => - { - s.Summary = "Create a new edge in a workflow definition"; - }); - } - - public override async Task HandleAsync(CreateEdgeRequest req, CancellationToken ct) - { - var command = new CreateEdgeCommand(req.DefinitionId, req.SourceNodeId, req.TargetNodeId, (EdgeType)req.EdgeType, req.Label, req.Condition, req.Order); - var result = await _mediator.Send(command, ct); - await Send.ResponseAsync(result, 201, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateEdgeRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateEdgeRequest.cs deleted file mode 100644 index eaeca1e..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateEdgeRequest.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - -/// -/// 创建边请求体。含源/目标节点与条件。 -/// -public class CreateEdgeRequest -{ - public Guid DefinitionId { get; set; } - public Guid SourceNodeId { get; set; } - public Guid TargetNodeId { get; set; } - public int EdgeType { get; set; } - public string? Label { get; set; } - public string? Condition { get; set; } - public int Order { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateNodeEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateNodeEndpoint.cs deleted file mode 100644 index ebd6ee0..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateNodeEndpoint.cs +++ /dev/null @@ -1,42 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowDefinitions.Commands; -using Workflow.Application.Features.WorkflowDefinitions.DTOs; -using Workflow.Domain.Enums; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - - -/// -/// 创建流程节点端点。 -/// -[Obsolete("已废弃,改用整图 PUT 保存(过渡期保留)")] -public class CreateNodeEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public CreateNodeEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Post("/workflow-definitions/{DefinitionId}/nodes"); - Permissions("workflow-definition:write"); - Summary(s => - { - s.Summary = "Create a new node in a workflow definition"; - }); - } - - public override async Task HandleAsync(CreateNodeRequest req, CancellationToken ct) - { - var command = new CreateNodeCommand( - req.DefinitionId, - (NodeType)req.NodeType, - req.Name, - req.Config, - req.PositionX, - req.PositionY, - req.FormDefinitionId); - var result = await _mediator.Send(command, ct); - await Send.ResponseAsync(result, 201, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateNodeRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateNodeRequest.cs deleted file mode 100644 index 8906a40..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateNodeRequest.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - -/// -/// 创建节点请求体。含节点类型与配置。 -/// -public class CreateNodeRequest -{ - public Guid DefinitionId { get; set; } - public int NodeType { get; set; } - public string Name { get; set; } = string.Empty; - public string? Config { get; set; } - public int PositionX { get; set; } - public int PositionY { get; set; } - public Guid? FormDefinitionId { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateWorkflowDefinitionEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateWorkflowDefinitionEndpoint.cs deleted file mode 100644 index 909384a..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateWorkflowDefinitionEndpoint.cs +++ /dev/null @@ -1,33 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowDefinitions.Commands; -using Workflow.Application.Features.WorkflowDefinitions.DTOs; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - - -/// -/// 创建流程定义端点。POST /definitions(Draft 态)。 -/// -public class CreateWorkflowDefinitionEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public CreateWorkflowDefinitionEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Post("/workflow-definitions"); - Permissions("workflow-definition:write"); - Summary(s => - { - s.Summary = "Create a new workflow definition"; - }); - } - - public override async Task HandleAsync(CreateWorkflowDefinitionRequest req, CancellationToken ct) - { - var command = new CreateWorkflowDefinitionCommand(req.Name, req.Code, req.Description, req.FormDefinitionId); - var result = await _mediator.Send(command, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateWorkflowDefinitionRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateWorkflowDefinitionRequest.cs deleted file mode 100644 index 06fa64e..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/CreateWorkflowDefinitionRequest.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - -/// -/// 创建流程定义请求体。含名称与节点/边。 -/// -public class CreateWorkflowDefinitionRequest -{ - public string Name { get; set; } = string.Empty; - public string Code { get; set; } = string.Empty; - public string? Description { get; set; } - public Guid? FormDefinitionId { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteEdgeEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteEdgeEndpoint.cs deleted file mode 100644 index 7636a62..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteEdgeEndpoint.cs +++ /dev/null @@ -1,35 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowDefinitions.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - - -/// -/// 删除流程边端点。 -/// -[Obsolete("已废弃,改用整图 PUT 保存(过渡期保留)")] -public class DeleteEdgeEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public DeleteEdgeEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Delete("/workflow-definitions/{DefinitionId}/edges/{EdgeId}"); - Permissions("workflow-definition:write"); - Summary(s => - { - s.Summary = "Delete an edge from a workflow definition"; - }); - } - - public override async Task HandleAsync(DeleteEdgeRequest req, CancellationToken ct) - { - var command = new DeleteEdgeCommand(req.EdgeId); - await _mediator.Send(command, ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteEdgeRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteEdgeRequest.cs deleted file mode 100644 index b04fc0f..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteEdgeRequest.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - -/// -/// 删除边请求体(路由参数绑定)。 -/// -public class DeleteEdgeRequest -{ - public Guid DefinitionId { get; set; } - public Guid EdgeId { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteNodeEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteNodeEndpoint.cs deleted file mode 100644 index 5efebd3..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteNodeEndpoint.cs +++ /dev/null @@ -1,35 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowDefinitions.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - - -/// -/// 删除流程节点端点。 -/// -[Obsolete("已废弃,改用整图 PUT 保存(过渡期保留)")] -public class DeleteNodeEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public DeleteNodeEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Delete("/workflow-definitions/{DefinitionId}/nodes/{NodeId}"); - Permissions("workflow-definition:write"); - Summary(s => - { - s.Summary = "Delete a node from a workflow definition"; - }); - } - - public override async Task HandleAsync(DeleteNodeRequest req, CancellationToken ct) - { - var command = new DeleteNodeCommand(req.NodeId); - await _mediator.Send(command, ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteNodeRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteNodeRequest.cs deleted file mode 100644 index 41c430f..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteNodeRequest.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - -/// -/// 删除节点请求体(路由参数绑定)。 -/// -public class DeleteNodeRequest -{ - public Guid DefinitionId { get; set; } - public Guid NodeId { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteWorkflowDefinitionEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteWorkflowDefinitionEndpoint.cs deleted file mode 100644 index 3955e53..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteWorkflowDefinitionEndpoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowDefinitions.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - - -/// -/// 删除流程定义端点(校验无运行中实例)。 -/// -public class DeleteWorkflowDefinitionEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public DeleteWorkflowDefinitionEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Delete("/workflow-definitions/{Id}"); - Permissions("workflow-definition:write"); - Summary(s => - { - s.Summary = "Delete a workflow definition (soft delete)"; - }); - } - - public override async Task HandleAsync(DeleteWorkflowDefinitionRequest req, CancellationToken ct) - { - var command = new DeleteWorkflowDefinitionCommand(req.Id); - await _mediator.Send(command, ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteWorkflowDefinitionRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteWorkflowDefinitionRequest.cs deleted file mode 100644 index 73ce477..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DeleteWorkflowDefinitionRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - -/// -/// 删除流程定义请求体(路由参数绑定)。 -/// -public class DeleteWorkflowDefinitionRequest -{ - public Guid Id { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DisableWorkflowDefinitionEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DisableWorkflowDefinitionEndpoint.cs deleted file mode 100644 index ba08d7c..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/DisableWorkflowDefinitionEndpoint.cs +++ /dev/null @@ -1,29 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowDefinitions.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - -/// -/// 停用流程定义端点。阻断新实例发起。 -/// -public class DisableWorkflowDefinitionEndpoint(IMediator mediator) : EndpointWithoutRequest -{ - public override void Configure() - { - Post("/workflow-definitions/{Id}/disable"); - Permissions("workflow-definition:write"); - Summary(s => - { - s.Summary = "Disable a workflow definition"; - }); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var id = Route("Id"); - await mediator.Send(new DisableWorkflowDefinitionCommand(id), ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/GetWorkflowDefinitionByIdEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/GetWorkflowDefinitionByIdEndpoint.cs deleted file mode 100644 index 5af15f2..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/GetWorkflowDefinitionByIdEndpoint.cs +++ /dev/null @@ -1,33 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowDefinitions.DTOs; -using Workflow.Application.Features.WorkflowDefinitions.Queries; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - - -/// -/// 查询流程定义详情端点。GET /definitions/{Id}。 -/// -public class GetWorkflowDefinitionByIdEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public GetWorkflowDefinitionByIdEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Get("/workflow-definitions/{Id}"); - Permissions("workflow-definition:read"); - Summary(s => - { - s.Summary = "Get workflow definition detail by id (includes nodes and edges)"; - }); - } - - public override async Task HandleAsync(GetWorkflowDefinitionByIdRequest req, CancellationToken ct) - { - var query = new GetWorkflowDefinitionByIdQuery(req.Id); - var result = await _mediator.Send(query, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/GetWorkflowDefinitionByIdRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/GetWorkflowDefinitionByIdRequest.cs deleted file mode 100644 index 59ed456..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/GetWorkflowDefinitionByIdRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - -/// -/// 流程定义详情查询请求体(路由参数绑定)。 -/// -public class GetWorkflowDefinitionByIdRequest -{ - public Guid Id { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/GetWorkflowDefinitionListEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/GetWorkflowDefinitionListEndpoint.cs deleted file mode 100644 index 99688b6..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/GetWorkflowDefinitionListEndpoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MediatR; -using Workflow.Application.Common; -using Workflow.Application.Features.WorkflowDefinitions.DTOs; -using Workflow.Application.Features.WorkflowDefinitions.Queries; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - - -/// -/// 查询流程定义列表端点。GET /definitions。 -/// -public class GetWorkflowDefinitionListEndpoint : Endpoint> -{ - private readonly IMediator _mediator; - - public GetWorkflowDefinitionListEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Get("/workflow-definitions"); - Permissions("workflow-definition:read"); - Summary(s => - { - s.Summary = "Get paginated list of workflow definitions"; - }); - } - - public override async Task HandleAsync(GetWorkflowDefinitionListRequest req, CancellationToken ct) - { - var query = new GetWorkflowDefinitionListQuery(req.PageIndex, req.PageSize, req.Status); - var result = await _mediator.Send(query, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/GetWorkflowDefinitionListRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/GetWorkflowDefinitionListRequest.cs deleted file mode 100644 index e560d0a..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/GetWorkflowDefinitionListRequest.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Workflow.Domain.Enums; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - -/// -/// 流程定义列表查询请求体。含分页与状态过滤。 -/// -public class GetWorkflowDefinitionListRequest -{ - public int PageIndex { get; set; } = 1; - public int PageSize { get; set; } = 20; - public DefinitionStatus? Status { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/PublishWorkflowDefinitionEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/PublishWorkflowDefinitionEndpoint.cs deleted file mode 100644 index 1fcc632..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/PublishWorkflowDefinitionEndpoint.cs +++ /dev/null @@ -1,29 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowDefinitions.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - -/// -/// 发布流程定义端点。锁定不可改,可发起实例。 -/// -public class PublishWorkflowDefinitionEndpoint(IMediator mediator) : EndpointWithoutRequest -{ - public override void Configure() - { - Post("/workflow-definitions/{Id}/publish"); - Permissions("workflow-definition:write"); - Summary(s => - { - s.Summary = "Publish a workflow definition"; - }); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var id = Route("Id"); - await mediator.Send(new PublishWorkflowDefinitionCommand(id), ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateEdgeEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateEdgeEndpoint.cs deleted file mode 100644 index 7512154..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateEdgeEndpoint.cs +++ /dev/null @@ -1,35 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowDefinitions.Commands; -using Workflow.Application.Features.WorkflowDefinitions.DTOs; -using Workflow.Domain.Enums; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - - -/// -/// 更新流程边端点。 -/// -[Obsolete("已废弃,改用整图 PUT 保存(过渡期保留)")] -public class UpdateEdgeEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public UpdateEdgeEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Put("/workflow-definitions/{DefinitionId}/edges/{EdgeId}"); - Permissions("workflow-definition:write"); - Summary(s => - { - s.Summary = "Update an edge in a workflow definition"; - }); - } - - public override async Task HandleAsync(UpdateEdgeRequest req, CancellationToken ct) - { - var command = new UpdateEdgeCommand(req.EdgeId, (EdgeType)req.EdgeType, req.Label, req.Condition, req.Order); - var result = await _mediator.Send(command, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateEdgeRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateEdgeRequest.cs deleted file mode 100644 index 80b6d7f..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateEdgeRequest.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - -/// -/// 更新边请求体。 -/// -public class UpdateEdgeRequest -{ - public Guid DefinitionId { get; set; } - public Guid EdgeId { get; set; } - public int EdgeType { get; set; } - public string? Label { get; set; } - public string? Condition { get; set; } - public int Order { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateNodeEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateNodeEndpoint.cs deleted file mode 100644 index 29af4c7..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateNodeEndpoint.cs +++ /dev/null @@ -1,40 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowDefinitions.Commands; -using Workflow.Application.Features.WorkflowDefinitions.DTOs; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - - -/// -/// 更新流程节点端点。 -/// -[Obsolete("已废弃,改用整图 PUT 保存(过渡期保留)")] -public class UpdateNodeEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public UpdateNodeEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Put("/workflow-definitions/{DefinitionId}/nodes/{NodeId}"); - Permissions("workflow-definition:write"); - Summary(s => - { - s.Summary = "Update a node in a workflow definition"; - }); - } - - public override async Task HandleAsync(UpdateNodeRequest req, CancellationToken ct) - { - var command = new UpdateNodeCommand( - req.NodeId, - req.Name, - req.Config, - req.PositionX, - req.PositionY, - req.FormDefinitionId); - var result = await _mediator.Send(command, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateNodeRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateNodeRequest.cs deleted file mode 100644 index 02f6dcd..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateNodeRequest.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - -/// -/// 更新节点请求体。 -/// -public class UpdateNodeRequest -{ - public Guid DefinitionId { get; set; } - public Guid NodeId { get; set; } - public string Name { get; set; } = string.Empty; - public string? Config { get; set; } - public int PositionX { get; set; } - public int PositionY { get; set; } - public Guid? FormDefinitionId { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateWorkflowDefinitionEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateWorkflowDefinitionEndpoint.cs deleted file mode 100644 index a83a7ab..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateWorkflowDefinitionEndpoint.cs +++ /dev/null @@ -1,33 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowDefinitions.Commands; -using Workflow.Application.Features.WorkflowDefinitions.DTOs; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - - -/// -/// 更新流程定义端点(仅 Draft 态可改)。 -/// -public class UpdateWorkflowDefinitionEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public UpdateWorkflowDefinitionEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Put("/workflow-definitions/{Id}"); - Permissions("workflow-definition:write"); - Summary(s => - { - s.Summary = "Update a workflow definition"; - }); - } - - public override async Task HandleAsync(UpdateWorkflowDefinitionRequest req, CancellationToken ct) - { - var command = new UpdateWorkflowDefinitionCommand(req.Id, req.Name, req.Description, req.DefinitionJson, req.FormDefinitionId); - var result = await _mediator.Send(command, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateWorkflowDefinitionRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateWorkflowDefinitionRequest.cs deleted file mode 100644 index 1a3d5ac..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowDefinition/UpdateWorkflowDefinitionRequest.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowDefinition; - -/// -/// 更新流程定义请求体。 -/// -public class UpdateWorkflowDefinitionRequest -{ - public Guid Id { get; set; } - public string Name { get; set; } = string.Empty; - public string? Description { get; set; } - public string? DefinitionJson { get; set; } - public Guid? FormDefinitionId { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/GetWorkflowInstanceByIdEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/GetWorkflowInstanceByIdEndpoint.cs deleted file mode 100644 index 223a21b..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/GetWorkflowInstanceByIdEndpoint.cs +++ /dev/null @@ -1,33 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowInstances.DTOs; -using Workflow.Application.Features.WorkflowInstances.Queries; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowInstance; - - -/// -/// 查询流程实例详情端点。GET /instances/{Id}。 -/// -public class GetWorkflowInstanceByIdEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public GetWorkflowInstanceByIdEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Get("/workflow-instances/{Id}"); - Permissions("workflow-instance:read"); - Summary(s => - { - s.Summary = "Get workflow instance detail by id (includes tokens and tasks)"; - }); - } - - public override async Task HandleAsync(GetWorkflowInstanceByIdRequest req, CancellationToken ct) - { - var query = new GetWorkflowInstanceByIdQuery(req.Id); - var result = await _mediator.Send(query, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/GetWorkflowInstanceByIdRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/GetWorkflowInstanceByIdRequest.cs deleted file mode 100644 index 54e2642..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/GetWorkflowInstanceByIdRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowInstance; - -/// -/// 实例详情查询请求体(路由参数绑定)。 -/// -public class GetWorkflowInstanceByIdRequest -{ - public Guid Id { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/GetWorkflowInstanceListEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/GetWorkflowInstanceListEndpoint.cs deleted file mode 100644 index 4804ec1..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/GetWorkflowInstanceListEndpoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MediatR; -using Workflow.Application.Common; -using Workflow.Application.Features.WorkflowInstances.DTOs; -using Workflow.Application.Features.WorkflowInstances.Queries; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowInstance; - - -/// -/// 查询流程实例列表端点。GET /instances。 -/// -public class GetWorkflowInstanceListEndpoint : Endpoint> -{ - private readonly IMediator _mediator; - - public GetWorkflowInstanceListEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Get("/workflow-instances"); - Permissions("workflow-instance:read"); - Summary(s => - { - s.Summary = "Get paginated list of workflow instances"; - }); - } - - public override async Task HandleAsync(GetWorkflowInstanceListRequest req, CancellationToken ct) - { - var query = new GetWorkflowInstanceListQuery(req.PageIndex, req.PageSize, req.Status, req.InitiatorId); - var result = await _mediator.Send(query, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/GetWorkflowInstanceListRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/GetWorkflowInstanceListRequest.cs deleted file mode 100644 index a23f306..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/GetWorkflowInstanceListRequest.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Workflow.Domain.Enums; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowInstance; - -/// -/// 实例列表查询请求体。含分页与状态过滤。 -/// -public class GetWorkflowInstanceListRequest -{ - public int PageIndex { get; set; } = 1; - public int PageSize { get; set; } = 20; - public InstanceStatus? Status { get; set; } - public Guid? InitiatorId { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/MonitorWorkflowInstancesEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/MonitorWorkflowInstancesEndpoint.cs deleted file mode 100644 index 1fcc931..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/MonitorWorkflowInstancesEndpoint.cs +++ /dev/null @@ -1,32 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowInstances.DTOs; -using Workflow.Application.Features.WorkflowInstances.Queries; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowInstance; - -/// -/// 流程实例监控端点。聚合运行中/逾期实例统计。 -/// -public class MonitorWorkflowInstancesEndpoint : EndpointWithoutRequest -{ - private readonly IMediator _mediator; - - public MonitorWorkflowInstancesEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Get("/workflow-instances/monitor"); - Permissions("workflow-instance:read"); - Summary(s => - { - s.Summary = "Get workflow monitoring statistics"; - }); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var query = new MonitorWorkflowInstancesQuery(); - var result = await _mediator.Send(query, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/ResumeWorkflowInstanceEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/ResumeWorkflowInstanceEndpoint.cs deleted file mode 100644 index c146bf2..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/ResumeWorkflowInstanceEndpoint.cs +++ /dev/null @@ -1,29 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowInstances.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowInstance; - -/// -/// 恢复挂起的流程实例端点。 -/// -public class ResumeWorkflowInstanceEndpoint(IMediator mediator) : EndpointWithoutRequest -{ - public override void Configure() - { - Post("/workflow-instances/{Id}/resume"); - Permissions("workflow-instance:manage"); - Summary(s => - { - s.Summary = "Resume a suspended workflow instance"; - }); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var id = Route("Id"); - await mediator.Send(new ResumeWorkflowInstanceCommand(id), ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/StartWorkflowInstanceRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/StartWorkflowInstanceRequest.cs deleted file mode 100644 index 87e5336..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/StartWorkflowInstanceRequest.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowInstance; - -/// -/// 发起实例请求体。含流程定义 ID 与表单数据。 -/// -public class StartWorkflowInstanceRequest -{ - public string DefinitionCode { get; set; } = string.Empty; - public string Title { get; set; } = string.Empty; - public string? Variables { get; set; } - public string? FormDataJson { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/SuspendWorkflowInstanceEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/SuspendWorkflowInstanceEndpoint.cs deleted file mode 100644 index 3bcd658..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/SuspendWorkflowInstanceEndpoint.cs +++ /dev/null @@ -1,29 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowInstances.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowInstance; - -/// -/// 挂起流程实例端点。暂停 token 流转。 -/// -public class SuspendWorkflowInstanceEndpoint(IMediator mediator) : EndpointWithoutRequest -{ - public override void Configure() - { - Post("/workflow-instances/{Id}/suspend"); - Permissions("workflow-instance:manage"); - Summary(s => - { - s.Summary = "Suspend a running workflow instance"; - }); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var id = Route("Id"); - await mediator.Send(new SuspendWorkflowInstanceCommand(id), ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/WithdrawWorkflowInstanceEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/WithdrawWorkflowInstanceEndpoint.cs deleted file mode 100644 index 269b9ee..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowInstance/WithdrawWorkflowInstanceEndpoint.cs +++ /dev/null @@ -1,32 +0,0 @@ -using BuildFlow.Host.Services.Users; -using BuildFlow.Shared.Domain.Common; -using MediatR; -using Workflow.Application.Features.WorkflowInstances.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowInstance; - -/// -/// 撤回流程实例端点(发起人专用,尚未处理任何节点时)。 -/// -public class WithdrawWorkflowInstanceEndpoint(IMediator mediator, ICurrentUserContext userContext) : EndpointWithoutRequest -{ - public override void Configure() - { - Post("/workflow-instances/{Id}/withdraw"); - Permissions("workflow-instance:manage"); - Summary(s => - { - s.Summary = "Withdraw a workflow instance (initiator only)"; - }); - } - - public override async Task HandleAsync(CancellationToken ct) - { - var id = Route("Id"); - var userId = userContext.GetUserIdGuid(); - await mediator.Send(new WithdrawWorkflowInstanceCommand(id, userId), ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/AddSignerEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/AddSignerEndpoint.cs deleted file mode 100644 index b94b93c..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/AddSignerEndpoint.cs +++ /dev/null @@ -1,24 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowTasks.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - -/// -/// 加签端点。审批人在审批前临时增加审批人(前加签/后加签)。 -/// POST /workflow-tasks/{Id}/add-signer -/// -public class AddSignerEndpoint(IMediator mediator) : Endpoint -{ - public override void Configure() - { - Post("/workflow-tasks/{Id}/add-signer"); - Permissions("workflow-task:manage"); - } - - public override async Task HandleAsync(AddSignerRequest req, CancellationToken ct) - { - var id = Route("Id"); - await mediator.Send(new AddSignerCommand(id, req.CurrentUserId, req.SignerUserId, req.Position, req.Comment), ct); - await Send.OkAsync(ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/AddSignerRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/AddSignerRequest.cs deleted file mode 100644 index cb5f4e9..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/AddSignerRequest.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Workflow.Domain.Enums; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - -/// 加签请求 DTO。 -/// 操作人用户 ID。 -/// 被加签人用户 ID。 -/// 加签位置(Before / After)。 -/// 加签备注(可选)。 -public record AddSignerRequest( - Guid CurrentUserId, - Guid SignerUserId, - SignPosition Position, - string? Comment); diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/ApproveTaskEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/ApproveTaskEndpoint.cs deleted file mode 100644 index 68f0538..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/ApproveTaskEndpoint.cs +++ /dev/null @@ -1,32 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowTasks.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - - -/// -/// 审批通过任务端点。驱动 TaskStateMachine 转 Approved,按 Approved 边推进流程。 -/// -public class ApproveTaskEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public ApproveTaskEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Post("/workflow-tasks/{Id}/approve"); - Permissions("workflow-task:approve"); - Summary(s => - { - s.Summary = "Approve a pending task"; - }); - } - - public override async Task HandleAsync(ApproveTaskRequest req, CancellationToken ct) - { - var command = new ApproveTaskCommand(req.Id, req.UserId, req.Comment, req.FormDataJson); - await _mediator.Send(command, ct); - await Send.OkAsync(true, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/ApproveTaskRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/ApproveTaskRequest.cs deleted file mode 100644 index bddccac..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/ApproveTaskRequest.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - -/// -/// 审批通过请求体。含任务 ID 与可选审批意见。 -/// -public class ApproveTaskRequest -{ - public Guid Id { get; set; } - public Guid UserId { get; set; } - public string? Comment { get; set; } - public string? FormDataJson { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/DelegateTaskEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/DelegateTaskEndpoint.cs deleted file mode 100644 index 9c4a409..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/DelegateTaskEndpoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowTasks.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - - -/// -/// 委派任务端点。任务暂转 Delegated,被委派人处理后回 Pending。 -/// -public class DelegateTaskEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public DelegateTaskEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Post("/workflow-tasks/{Id}/delegate"); - Permissions("workflow-task:delegate"); - Summary(s => - { - s.Summary = "Delegate a task to another user"; - }); - } - - public override async Task HandleAsync(DelegateTaskRequest req, CancellationToken ct) - { - var command = new DelegateTaskCommand(req.Id, req.FromUserId, req.ToUserId); - await _mediator.Send(command, ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/DelegateTaskRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/DelegateTaskRequest.cs deleted file mode 100644 index b0c8700..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/DelegateTaskRequest.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - -/// -/// 委派请求体。含任务 ID 与被委派人 ID。 -/// -public class DelegateTaskRequest -{ - public Guid Id { get; set; } - public Guid FromUserId { get; set; } - public Guid ToUserId { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetCcTasksEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetCcTasksEndpoint.cs deleted file mode 100644 index 3776beb..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetCcTasksEndpoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MediatR; -using Workflow.Application.Common; -using Workflow.Application.Features.WorkflowTasks.DTOs; -using Workflow.Application.Features.WorkflowTasks.Queries; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - - -/// -/// 查询抄送任务端点。GET /tasks/cc。 -/// -public class GetCcTasksEndpoint : Endpoint> -{ - private readonly IMediator _mediator; - - public GetCcTasksEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Get("/workflow-tasks/cc"); - Permissions("workflow-task:read"); - Summary(s => - { - s.Summary = "Get CC (carbon copy) tasks for a user"; - }); - } - - public override async Task HandleAsync(GetCcTasksRequest req, CancellationToken ct) - { - var query = new GetCcTasksQuery(req.UserId, req.PageIndex, req.PageSize); - var result = await _mediator.Send(query, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetCcTasksRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetCcTasksRequest.cs deleted file mode 100644 index 00cc954..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetCcTasksRequest.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - -/// -/// 抄送任务查询请求体。含分页参数。 -/// -public class GetCcTasksRequest -{ - public Guid UserId { get; set; } - public int PageIndex { get; set; } = 1; - public int PageSize { get; set; } = 20; -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetHistoryTasksEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetHistoryTasksEndpoint.cs deleted file mode 100644 index 65f256c..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetHistoryTasksEndpoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MediatR; -using Workflow.Application.Common; -using Workflow.Application.Features.WorkflowTasks.DTOs; -using Workflow.Application.Features.WorkflowTasks.Queries; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - - -/// -/// 查询历史任务(已处理)端点。GET /tasks/history。 -/// -public class GetHistoryTasksEndpoint : Endpoint> -{ - private readonly IMediator _mediator; - - public GetHistoryTasksEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Get("/workflow-tasks/history"); - Permissions("workflow-task:read"); - Summary(s => - { - s.Summary = "Get completed (approved/rejected) tasks for a user"; - }); - } - - public override async Task HandleAsync(GetHistoryTasksRequest req, CancellationToken ct) - { - var query = new GetHistoryTasksQuery(req.UserId, req.PageIndex, req.PageSize); - var result = await _mediator.Send(query, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetHistoryTasksRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetHistoryTasksRequest.cs deleted file mode 100644 index 3f9dacc..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetHistoryTasksRequest.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - -/// -/// 历史任务查询请求体。含分页与状态过滤。 -/// -public class GetHistoryTasksRequest -{ - public Guid UserId { get; set; } - public int PageIndex { get; set; } = 1; - public int PageSize { get; set; } = 20; -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetOverdueTasksEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetOverdueTasksEndpoint.cs deleted file mode 100644 index 3866bcc..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetOverdueTasksEndpoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MediatR; -using Workflow.Application.Common; -using Workflow.Application.Features.WorkflowTasks.DTOs; -using Workflow.Application.Features.WorkflowTasks.Queries; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - - -/// -/// 查询逾期任务端点。GET /tasks/overdue。 -/// -public class GetOverdueTasksEndpoint : Endpoint> -{ - private readonly IMediator _mediator; - - public GetOverdueTasksEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Get("/workflow-tasks/overdue"); - Permissions("workflow-task:read"); - Summary(s => - { - s.Summary = "Get overdue tasks (past due date, still pending)"; - }); - } - - public override async Task HandleAsync(GetOverdueTasksRequest req, CancellationToken ct) - { - var query = new GetOverdueTasksQuery(req.UserId, req.PageIndex, req.PageSize); - var result = await _mediator.Send(query, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetOverdueTasksRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetOverdueTasksRequest.cs deleted file mode 100644 index 233e9a2..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetOverdueTasksRequest.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - -/// -/// 逾期任务查询请求体。 -/// -public class GetOverdueTasksRequest -{ - public Guid? UserId { get; set; } - public int PageIndex { get; set; } = 1; - public int PageSize { get; set; } = 20; -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetPendingTasksEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetPendingTasksEndpoint.cs deleted file mode 100644 index 4d7e755..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetPendingTasksEndpoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MediatR; -using Workflow.Application.Common; -using Workflow.Application.Features.WorkflowTasks.DTOs; -using Workflow.Application.Features.WorkflowTasks.Queries; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - - -/// -/// 查询待办任务列表端点。GET /tasks/pending。 -/// -public class GetPendingTasksEndpoint : Endpoint> -{ - private readonly IMediator _mediator; - - public GetPendingTasksEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Get("/workflow-tasks/pending"); - Permissions("workflow-task:read"); - Summary(s => - { - s.Summary = "Get pending tasks for a user"; - }); - } - - public override async Task HandleAsync(GetPendingTasksRequest req, CancellationToken ct) - { - var query = new GetPendingTasksQuery(req.UserId, req.PageIndex, req.PageSize); - var result = await _mediator.Send(query, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetPendingTasksRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetPendingTasksRequest.cs deleted file mode 100644 index c6a2c2f..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetPendingTasksRequest.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - -/// -/// 待办任务查询请求体。含分页参数。 -/// -public class GetPendingTasksRequest -{ - public Guid UserId { get; set; } - public int PageIndex { get; set; } = 1; - public int PageSize { get; set; } = 20; -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetTaskByIdEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetTaskByIdEndpoint.cs deleted file mode 100644 index 194987a..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetTaskByIdEndpoint.cs +++ /dev/null @@ -1,33 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowTasks.DTOs; -using Workflow.Application.Features.WorkflowTasks.Queries; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - - -/// -/// 查询任务详情端点。GET /tasks/{Id}。 -/// -public class GetTaskByIdEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public GetTaskByIdEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Get("/workflow-tasks/{Id}"); - Permissions("workflow-task:read"); - Summary(s => - { - s.Summary = "Get task detail by id"; - }); - } - - public override async Task HandleAsync(GetTaskByIdRequest req, CancellationToken ct) - { - var query = new GetTaskByIdQuery(req.Id); - var result = await _mediator.Send(query, ct); - await Send.OkAsync(result, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetTaskByIdRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetTaskByIdRequest.cs deleted file mode 100644 index a5f746e..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/GetTaskByIdRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - -/// -/// 任务详情查询请求体(路由参数绑定)。 -/// -public class GetTaskByIdRequest -{ - public Guid Id { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/MarkCcTaskReadEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/MarkCcTaskReadEndpoint.cs deleted file mode 100644 index 7f785bc..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/MarkCcTaskReadEndpoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowTasks.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - - -/// -/// 标记抄送任务已读端点。Cc 任务转 Read,不影响主流程。 -/// -public class MarkCcTaskReadEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public MarkCcTaskReadEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Post("/workflow-tasks/{Id}/mark-read"); - Permissions("workflow-task:manage"); - Summary(s => - { - s.Summary = "Mark a CC task as read"; - }); - } - - public override async Task HandleAsync(MarkCcTaskReadRequest req, CancellationToken ct) - { - var command = new MarkCcTaskReadCommand(req.Id, req.UserId); - await _mediator.Send(command, ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/MarkCcTaskReadRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/MarkCcTaskReadRequest.cs deleted file mode 100644 index d2b582d..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/MarkCcTaskReadRequest.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - -/// -/// 标记已读请求体。含任务 ID。 -/// -public class MarkCcTaskReadRequest -{ - public Guid Id { get; set; } - public Guid UserId { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/RejectTaskEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/RejectTaskEndpoint.cs deleted file mode 100644 index 6f016df..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/RejectTaskEndpoint.cs +++ /dev/null @@ -1,32 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowTasks.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - - -/// -/// 驳回任务端点。转 Rejected 终态,按 Rejected 边流转(若无则结束实例)。 -/// -public class RejectTaskEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public RejectTaskEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Post("/workflow-tasks/{Id}/reject"); - Permissions("workflow-task:reject"); - Summary(s => - { - s.Summary = "Reject a pending task"; - }); - } - - public override async Task HandleAsync(RejectTaskRequest req, CancellationToken ct) - { - var command = new RejectTaskCommand(req.Id, req.UserId, req.Comment); - await _mediator.Send(command, ct); - await Send.OkAsync(true, ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/RejectTaskRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/RejectTaskRequest.cs deleted file mode 100644 index d058a62..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/RejectTaskRequest.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - -/// -/// 驳回请求体。含任务 ID 与驳回理由(必填)。 -/// -public class RejectTaskRequest -{ - public Guid Id { get; set; } - public Guid UserId { get; set; } - public string? Comment { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/ReturnTaskEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/ReturnTaskEndpoint.cs deleted file mode 100644 index 273c52b..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/ReturnTaskEndpoint.cs +++ /dev/null @@ -1,24 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowTasks.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - -/// -/// 退回端点。将当前审批任务退回到上一个审批节点重新审批(实例继续运行)。 -/// POST /workflow-tasks/{Id}/return -/// -public class ReturnTaskEndpoint(IMediator mediator) : Endpoint -{ - public override void Configure() - { - Post("/workflow-tasks/{Id}/return"); - Permissions("workflow-task:delegate"); - } - - public override async Task HandleAsync(ReturnTaskRequest req, CancellationToken ct) - { - var id = Route("Id"); - await mediator.Send(new ReturnTaskCommand(id, req.CurrentUserId, req.Comment), ct); - await Send.OkAsync(ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/ReturnTaskRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/ReturnTaskRequest.cs deleted file mode 100644 index 2298c87..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/ReturnTaskRequest.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - -/// 退回请求 DTO。 -/// 操作人用户 ID。 -/// 退回备注(可选)。 -public record ReturnTaskRequest( - Guid CurrentUserId, - string? Comment); diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/TransferTaskEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/TransferTaskEndpoint.cs deleted file mode 100644 index 871a843..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/TransferTaskEndpoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowTasks.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - - -/// -/// 转交任务端点。任务转给目标用户,原任务转 Transferred 终态。 -/// -public class TransferTaskEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public TransferTaskEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Post("/workflow-tasks/{Id}/transfer"); - Permissions("workflow-task:delegate"); - Summary(s => - { - s.Summary = "Transfer a task to another user"; - }); - } - - public override async Task HandleAsync(TransferTaskRequest req, CancellationToken ct) - { - var command = new TransferTaskCommand(req.Id, req.FromUserId, req.ToUserId); - await _mediator.Send(command, ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/TransferTaskRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/TransferTaskRequest.cs deleted file mode 100644 index 7a4c8ba..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/TransferTaskRequest.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - -/// -/// 转交请求体。含任务 ID 与目标用户 ID。 -/// -public class TransferTaskRequest -{ - public Guid Id { get; set; } - public Guid FromUserId { get; set; } - public Guid ToUserId { get; set; } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/UrgeTaskEndpoint.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/UrgeTaskEndpoint.cs deleted file mode 100644 index 0699983..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/UrgeTaskEndpoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MediatR; -using Workflow.Application.Features.WorkflowTasks.Commands; - -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - - -/// -/// 催办端点。向待办人发送催办通知。 -/// -public class UrgeTaskEndpoint : Endpoint -{ - private readonly IMediator _mediator; - - public UrgeTaskEndpoint(IMediator mediator) => _mediator = mediator; - - public override void Configure() - { - Post("/workflow-tasks/{Id}/urge"); - Permissions("workflow-task:manage"); - Summary(s => - { - s.Summary = "Urge a pending task (send notification to assignee)"; - }); - } - - public override async Task HandleAsync(UrgeTaskRequest req, CancellationToken ct) - { - var command = new UrgeTaskCommand(req.Id, req.UserId); - await _mediator.Send(command, ct); - HttpContext.Response.StatusCode = 200; - HttpContext.Response.ContentType = "application/json"; - await HttpContext.Response.WriteAsync("{}", ct); - } -} diff --git a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/UrgeTaskRequest.cs b/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/UrgeTaskRequest.cs deleted file mode 100644 index f362f9c..0000000 --- a/src/BuildFlow.Host/Endpoints/workflow/WorkflowTask/UrgeTaskRequest.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace BuildFlow.Host.Endpoints.Workflow.WorkflowTask; - -/// -/// 催办请求体。含任务 ID。 -/// -public class UrgeTaskRequest -{ - public Guid Id { get; set; } - public Guid UserId { get; set; } -}