headless_lms_models/
student_countries.rs1use 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
48AND deleted_at IS NULL
49 "#,
50 id
51 )
52 .execute(conn)
53 .await?;
54 Ok(())
55}
56
57pub async fn get_countries(
58 conn: &mut PgConnection,
59 course_id: Uuid,
60 course_instance_id: Uuid,
61) -> ModelResult<Vec<StudentCountry>> {
62 let student_countries = sqlx::query_as!(
63 StudentCountry,
64 "
65SELECT *
66FROM student_countries
67WHERE course_id = $1
68AND course_instance_id = $2
69AND deleted_at IS NULL;
70",
71 course_id,
72 course_instance_id,
73 )
74 .fetch_all(conn)
75 .await?;
76 Ok(student_countries)
77}
78
79pub async fn get_selected_country_by_user_id(
80 conn: &mut PgConnection,
81 user_id: Uuid,
82 course_instance_id: Uuid,
83) -> ModelResult<StudentCountry> {
84 let country = sqlx::query_as!(
85 StudentCountry,
86 "
87SELECT *
88FROM student_countries
89WHERE user_id = $1
90AND course_instance_id = $2
91AND deleted_at IS NULL;
92",
93 user_id,
94 course_instance_id,
95 )
96 .fetch_one(conn)
97 .await?;
98 Ok(country)
99}