headless_lms_models/library/
course_instances.rs

1//! General functionality related to course instances
2
3use crate::{
4    course_background_question_answers::NewCourseBackgroundQuestionAnswer,
5    course_instance_enrollments::{CourseInstanceEnrollment, NewCourseInstanceEnrollment},
6    prelude::*,
7};
8
9/// Enrolls the user to the given course instance.
10pub 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        crate::course_background_question_answers::upsert_backround_question_answers(
32            &mut tx,
33            user_id,
34            background_question_answers,
35        )
36        .await?;
37    }
38    tx.commit().await?;
39    Ok(enrollment)
40}