chore: apply cargo fmt across workspace and update docs
- Run cargo fmt on all Rust crates for consistent formatting - Update CLAUDE.md with WASM plugin commands and dev.ps1 instructions - Update wiki: add WASM plugin architecture, rewrite dev environment docs - Minor frontend cleanup (unused imports)
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
use chrono::{DateTime, Utc};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use uuid::Uuid;
|
||||
use utoipa::ToSchema;
|
||||
use uuid::Uuid;
|
||||
use validator::Validate;
|
||||
|
||||
// ============ 消息 DTO ============
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use axum::extract::{Extension, Path, Query, State};
|
||||
use axum::extract::FromRef;
|
||||
use axum::Json;
|
||||
use axum::extract::FromRef;
|
||||
use axum::extract::{Extension, Path, Query, State};
|
||||
use uuid::Uuid;
|
||||
|
||||
use erp_core::error::AppError;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use axum::extract::{Extension, State};
|
||||
use axum::extract::FromRef;
|
||||
use axum::Json;
|
||||
use axum::extract::FromRef;
|
||||
use axum::extract::{Extension, State};
|
||||
|
||||
use erp_core::error::AppError;
|
||||
use erp_core::types::{ApiResponse, TenantContext};
|
||||
@@ -19,13 +19,7 @@ where
|
||||
MessageState: FromRef<S>,
|
||||
S: Clone + Send + Sync + 'static,
|
||||
{
|
||||
let resp = SubscriptionService::upsert(
|
||||
ctx.tenant_id,
|
||||
ctx.user_id,
|
||||
&req,
|
||||
&_state.db,
|
||||
)
|
||||
.await?;
|
||||
let resp = SubscriptionService::upsert(ctx.tenant_id, ctx.user_id, &req, &_state.db).await?;
|
||||
|
||||
Ok(Json(ApiResponse::ok(resp)))
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use axum::extract::{Extension, Query, State};
|
||||
use axum::extract::FromRef;
|
||||
use axum::Json;
|
||||
use axum::extract::FromRef;
|
||||
use axum::extract::{Extension, Query, State};
|
||||
use serde::Deserialize;
|
||||
|
||||
use erp_core::error::AppError;
|
||||
|
||||
@@ -8,9 +8,7 @@ use erp_core::error::AppResult;
|
||||
use erp_core::events::EventBus;
|
||||
use erp_core::module::ErpModule;
|
||||
|
||||
use crate::handler::{
|
||||
message_handler, subscription_handler, template_handler,
|
||||
};
|
||||
use crate::handler::{message_handler, subscription_handler, template_handler};
|
||||
|
||||
/// 消息中心模块,实现 ErpModule trait。
|
||||
pub struct MessageModule;
|
||||
@@ -32,22 +30,10 @@ impl MessageModule {
|
||||
"/messages",
|
||||
get(message_handler::list_messages).post(message_handler::send_message),
|
||||
)
|
||||
.route(
|
||||
"/messages/unread-count",
|
||||
get(message_handler::unread_count),
|
||||
)
|
||||
.route(
|
||||
"/messages/{id}/read",
|
||||
put(message_handler::mark_read),
|
||||
)
|
||||
.route(
|
||||
"/messages/read-all",
|
||||
put(message_handler::mark_all_read),
|
||||
)
|
||||
.route(
|
||||
"/messages/{id}",
|
||||
delete(message_handler::delete_message),
|
||||
)
|
||||
.route("/messages/unread-count", get(message_handler::unread_count))
|
||||
.route("/messages/{id}/read", put(message_handler::mark_read))
|
||||
.route("/messages/read-all", put(message_handler::mark_all_read))
|
||||
.route("/messages/{id}", delete(message_handler::delete_message))
|
||||
// 模板路由
|
||||
.route(
|
||||
"/message-templates",
|
||||
@@ -79,9 +65,7 @@ impl MessageModule {
|
||||
// 先获取许可,再 spawn 任务
|
||||
tokio::spawn(async move {
|
||||
let _permit = permit.acquire().await.unwrap();
|
||||
if let Err(e) =
|
||||
handle_workflow_event(&event, &db, &event_bus).await
|
||||
{
|
||||
if let Err(e) = handle_workflow_event(&event, &db, &event_bus).await {
|
||||
tracing::warn!(
|
||||
event_type = %event.event_type,
|
||||
error = %e,
|
||||
@@ -146,11 +130,12 @@ async fn handle_workflow_event(
|
||||
) -> Result<(), String> {
|
||||
match event.event_type.as_str() {
|
||||
"process_instance.started" => {
|
||||
let instance_id = event.payload.get("instance_id")
|
||||
let instance_id = event
|
||||
.payload
|
||||
.get("instance_id")
|
||||
.and_then(|v| v.as_str())
|
||||
.unwrap_or("unknown");
|
||||
let starter_id = event.payload.get("started_by")
|
||||
.and_then(|v| v.as_str());
|
||||
let starter_id = event.payload.get("started_by").and_then(|v| v.as_str());
|
||||
|
||||
if let Some(starter) = starter_id {
|
||||
let recipient = match uuid::Uuid::parse_str(starter) {
|
||||
@@ -174,11 +159,12 @@ async fn handle_workflow_event(
|
||||
}
|
||||
"task.completed" => {
|
||||
// 任务完成时通知流程发起人
|
||||
let task_id = event.payload.get("task_id")
|
||||
let task_id = event
|
||||
.payload
|
||||
.get("task_id")
|
||||
.and_then(|v| v.as_str())
|
||||
.unwrap_or("unknown");
|
||||
let starter_id = event.payload.get("started_by")
|
||||
.and_then(|v| v.as_str());
|
||||
let starter_id = event.payload.get("started_by").and_then(|v| v.as_str());
|
||||
|
||||
if let Some(starter) = starter_id {
|
||||
let recipient = match uuid::Uuid::parse_str(starter) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use chrono::Utc;
|
||||
use sea_orm::{
|
||||
ActiveModelTrait, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter, Set,
|
||||
Statement, ConnectionTrait, DatabaseBackend,
|
||||
ActiveModelTrait, ColumnTrait, ConnectionTrait, DatabaseBackend, EntityTrait, PaginatorTrait,
|
||||
QueryFilter, Set, Statement,
|
||||
};
|
||||
use uuid::Uuid;
|
||||
|
||||
@@ -122,15 +122,20 @@ impl MessageService {
|
||||
.await
|
||||
.map_err(|e| MessageError::Validation(e.to_string()))?;
|
||||
|
||||
event_bus.publish(erp_core::events::DomainEvent::new(
|
||||
"message.sent",
|
||||
tenant_id,
|
||||
serde_json::json!({
|
||||
"message_id": id,
|
||||
"recipient_id": req.recipient_id,
|
||||
"title": req.title,
|
||||
}),
|
||||
), db).await;
|
||||
event_bus
|
||||
.publish(
|
||||
erp_core::events::DomainEvent::new(
|
||||
"message.sent",
|
||||
tenant_id,
|
||||
serde_json::json!({
|
||||
"message_id": id,
|
||||
"recipient_id": req.recipient_id,
|
||||
"title": req.title,
|
||||
}),
|
||||
),
|
||||
db,
|
||||
)
|
||||
.await;
|
||||
|
||||
audit_service::record(
|
||||
AuditLog::new(tenant_id, Some(sender_id), "message.send", "message")
|
||||
@@ -191,18 +196,28 @@ impl MessageService {
|
||||
.await
|
||||
.map_err(|e| MessageError::Validation(e.to_string()))?;
|
||||
|
||||
event_bus.publish(erp_core::events::DomainEvent::new(
|
||||
"message.sent",
|
||||
tenant_id,
|
||||
serde_json::json!({
|
||||
"message_id": id,
|
||||
"recipient_id": recipient_id,
|
||||
}),
|
||||
), db).await;
|
||||
event_bus
|
||||
.publish(
|
||||
erp_core::events::DomainEvent::new(
|
||||
"message.sent",
|
||||
tenant_id,
|
||||
serde_json::json!({
|
||||
"message_id": id,
|
||||
"recipient_id": recipient_id,
|
||||
}),
|
||||
),
|
||||
db,
|
||||
)
|
||||
.await;
|
||||
|
||||
audit_service::record(
|
||||
AuditLog::new(tenant_id, Some(system_user), "message.send_system", "message")
|
||||
.with_resource_id(id),
|
||||
AuditLog::new(
|
||||
tenant_id,
|
||||
Some(system_user),
|
||||
"message.send_system",
|
||||
"message",
|
||||
)
|
||||
.with_resource_id(id),
|
||||
db,
|
||||
)
|
||||
.await;
|
||||
@@ -301,9 +316,7 @@ impl MessageService {
|
||||
.ok_or_else(|| MessageError::NotFound(format!("消息不存在: {id}")))?;
|
||||
|
||||
if model.recipient_id != user_id {
|
||||
return Err(MessageError::Validation(
|
||||
"只能删除自己的消息".to_string(),
|
||||
));
|
||||
return Err(MessageError::Validation("只能删除自己的消息".to_string()));
|
||||
}
|
||||
|
||||
let current_version = model.version;
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
use chrono::Utc;
|
||||
use sea_orm::{
|
||||
ActiveModelTrait, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter, Set,
|
||||
};
|
||||
use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter, Set};
|
||||
use uuid::Uuid;
|
||||
|
||||
use crate::dto::{CreateTemplateReq, MessageTemplateResp};
|
||||
|
||||
Reference in New Issue
Block a user