tdm_server_rust/repository/
evaluation_repo.rs1use crate::entity::evaluation::Evaluation;
6use chrono::{DateTime, Utc};
7use sqlx::{MySql, Pool, Row};
8
9pub struct EvaluationRepository {
11 pool: Pool<MySql>,
13}
14
15impl EvaluationRepository {
16 pub fn new(pool: Pool<MySql>) -> Self {
18 Self { pool }
19 }
20
21 #[tracing::instrument(skip_all, level = "debug")]
23 pub async fn insert(&self, eval: &Evaluation) -> crate::error::ApiResult<i64> {
24 let r = sqlx::query(
25 "INSERT INTO evaluation(member_id, target, evaluator_id, evaluator, role_type, content, evaluation_time, created_at) \
26 VALUES (?, ?, ?, ?, ?, ?, NOW(), NOW())",
27 )
28 .bind(eval.member_id)
29 .bind(&eval.target)
30 .bind(eval.evaluator_id)
31 .bind(&eval.evaluator)
32 .bind(eval.role_type)
33 .bind(&eval.content)
34 .execute(&self.pool)
35 .await?;
36 Ok(r.last_insert_id() as i64)
37 }
38
39 #[tracing::instrument(skip_all, level = "debug")]
41 pub async fn get_by_id(&self, id: i64) -> crate::error::ApiResult<Option<Evaluation>> {
42 let row = sqlx::query(
43 "SELECT id, member_id, target, evaluator_id, evaluator, role_type, content, evaluation_time, created_at, updated_at \
44 FROM evaluation WHERE id = ?",
45 )
46 .bind(id)
47 .fetch_optional(&self.pool)
48 .await?;
49 Ok(row.map(|r| row_to_evaluation(&r)))
50 }
51
52 #[tracing::instrument(skip_all, level = "debug")]
54 pub async fn select_by_filter(
55 &self,
56 member_id: Option<i32>,
57 evaluator_id: Option<i32>,
58 start_time: Option<DateTime<Utc>>,
59 end_time: Option<DateTime<Utc>>,
60 ) -> crate::error::ApiResult<Vec<Evaluation>> {
61 let mut sql = String::from(
62 "SELECT id, member_id, target, evaluator_id, evaluator, role_type, content, evaluation_time, created_at, updated_at \
63 FROM evaluation WHERE 1=1",
64 );
65 if member_id.is_some() {
66 sql.push_str(" AND member_id = ?");
67 }
68 if evaluator_id.is_some() {
69 sql.push_str(" AND evaluator_id = ?");
70 }
71 if start_time.is_some() {
72 sql.push_str(" AND evaluation_time >= ?");
73 }
74 if end_time.is_some() {
75 sql.push_str(" AND evaluation_time <= ?");
76 }
77 sql.push_str(" ORDER BY evaluation_time DESC");
78 let mut q = sqlx::query(&sql);
79 if let Some(v) = member_id {
80 q = q.bind(v);
81 }
82 if let Some(v) = evaluator_id {
83 q = q.bind(v);
84 }
85 if let Some(v) = start_time {
86 q = q.bind(v);
87 }
88 if let Some(v) = end_time {
89 q = q.bind(v);
90 }
91 let rows = q.fetch_all(&self.pool).await?;
92 Ok(rows.into_iter().map(|r| row_to_evaluation(&r)).collect())
93 }
94
95 #[tracing::instrument(skip_all, level = "debug")]
97 pub async fn update(&self, eval: &Evaluation) -> crate::error::ApiResult<()> {
98 sqlx::query(
99 "UPDATE evaluation SET member_id = ?, target = ?, role_type = ?, content = ?, updated_at = NOW() WHERE id = ?",
100 )
101 .bind(eval.member_id)
102 .bind(&eval.target)
103 .bind(eval.role_type)
104 .bind(&eval.content)
105 .bind(eval.id)
106 .execute(&self.pool)
107 .await?;
108 Ok(())
109 }
110
111 #[tracing::instrument(skip_all, level = "debug")]
113 pub async fn delete_by_id(&self, id: i64) -> crate::error::ApiResult<()> {
114 sqlx::query("DELETE FROM evaluation WHERE id = ?")
115 .bind(id)
116 .execute(&self.pool)
117 .await?;
118 Ok(())
119 }
120}
121
122fn row_to_evaluation(row: &sqlx::mysql::MySqlRow) -> Evaluation {
124 Evaluation {
125 id: row.try_get("id").ok(),
126 member_id: row.try_get("member_id").ok(),
127 target: row.try_get("target").ok(),
128 evaluator_id: row.try_get("evaluator_id").ok(),
129 evaluator: row.try_get("evaluator").ok(),
130 role_type: row.try_get("role_type").ok(),
131 content: row.try_get("content").ok(),
132 evaluation_time: row.try_get("evaluation_time").ok(),
133 created_at: row.try_get("created_at").ok(),
134 updated_at: row.try_get("updated_at").ok(),
135 }
136}