headless_lms_models/
course_background_question_answers.rs1use crate::{course_background_questions::CourseBackgroundQuestion, prelude::*};
2
3#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
4#[cfg_attr(feature = "ts_rs", derive(TS))]
5pub struct CourseBackgroundQuestionAnswer {
6 pub id: Uuid,
7 pub created_at: DateTime<Utc>,
8 pub updated_at: DateTime<Utc>,
9 pub deleted_at: Option<DateTime<Utc>>,
10 pub course_background_question_id: Uuid,
11 pub answer_value: Option<String>,
12 pub user_id: Uuid,
13}
14
15#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
16#[cfg_attr(feature = "ts_rs", derive(TS))]
17pub struct NewCourseBackgroundQuestionAnswer {
18 pub answer_value: Option<String>,
19 pub course_background_question_id: Uuid,
20}
21
22pub async fn get_background_question_answers_for_background_questions(
23 conn: &mut PgConnection,
24 user_id: Uuid,
25 background_questions: &[CourseBackgroundQuestion],
26) -> ModelResult<Vec<CourseBackgroundQuestionAnswer>> {
27 let ids = background_questions
28 .iter()
29 .map(|o| o.id)
30 .collect::<Vec<_>>();
31 let res: Vec<CourseBackgroundQuestionAnswer> = sqlx::query_as!(
32 CourseBackgroundQuestionAnswer,
33 r#"
34SELECT *
35FROM course_background_question_answers
36WHERE deleted_at IS NULL
37AND user_id = $1
38AND course_background_question_id IN (
39 SELECT UNNEST($2::uuid [])
40 )
41 "#,
42 user_id,
43 &ids,
44 )
45 .fetch_all(conn)
46 .await?;
47 Ok(res)
48}
49
50pub async fn upsert_backround_question_answers(
51 conn: &mut PgConnection,
52 user_id: Uuid,
53 background_question_answers: &[NewCourseBackgroundQuestionAnswer],
54) -> ModelResult<()> {
55 let mut tx = conn.begin().await?;
56 for answer in background_question_answers {
57 sqlx::query!(
58 r#"
59INSERT INTO course_background_question_answers (
60 course_background_question_id,
61 user_id,
62 answer_value
63 )
64VALUES ($1, $2, $3) ON CONFLICT (
65 course_background_question_id,
66 user_id,
67 deleted_at
68 ) DO
69UPDATE
70SET answer_value = $3
71 "#,
72 answer.course_background_question_id,
73 user_id,
74 answer.answer_value
75 )
76 .execute(&mut *tx)
77 .await?;
78 }
79
80 tx.commit().await?;
81
82 Ok(())
83}