Skip to main content

tdm_server_rust/web/
magazine_controller.rs

1//! 杂志管理接口 (Magazine Controller)
2//!
3//! 杂志信息的增删改查及关联漫画查询。
4//! 对应 Java MagazineController。
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::{magazine::Magazine, manga::MangaListVo},
12    error::ApiResult,
13    service::magazine_service::MagazineService,
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 MagazinePageQuery {
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 magazine_id: Option<i16>,
35    /// 杂志名
36    #[serde(default, deserialize_with = "de_opt_string")]
37    pub magazine_name: Option<String>,
38}
39
40/// 杂志漫画分页参数
41#[derive(Debug, Deserialize)]
42#[serde(rename_all = "camelCase")]
43pub struct MagazineMangaQuery {
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/magazines`)
56pub fn routes() -> Router<AppState> {
57    Router::new()
58        .route(
59            "/",
60            get(get_magazines).post(add_magazine).put(update_magazine),
61        )
62        .route("/list", get(get_manga_magazine_list))
63        .route("/magazineManga", get(get_magazine_manga))
64        .route("/:id", get(get_magazine_by_id).delete(delete_magazine))
65}
66
67/// 分页查询杂志
68#[tracing::instrument(skip_all, level = "info")]
69pub async fn get_magazines(
70    State(state): State<AppState>,
71    Query(q): Query<MagazinePageQuery>,
72) -> ApiResult<ResultBody<PageBean<Magazine>>> {
73    let data =
74        MagazineService::get_magazines(&state, q.page, q.page_size, q.magazine_id, q.magazine_name)
75            .await?;
76    Ok(ResultBody::success_data(data))
77}
78
79/// 全量杂志列表
80#[tracing::instrument(skip_all, level = "info")]
81pub async fn get_manga_magazine_list(
82    State(state): State<AppState>,
83) -> ApiResult<ResultBody<Vec<Magazine>>> {
84    let data = MagazineService::get_manga_magazine_list(&state).await?;
85    Ok(ResultBody::success_data(data))
86}
87
88/// 杂志关联漫画
89#[tracing::instrument(skip_all, level = "info")]
90pub async fn get_magazine_manga(
91    State(state): State<AppState>,
92    Query(q): Query<MagazineMangaQuery>,
93) -> ApiResult<ResultBody<PageBean<MangaListVo>>> {
94    let data = MagazineService::get_magazine_manga(&state, q.page, q.page_size, q.id).await?;
95    Ok(ResultBody::success_data(data))
96}
97
98/// 删除杂志
99#[tracing::instrument(skip_all, level = "info")]
100pub async fn delete_magazine(
101    State(state): State<AppState>,
102    Path(id): Path<i32>,
103) -> ApiResult<ResultBody<()>> {
104    MagazineService::delete_magazine(&state, id).await?;
105    Ok(ResultBody::success())
106}
107
108/// 新增杂志
109#[tracing::instrument(skip_all, level = "info")]
110pub async fn add_magazine(
111    State(state): State<AppState>,
112    AppJson(body): AppJson<Magazine>,
113) -> ApiResult<ResultBody<()>> {
114    MagazineService::add_magazine(&state, body).await?;
115    Ok(ResultBody::success())
116}
117
118/// 按 ID 查询杂志
119#[tracing::instrument(skip_all, level = "info")]
120pub async fn get_magazine_by_id(
121    State(state): State<AppState>,
122    Path(id): Path<i32>,
123) -> ApiResult<ResultBody<Magazine>> {
124    let data = MagazineService::get_magazine_by_id(&state, id).await?;
125    Ok(ResultBody::success_data(data))
126}
127
128/// 更新杂志
129#[tracing::instrument(skip_all, level = "info")]
130pub async fn update_magazine(
131    State(state): State<AppState>,
132    AppJson(body): AppJson<Magazine>,
133) -> ApiResult<ResultBody<()>> {
134    MagazineService::update_magazine(&state, body).await?;
135    Ok(ResultBody::success())
136}