Skip to main content

tdm_server_rust/web/
task_tracking_controller.rs

1//! 稿件监控接口 (Task Tracking Controller)
2//!
3//! 组员任务看板数据查询。
4//! 对应 Java TaskTrackingController。
5
6use crate::utils::query_deserialize::{de_opt_string, de_page, de_page_size};
7use crate::{
8    app::AppState,
9    common::{page_bean::PageBean, result::ResultBody},
10    entity::episode::{MemberTaskCount, PendingMangaTask, TaskTrackingResponse},
11    error::ApiResult,
12    service::task_tracking_service::TaskTrackingService,
13};
14use axum::{
15    extract::{Query, State},
16    routing::get,
17    Router,
18};
19use serde::Deserialize;
20
21/// 待发布漫画分页参数
22#[derive(Debug, Deserialize)]
23#[serde(rename_all = "camelCase")]
24pub struct PendingMangaQuery {
25    /// 页码
26    #[serde(default, deserialize_with = "de_page")]
27    pub page: i32,
28    /// 每页条数
29    #[serde(default, deserialize_with = "de_page_size")]
30    pub page_size: i32,
31    /// 漫画译名
32    #[serde(default, deserialize_with = "de_opt_string")]
33    pub manga_tran_name: Option<String>,
34}
35
36/// 稿件监控路由(挂载于 `/api/admin/taskTracking`)
37pub fn routes() -> Router<AppState> {
38    Router::new()
39        .route("/memberTaskCounts", get(get_member_task_counts))
40        .route("/episodeTasks", get(get_episode_tasks))
41        .route("/pendingMangaTasks", get(get_pending_manga_tasks))
42}
43
44/// 组员任务数量
45#[tracing::instrument(skip_all, level = "info")]
46pub async fn get_member_task_counts(
47    State(state): State<AppState>,
48) -> ApiResult<ResultBody<Vec<MemberTaskCount>>> {
49    let data = TaskTrackingService::get_member_task_count_list(&state).await?;
50    Ok(ResultBody::success_data(data))
51}
52
53/// 待做稿件列表
54#[tracing::instrument(skip_all, level = "info")]
55pub async fn get_episode_tasks(
56    State(state): State<AppState>,
57) -> ApiResult<ResultBody<TaskTrackingResponse>> {
58    let data = TaskTrackingService::get_all_task(&state).await?;
59    Ok(ResultBody::success_data(data))
60}
61
62/// 待发布漫画分页
63#[tracing::instrument(skip_all, level = "info")]
64pub async fn get_pending_manga_tasks(
65    State(state): State<AppState>,
66    Query(q): Query<PendingMangaQuery>,
67) -> ApiResult<ResultBody<PageBean<PendingMangaTask>>> {
68    let data = TaskTrackingService::get_pending_manga_tasks(
69        &state,
70        q.page,
71        q.page_size,
72        q.manga_tran_name,
73    )
74    .await?;
75    Ok(ResultBody::success_data(data))
76}