headless_lms_models/
material_references.rs1use crate::prelude::*;
2use chrono::{DateTime, Utc};
3use sqlx::PgConnection;
4use utoipa::ToSchema;
5use uuid::Uuid;
6
7#[derive(Debug, Serialize, Deserialize, FromRow, PartialEq, Clone, ToSchema)]
8
9pub struct MaterialReference {
10 pub id: Uuid,
11 pub course_id: Uuid,
12 pub citation_key: String,
13 pub reference: String,
14 pub created_at: DateTime<Utc>,
15 pub updated_at: DateTime<Utc>,
16 pub deleted_at: Option<DateTime<Utc>>,
17}
18
19#[derive(Debug, Serialize, Deserialize, FromRow, PartialEq, Clone, ToSchema)]
20
21pub struct NewMaterialReference {
22 pub citation_key: String,
23 pub reference: String,
24}
25
26pub async fn insert_reference(
27 conn: &mut PgConnection,
28 course_id: Uuid,
29 new_ref: Vec<NewMaterialReference>,
30) -> ModelResult<()> {
31 let mut tx = conn.begin().await?;
32 let new_ref_iter = new_ref.iter();
33
34 for new_ref in new_ref_iter {
35 sqlx::query!(
36 "
37 INSERT INTO material_references(course_id, citation_key, reference)
38 VALUES ($1, $2, $3)
39 ",
40 course_id,
41 new_ref.citation_key,
42 new_ref.reference
43 )
44 .execute(&mut *tx)
45 .await?;
46 }
47 tx.commit().await?;
48
49 Ok(())
50}
51
52pub async fn get_reference_by_id(
53 conn: &mut PgConnection,
54 reference_id: Uuid,
55) -> ModelResult<MaterialReference> {
56 let res = sqlx::query_as!(
57 MaterialReference,
58 "
59SELECT *
60FROM material_references
61WHERE id = $1;
62 ",
63 reference_id
64 )
65 .fetch_one(conn)
66 .await?;
67 Ok(res)
68}
69
70pub async fn get_non_deleted_by_id(
71 conn: &mut PgConnection,
72 reference_id: Uuid,
73) -> ModelResult<MaterialReference> {
74 let res = sqlx::query_as!(
75 MaterialReference,
76 "
77SELECT *
78FROM material_references
79WHERE id = $1
80 AND deleted_at IS NULL;
81 ",
82 reference_id
83 )
84 .fetch_one(conn)
85 .await?;
86 Ok(res)
87}
88
89pub async fn get_references_by_course_id(
90 conn: &mut PgConnection,
91 course_id: Uuid,
92) -> ModelResult<Vec<MaterialReference>> {
93 let res = sqlx::query_as!(
94 MaterialReference,
95 "
96SELECT *
97FROM material_references
98WHERE course_id = $1
99 AND deleted_at IS NULL;
100 ",
101 course_id
102 )
103 .fetch_all(conn)
104 .await?;
105 Ok(res)
106}
107
108pub async fn update_material_reference_by_id(
109 conn: &mut PgConnection,
110 material_reference_id: Uuid,
111 material_reference: NewMaterialReference,
112) -> ModelResult<()> {
113 sqlx::query!(
114 "
115UPDATE material_references
116SET reference = $1, citation_key = $2
117WHERE id = $3;
118",
119 material_reference.reference,
120 material_reference.citation_key,
121 material_reference_id
122 )
123 .execute(conn)
124 .await?;
125 Ok(())
126}
127
128pub async fn update_by_id_and_course_id(
129 conn: &mut PgConnection,
130 material_reference_id: Uuid,
131 course_id: Uuid,
132 material_reference: NewMaterialReference,
133) -> ModelResult<MaterialReference> {
134 let res = sqlx::query_as!(
135 MaterialReference,
136 "
137UPDATE material_references
138SET reference = $1,
139 citation_key = $2
140WHERE id = $3
141 AND course_id = $4
142 AND deleted_at IS NULL
143RETURNING *
144 ",
145 material_reference.reference,
146 material_reference.citation_key,
147 material_reference_id,
148 course_id
149 )
150 .fetch_one(conn)
151 .await?;
152 Ok(res)
153}
154
155pub async fn delete_reference(conn: &mut PgConnection, id: Uuid) -> ModelResult<()> {
156 sqlx::query!(
157 "
158UPDATE material_references
159SET deleted_at = now()
160WHERE material_references.id = $1
161AND deleted_at IS NULL;
162 ",
163 id
164 )
165 .execute(conn)
166 .await?;
167 Ok(())
168}
169
170pub async fn delete_by_id_and_course_id(
171 conn: &mut PgConnection,
172 id: Uuid,
173 course_id: Uuid,
174) -> ModelResult<MaterialReference> {
175 let res = sqlx::query_as!(
176 MaterialReference,
177 "
178UPDATE material_references
179SET deleted_at = now()
180WHERE id = $1
181 AND course_id = $2
182 AND deleted_at IS NULL
183RETURNING *
184 ",
185 id,
186 course_id
187 )
188 .fetch_one(conn)
189 .await?;
190 Ok(res)
191}