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