headless_lms_models/
student_countries.rs

1use crate::prelude::*;
2
3#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
4#[cfg_attr(feature = "ts_rs", derive(TS))]
5pub struct StudentCountry {
6    pub id: Uuid,
7    pub user_id: Uuid,
8    pub course_id: Uuid,
9    pub course_instance_id: Uuid,
10    pub country_code: String,
11    pub created_at: DateTime<Utc>,
12    pub deleted_at: Option<DateTime<Utc>>,
13}
14
15pub async fn insert(
16    conn: &mut PgConnection,
17    user_id: Uuid,
18    course_id: Uuid,
19    course_instance_id: Uuid,
20    country_code: &str,
21) -> ModelResult<()> {
22    sqlx::query!(
23        "
24INSERT INTO student_countries (
25  user_id,
26  course_id,
27  course_instance_id,
28  country_code
29)
30VALUES($1, $2, $3, $4)
31      ",
32        user_id,
33        course_id,
34        course_instance_id,
35        country_code,
36    )
37    .execute(conn)
38    .await?;
39    Ok(())
40}
41
42pub async fn delete_student_country(conn: &mut PgConnection, id: Uuid) -> ModelResult<()> {
43    sqlx::query!(
44        r#"
45UPDATE student_countries
46SET deleted_at = now()
47WHERE id = $1
48      "#,
49        id
50    )
51    .execute(conn)
52    .await?;
53    Ok(())
54}
55
56pub async fn get_countries(
57    conn: &mut PgConnection,
58    course_id: Uuid,
59    course_instance_id: Uuid,
60) -> ModelResult<Vec<StudentCountry>> {
61    let student_countries = sqlx::query_as!(
62        StudentCountry,
63        "
64SELECT *
65FROM student_countries
66WHERE course_id = $1
67AND course_instance_id = $2
68AND deleted_at IS NULL;
69",
70        course_id,
71        course_instance_id,
72    )
73    .fetch_all(conn)
74    .await?;
75    Ok(student_countries)
76}
77
78pub async fn get_selected_country_by_user_id(
79    conn: &mut PgConnection,
80    user_id: Uuid,
81    course_instance_id: Uuid,
82) -> ModelResult<StudentCountry> {
83    let country = sqlx::query_as!(
84        StudentCountry,
85        "
86SELECT *
87FROM student_countries
88WHERE user_id = $1
89AND course_instance_id = $2
90AND deleted_at IS NULL;
91",
92        user_id,
93        course_instance_id,
94    )
95    .fetch_one(conn)
96    .await?;
97    Ok(country)
98}