tdm_server_rust/web/
author_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::{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#[derive(Debug, Deserialize)]
24#[serde(rename_all = "camelCase")]
25pub struct AuthorPageQuery {
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 author_id: Option<i16>,
35 #[serde(default, deserialize_with = "de_opt_string")]
37 pub author_name: Option<String>,
38}
39
40#[derive(Debug, Deserialize)]
42#[serde(rename_all = "camelCase")]
43pub struct AuthorMangaQuery {
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("/", 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#[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#[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#[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#[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#[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#[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#[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}