Skip to main content

headless_lms_models/
material_references.rs

1use 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}