headless_lms_models/
course_module_suotar_configurations.rs1use utoipa::ToSchema;
2
3use crate::prelude::*;
4
5#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, ToSchema)]
6pub struct CourseModuleSuotarConfiguration {
7 pub id: Uuid,
8 pub created_at: DateTime<Utc>,
9 pub updated_at: DateTime<Utc>,
10 pub deleted_at: Option<DateTime<Utc>>,
11 pub course_module_id: Uuid,
12 pub open_university_product_id: Option<String>,
13 pub grade_scale_id: Option<String>,
15 pub paused_at: Option<DateTime<Utc>>,
16 pub paused_by_user_id: Option<Uuid>,
17 pub pause_reason: Option<String>,
18 pub config_checked_at: Option<DateTime<Utc>>,
19 pub course_code_resolves: Option<bool>,
21 pub product_token_found: Option<bool>,
22 pub config_check_message: Option<String>,
23}
24
25pub async fn upsert(
31 conn: &mut PgConnection,
32 course_module_id: Uuid,
33 open_university_product_id: Option<&str>,
34 grade_scale_id: Option<&str>,
35) -> ModelResult<CourseModuleSuotarConfiguration> {
36 let res = sqlx::query_as!(
37 CourseModuleSuotarConfiguration,
38 r#"
39INSERT INTO course_module_suotar_configurations (
40 course_module_id,
41 open_university_product_id,
42 grade_scale_id
43 )
44VALUES ($1, $2, $3) ON CONFLICT (course_module_id) DO
45UPDATE
46SET open_university_product_id = $2,
47 grade_scale_id = $3,
48 deleted_at = NULL
49RETURNING *
50 "#,
51 course_module_id,
52 open_university_product_id,
53 grade_scale_id,
54 )
55 .fetch_one(conn)
56 .await?;
57 Ok(res)
58}