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    app::AppState,
9    common::AppJson,
10    common::{
11        page_bean::PageBean,
12        result::{json_bytes_response, ResultBody},
13    },
14    entity::magazine::Magazine,
15    error::ApiResult,
16    service::magazine_service::MagazineService,
17};
18use axum::{
19    extract::{Path, Query, State},
20    response::Response,
21    routing::get,
22    Router,
23};
24use serde::Deserialize;
25
26/// 杂志分页查询参数
27#[derive(Debug, Deserialize)]
28#[serde(rename_all = "camelCase")]
29pub struct MagazinePageQuery {
30    /// 页码
31    #[serde(default, deserialize_with = "de_page")]
32    pub page: i32,
33    /// 每页条数
34    #[serde(default, deserialize_with = "de_page_size")]
35    pub page_size: i32,
36    /// 杂志 ID
37    #[serde(default, deserialize_with = "de_opt_i16")]
38    pub magazine_id: Option<i16>,
39    /// 杂志名
40    #[serde(default, deserialize_with = "de_opt_string")]
41    pub magazine_name: Option<String>,
42}
43
44/// 杂志漫画分页参数
45#[derive(Debug, Deserialize)]
46#[serde(rename_all = "camelCase")]
47pub struct MagazineMangaQuery {
48    /// 页码
49    #[serde(default, deserialize_with = "de_page")]
50    pub page: i32,
51    /// 每页条数
52    #[serde(default, deserialize_with = "de_page_size")]
53    pub page_size: i32,
54    /// 杂志 ID
55    #[serde(deserialize_with = "de_i32")]
56    pub id: i32,
57}
58
59/// 杂志路由(挂载于 `/api/magazines`)
60pub fn routes() -> Router<AppState> {
61    Router::new()
62        .route(
63            "/",
64            get(get_magazines).post(add_magazine).put(update_magazine),
65        )
66        .route("/list", get(get_manga_magazine_list))
67        .route("/magazineManga", get(get_magazine_manga))
68        .route("/:id", get(get_magazine_by_id).delete(delete_magazine))
69}
70
71/// 分页查询杂志
72#[tracing::instrument(skip_all, level = "info")]
73pub async fn get_magazines(
74    State(state): State<AppState>,
75    Query(q): Query<MagazinePageQuery>,
76) -> ApiResult<ResultBody<PageBean<Magazine>>> {
77    let data =
78        MagazineService::get_magazines(&state, q.page, q.page_size, q.magazine_id, q.magazine_name)
79            .await?;
80    Ok(ResultBody::success_data(data))
81}
82
83/// 全量杂志列表
84#[tracing::instrument(skip_all, level = "info")]
85pub async fn get_manga_magazine_list(
86    State(state): State<AppState>,
87) -> ApiResult<ResultBody<Vec<Magazine>>> {
88    let data = MagazineService::get_manga_magazine_list(&state).await?;
89    Ok(ResultBody::success_data(data))
90}
91
92/// 杂志关联漫画
93#[tracing::instrument(skip_all, level = "info")]
94pub async fn get_magazine_manga(
95    State(state): State<AppState>,
96    Query(q): Query<MagazineMangaQuery>,
97) -> ApiResult<Response> {
98    let json = MagazineService::get_magazine_manga_json(&state, q.page, q.page_size, q.id).await?;
99    Ok(json_bytes_response(json))
100}
101
102/// 删除杂志
103#[tracing::instrument(skip_all, level = "info")]
104pub async fn delete_magazine(
105    State(state): State<AppState>,
106    Path(id): Path<i32>,
107) -> ApiResult<ResultBody<()>> {
108    MagazineService::delete_magazine(&state, id).await?;
109    Ok(ResultBody::success())
110}
111
112/// 新增杂志
113#[tracing::instrument(skip_all, level = "info")]
114pub async fn add_magazine(
115    State(state): State<AppState>,
116    AppJson(body): AppJson<Magazine>,
117) -> ApiResult<ResultBody<()>> {
118    MagazineService::add_magazine(&state, body).await?;
119    Ok(ResultBody::success())
120}
121
122/// 按 ID 查询杂志
123#[tracing::instrument(skip_all, level = "info")]
124pub async fn get_magazine_by_id(
125    State(state): State<AppState>,
126    Path(id): Path<i32>,
127) -> ApiResult<ResultBody<Magazine>> {
128    let data = MagazineService::get_magazine_by_id(&state, id).await?;
129    Ok(ResultBody::success_data(data))
130}
131
132/// 更新杂志
133#[tracing::instrument(skip_all, level = "info")]
134pub async fn update_magazine(
135    State(state): State<AppState>,
136    AppJson(body): AppJson<Magazine>,
137) -> ApiResult<ResultBody<()>> {
138    MagazineService::update_magazine(&state, body).await?;
139    Ok(ResultBody::success())
140}