tdm_server_rust/web/
evaluation_controller.rs1use crate::utils::query_deserialize::{de_opt_i32, de_page, de_page_size};
7use crate::{
8 common::AppJson,
9 app::AppState,
10 common::{page_bean::PageBean, result::ResultBody},
11 entity::evaluation::Evaluation,
12 error::ApiResult,
13 middleware::AuthMember,
14 service::evaluation_service::EvaluationService,
15};
16use axum::{
17 extract::{Extension, Path, Query, State},
18 routing::get,
19 Router,
20};
21use chrono::{DateTime, Utc};
22use serde::Deserialize;
23
24#[derive(Debug, Deserialize)]
26#[serde(rename_all = "camelCase")]
27pub struct EvaluationPageQuery {
28 #[serde(default, deserialize_with = "de_page")]
30 pub page: i32,
31 #[serde(default, deserialize_with = "de_page_size")]
33 pub page_size: i32,
34 #[serde(default, deserialize_with = "de_opt_i32")]
36 pub member_id: Option<i32>,
37 #[serde(default, deserialize_with = "de_opt_i32")]
39 pub evaluator_id: Option<i32>,
40 pub start_time: Option<DateTime<Utc>>,
42 pub end_time: Option<DateTime<Utc>>,
44}
45
46pub fn routes() -> Router<AppState> {
48 Router::new()
49 .route("/", get(get_evaluations).post(add_evaluation))
50 .route(
51 "/:id",
52 get(get_evaluation)
53 .delete(remove_evaluation)
54 .put(update_evaluation),
55 )
56}
57
58#[tracing::instrument(skip_all, level = "info")]
60pub async fn add_evaluation(
61 State(state): State<AppState>,
62 Extension(AuthMember(member)): Extension<AuthMember>,
63 AppJson(mut body): AppJson<Evaluation>,
64) -> ApiResult<ResultBody<()>> {
65 if let Some(ref m) = member {
66 if body.evaluator_id.is_none() {
67 body.evaluator_id = Some(m.id);
68 }
69 if body.evaluator.is_none() {
70 body.evaluator = m.username.clone();
71 }
72 }
73 EvaluationService::add_evaluation(&state, body).await?;
74 Ok(ResultBody::success())
75}
76
77#[tracing::instrument(skip_all, level = "info")]
79pub async fn get_evaluations(
80 State(state): State<AppState>,
81 Query(q): Query<EvaluationPageQuery>,
82) -> ApiResult<ResultBody<PageBean<Evaluation>>> {
83 let data = EvaluationService::get_evaluations(
84 &state,
85 q.page,
86 q.page_size,
87 q.member_id,
88 q.evaluator_id,
89 q.start_time,
90 q.end_time,
91 )
92 .await?;
93 Ok(ResultBody::success_data(data))
94}
95
96#[tracing::instrument(skip_all, level = "info")]
98pub async fn get_evaluation(
99 State(state): State<AppState>,
100 Path(id): Path<i64>,
101) -> ApiResult<ResultBody<Evaluation>> {
102 let data = EvaluationService::get_evaluation(&state, id).await?;
103 Ok(ResultBody::success_data(data))
104}
105
106#[tracing::instrument(skip_all, level = "info")]
108pub async fn remove_evaluation(
109 State(state): State<AppState>,
110 Path(id): Path<i64>,
111) -> ApiResult<ResultBody<()>> {
112 EvaluationService::remove_by_id(&state, id).await?;
113 Ok(ResultBody::success())
114}
115
116#[tracing::instrument(skip_all, level = "info")]
118pub async fn update_evaluation(
119 State(state): State<AppState>,
120 Path(id): Path<i64>,
121 AppJson(mut body): AppJson<Evaluation>,
122) -> ApiResult<ResultBody<()>> {
123 body.id = Some(id);
124 EvaluationService::update_evaluation(&state, body).await?;
125 Ok(ResultBody::success())
126}