headless_lms_models/library/
course_instances.rs1use crate::{
4 course_background_question_answers::NewCourseBackgroundQuestionAnswer,
5 course_instance_enrollments::{CourseInstanceEnrollment, NewCourseInstanceEnrollment},
6 prelude::*,
7};
8
9pub async fn enroll(
11 conn: &mut PgConnection,
12 user_id: Uuid,
13 course_instance_id: Uuid,
14 background_question_answers: &[NewCourseBackgroundQuestionAnswer],
15) -> anyhow::Result<CourseInstanceEnrollment> {
16 let mut tx = conn.begin().await?;
17
18 let instance =
19 crate::course_instances::get_course_instance(&mut tx, course_instance_id).await?;
20 let enrollment = crate::course_instance_enrollments::insert_enrollment_and_set_as_current(
21 &mut tx,
22 NewCourseInstanceEnrollment {
23 user_id,
24 course_id: instance.course_id,
25 course_instance_id,
26 },
27 )
28 .await?;
29
30 if !background_question_answers.is_empty() {
31 let allowed_questions =
32 crate::course_background_questions::get_background_questions_for_course_instance(
33 &mut tx, &instance,
34 )
35 .await?;
36 let allowed_question_ids = allowed_questions
37 .iter()
38 .map(|question| question.id)
39 .collect::<Vec<_>>();
40 crate::course_background_question_answers::upsert_by_user_id_and_question_ids(
41 &mut tx,
42 user_id,
43 background_question_answers,
44 &allowed_question_ids,
45 )
46 .await?;
47 }
48 tx.commit().await?;
49 Ok(enrollment)
50}