tdm_server_rust/web/
magazine_controller.rs1use 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#[derive(Debug, Deserialize)]
24#[serde(rename_all = "camelCase")]
25pub struct MagazinePageQuery {
26 #[serde(default, deserialize_with = "de_page")]
28 pub page: i32,
29 #[serde(default, deserialize_with = "de_page_size")]
31 pub page_size: i32,
32 #[serde(default, deserialize_with = "de_opt_i16")]
34 pub magazine_id: Option<i16>,
35 #[serde(default, deserialize_with = "de_opt_string")]
37 pub magazine_name: Option<String>,
38}
39
40#[derive(Debug, Deserialize)]
42#[serde(rename_all = "camelCase")]
43pub struct MagazineMangaQuery {
44 #[serde(default, deserialize_with = "de_page")]
46 pub page: i32,
47 #[serde(default, deserialize_with = "de_page_size")]
49 pub page_size: i32,
50 #[serde(deserialize_with = "de_i32")]
52 pub id: i32,
53}
54
55pub 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#[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#[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#[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#[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#[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#[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#[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}