Skip to main content

tdm_server_rust/web/
evaluation_controller.rs

1//! 评价管理接口 (Evaluation Controller)
2//!
3//! 组员互评/审稿评价的增删改查。
4//! 对应 Java EvaluationController。
5
6use 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/// 评价分页查询参数
25#[derive(Debug, Deserialize)]
26#[serde(rename_all = "camelCase")]
27pub struct EvaluationPageQuery {
28    /// 页码
29    #[serde(default, deserialize_with = "de_page")]
30    pub page: i32,
31    /// 每页条数
32    #[serde(default, deserialize_with = "de_page_size")]
33    pub page_size: i32,
34    /// 被评价组员 ID
35    #[serde(default, deserialize_with = "de_opt_i32")]
36    pub member_id: Option<i32>,
37    /// 评价人 ID
38    #[serde(default, deserialize_with = "de_opt_i32")]
39    pub evaluator_id: Option<i32>,
40    /// 开始时间
41    pub start_time: Option<DateTime<Utc>>,
42    /// 结束时间
43    pub end_time: Option<DateTime<Utc>>,
44}
45
46/// 评价路由(挂载于 `/api/evaluations`)
47pub 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/// 新增评价
59#[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/// 分页查询评价
78#[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/// 按 ID 查询评价
97#[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/// 删除评价
107#[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/// 更新评价
117#[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}