use axum::extract::{Extension, Path, Query, State}; use axum::extract::FromRef; use axum::Json; use uuid::Uuid; use erp_core::error::AppError; use erp_core::rbac::require_permission; use erp_core::types::{ApiResponse, PaginatedResponse, TenantContext}; use validator::Validate; use crate::dto::{MessageQuery, MessageResp, SendMessageReq, UnreadCountResp}; use crate::message_state::MessageState; use crate::service::message_service::MessageService; /// 查询消息列表。 pub async fn list_messages( State(_state): State, Extension(ctx): Extension, Query(query): Query, ) -> Result>>, AppError> where MessageState: FromRef, S: Clone + Send + Sync + 'static, { require_permission(&ctx, "message.list")?; let db = &_state.db; let page = query.page.unwrap_or(1); let page_size = query.page_size.unwrap_or(20); let (messages, total) = MessageService::list(ctx.tenant_id, ctx.user_id, &query, db).await?; let total_pages = total.div_ceil(page_size); Ok(Json(ApiResponse::ok(PaginatedResponse { data: messages, total, page, page_size, total_pages, }))) } /// 获取未读消息数量。 pub async fn unread_count( State(_state): State, Extension(ctx): Extension, ) -> Result>, AppError> where MessageState: FromRef, S: Clone + Send + Sync + 'static, { require_permission(&ctx, "message.list")?; let result = MessageService::unread_count(ctx.tenant_id, ctx.user_id, &_state.db).await?; Ok(Json(ApiResponse::ok(result))) } /// 发送消息。 pub async fn send_message( State(_state): State, Extension(ctx): Extension, Json(req): Json, ) -> Result>, AppError> where MessageState: FromRef, S: Clone + Send + Sync + 'static, { require_permission(&ctx, "message.send")?; req.validate() .map_err(|e| AppError::Validation(e.to_string()))?; let resp = MessageService::send( ctx.tenant_id, ctx.user_id, &req, &_state.db, &_state.event_bus, ) .await?; Ok(Json(ApiResponse::ok(resp))) } /// 标记消息已读。 pub async fn mark_read( State(_state): State, Extension(ctx): Extension, Path(id): Path, ) -> Result>, AppError> where MessageState: FromRef, S: Clone + Send + Sync + 'static, { MessageService::mark_read(id, ctx.tenant_id, ctx.user_id, &_state.db).await?; Ok(Json(ApiResponse::ok(()))) } /// 标记所有消息已读。 pub async fn mark_all_read( State(_state): State, Extension(ctx): Extension, ) -> Result>, AppError> where MessageState: FromRef, S: Clone + Send + Sync + 'static, { MessageService::mark_all_read(ctx.tenant_id, ctx.user_id, &_state.db).await?; Ok(Json(ApiResponse::ok(()))) } /// 删除消息。 pub async fn delete_message( State(_state): State, Extension(ctx): Extension, Path(id): Path, ) -> Result>, AppError> where MessageState: FromRef, S: Clone + Send + Sync + 'static, { MessageService::delete(id, ctx.tenant_id, ctx.user_id, &_state.db).await?; Ok(Json(ApiResponse::ok(()))) }