Skip to main content

tdm_server_rust/web/
author_controller.rs

1//! 作者管理接口 (Author Controller)
2//!
3//! 作者信息的增删改查及关联漫画查询。
4//! 对应 Java AuthorController。
5
6use crate::utils::query_deserialize::{de_i32, de_opt_i16, de_opt_string, de_page, de_page_size};
7use crate::{
8    common::AppJson,
9    app::AppState,
10    common::{page_bean::PageBean, result::ResultBody},
11    entity::{author::Author, manga::MangaListVo},
12    error::ApiResult,
13    service::author_service::AuthorService,
14};
15use axum::{
16    extract::{Path, Query, State},
17    routing::get,
18    Router,
19};
20use serde::Deserialize;
21
22/// 作者分页查询参数
23#[derive(Debug, Deserialize)]
24#[serde(rename_all = "camelCase")]
25pub struct AuthorPageQuery {
26    /// 页码
27    #[serde(default, deserialize_with = "de_page")]
28    pub page: i32,
29    /// 每页条数
30    #[serde(default, deserialize_with = "de_page_size")]
31    pub page_size: i32,
32    /// 作者 ID
33    #[serde(default, deserialize_with = "de_opt_i16")]
34    pub author_id: Option<i16>,
35    /// 作者名
36    #[serde(default, deserialize_with = "de_opt_string")]
37    pub author_name: Option<String>,
38}
39
40/// 作者漫画分页参数
41#[derive(Debug, Deserialize)]
42#[serde(rename_all = "camelCase")]
43pub struct AuthorMangaQuery {
44    /// 页码
45    #[serde(default, deserialize_with = "de_page")]
46    pub page: i32,
47    /// 每页条数
48    #[serde(default, deserialize_with = "de_page_size")]
49    pub page_size: i32,
50    /// 作者 ID
51    #[serde(deserialize_with = "de_i32")]
52    pub id: i32,
53}
54
55/// 作者路由(挂载于 `/api/authors`)
56pub fn routes() -> Router<AppState> {
57    Router::new()
58        .route("/", get(get_authors).post(add_author).put(update_author))
59        .route("/list", get(get_manga_author_list))
60        .route("/authorManga", get(get_author_manga))
61        .route("/:id", get(get_author_by_id).delete(delete_author))
62}
63
64/// 分页查询作者
65#[tracing::instrument(skip_all, level = "info")]
66pub async fn get_authors(
67    State(state): State<AppState>,
68    Query(q): Query<AuthorPageQuery>,
69) -> ApiResult<ResultBody<PageBean<Author>>> {
70    let data =
71        AuthorService::get_authors(&state, q.page, q.page_size, q.author_id, q.author_name).await?;
72    Ok(ResultBody::success_data(data))
73}
74
75/// 全量作者列表
76#[tracing::instrument(skip_all, level = "info")]
77pub async fn get_manga_author_list(
78    State(state): State<AppState>,
79) -> ApiResult<ResultBody<Vec<Author>>> {
80    let data = AuthorService::get_manga_author_list(&state).await?;
81    Ok(ResultBody::success_data(data))
82}
83
84/// 作者所著漫画
85#[tracing::instrument(skip_all, level = "info")]
86pub async fn get_author_manga(
87    State(state): State<AppState>,
88    Query(q): Query<AuthorMangaQuery>,
89) -> ApiResult<ResultBody<PageBean<MangaListVo>>> {
90    let data = AuthorService::get_author_manga(&state, q.page, q.page_size, q.id).await?;
91    Ok(ResultBody::success_data(data))
92}
93
94/// 删除作者
95#[tracing::instrument(skip_all, level = "info")]
96pub async fn delete_author(
97    State(state): State<AppState>,
98    Path(id): Path<i32>,
99) -> ApiResult<ResultBody<()>> {
100    AuthorService::delete(&state, id).await?;
101    Ok(ResultBody::success())
102}
103
104/// 新增作者
105#[tracing::instrument(skip_all, level = "info")]
106pub async fn add_author(
107    State(state): State<AppState>,
108    AppJson(body): AppJson<Author>,
109) -> ApiResult<ResultBody<()>> {
110    AuthorService::add(&state, body).await?;
111    Ok(ResultBody::success())
112}
113
114/// 按 ID 查询作者
115#[tracing::instrument(skip_all, level = "info")]
116pub async fn get_author_by_id(
117    State(state): State<AppState>,
118    Path(id): Path<i32>,
119) -> ApiResult<ResultBody<Author>> {
120    let data = AuthorService::get_author_by_id(&state, id).await?;
121    Ok(ResultBody::success_data(data))
122}
123
124/// 更新作者
125#[tracing::instrument(skip_all, level = "info")]
126pub async fn update_author(
127    State(state): State<AppState>,
128    AppJson(body): AppJson<Author>,
129) -> ApiResult<ResultBody<()>> {
130    AuthorService::update_author(&state, body).await?;
131    Ok(ResultBody::success())
132}