headless_lms_models/
course_background_question_answers.rs

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