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 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#[derive(Debug, Deserialize)]
28#[serde(rename_all = "camelCase")]
29pub struct MagazinePageQuery {
30 #[serde(default, deserialize_with = "de_page")]
32 pub page: i32,
33 #[serde(default, deserialize_with = "de_page_size")]
35 pub page_size: i32,
36 #[serde(default, deserialize_with = "de_opt_i16")]
38 pub magazine_id: Option<i16>,
39 #[serde(default, deserialize_with = "de_opt_string")]
41 pub magazine_name: Option<String>,
42}
43
44#[derive(Debug, Deserialize)]
46#[serde(rename_all = "camelCase")]
47pub struct MagazineMangaQuery {
48 #[serde(default, deserialize_with = "de_page")]
50 pub page: i32,
51 #[serde(default, deserialize_with = "de_page_size")]
53 pub page_size: i32,
54 #[serde(deserialize_with = "de_i32")]
56 pub id: i32,
57}
58
59pub 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#[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#[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#[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#[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#[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#[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#[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}