feat(message): add message center module (Phase 5)
Implement the complete message center with: - Database migrations for message_templates, messages, message_subscriptions tables - erp-message crate with entities, DTOs, services, handlers - Message CRUD, send, read/unread tracking, soft delete - Template management with variable interpolation - Subscription preferences with DND support - Frontend: messages page, notification panel, unread count badge - Server integration with module registration and routing Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
99
crates/erp-message/src/module.rs
Normal file
99
crates/erp-message/src/module.rs
Normal file
@@ -0,0 +1,99 @@
|
||||
use axum::Router;
|
||||
use axum::routing::{delete, get, put};
|
||||
use uuid::Uuid;
|
||||
|
||||
use erp_core::error::AppResult;
|
||||
use erp_core::events::EventBus;
|
||||
use erp_core::module::ErpModule;
|
||||
|
||||
use crate::handler::{
|
||||
message_handler, subscription_handler, template_handler,
|
||||
};
|
||||
|
||||
/// 消息中心模块,实现 ErpModule trait。
|
||||
pub struct MessageModule;
|
||||
|
||||
impl MessageModule {
|
||||
pub fn new() -> Self {
|
||||
Self
|
||||
}
|
||||
|
||||
/// 构建需要认证的路由。
|
||||
pub fn protected_routes<S>() -> Router<S>
|
||||
where
|
||||
crate::message_state::MessageState: axum::extract::FromRef<S>,
|
||||
S: Clone + Send + Sync + 'static,
|
||||
{
|
||||
Router::new()
|
||||
// 消息路由
|
||||
.route(
|
||||
"/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(
|
||||
"/message-templates",
|
||||
get(template_handler::list_templates).post(template_handler::create_template),
|
||||
)
|
||||
// 订阅偏好路由
|
||||
.route(
|
||||
"/message-subscriptions",
|
||||
put(subscription_handler::update_subscription),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for MessageModule {
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl ErpModule for MessageModule {
|
||||
fn name(&self) -> &str {
|
||||
"message"
|
||||
}
|
||||
|
||||
fn version(&self) -> &str {
|
||||
env!("CARGO_PKG_VERSION")
|
||||
}
|
||||
|
||||
fn dependencies(&self) -> Vec<&str> {
|
||||
vec!["auth"]
|
||||
}
|
||||
|
||||
fn register_routes(&self, router: Router) -> Router {
|
||||
router
|
||||
}
|
||||
|
||||
fn register_event_handlers(&self, _bus: &EventBus) {}
|
||||
|
||||
async fn on_tenant_created(&self, _tenant_id: Uuid) -> AppResult<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn on_tenant_deleted(&self, _tenant_id: Uuid) -> AppResult<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn as_any(&self) -> &dyn std::any::Any {
|
||||
self
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user