Skip to main content

headless_lms_models/
course_audiences.rs

1use crate::prelude::*;
2use serde::{Deserialize, Serialize};
3use utoipa::ToSchema;
4
5#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, ToSchema, Hash)]
6pub struct CourseAudience {
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_id: Uuid,
12    pub audience: String,
13}
14
15#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, ToSchema, Hash)]
16pub struct NewCourseAudience {
17    pub audience: String,
18}
19
20pub async fn insert_course_audiences(
21    conn: &mut PgConnection,
22    course_id: Uuid,
23    audiences: Vec<String>,
24) -> ModelResult<Vec<CourseAudience>> {
25    let res = sqlx::query_as!(
26        CourseAudience,
27        "
28INSERT INTO course_audiences (
29    course_id,
30    audience
31  )
32  SELECT $1,
33  UNNEST ($2::TEXT []) audience
34RETURNING *
35",
36        course_id,
37        &audiences
38    )
39    .fetch_all(conn)
40    .await?;
41    Ok(res)
42}
43
44pub async fn get_by_course_id(
45    conn: &mut PgConnection,
46    course_id: Uuid,
47) -> ModelResult<Vec<CourseAudience>> {
48    let res = sqlx::query_as!(
49        CourseAudience,
50        "
51SELECT *
52FROM course_audiences
53WHERE course_id = $1
54AND deleted_at IS NULL
55",
56        course_id
57    )
58    .fetch_all(conn)
59    .await?;
60    Ok(res)
61}
62
63pub async fn delete_batch(
64    conn: &mut PgConnection,
65    ids_to_delete: Vec<Uuid>,
66) -> ModelResult<Vec<CourseAudience>> {
67    let res = sqlx::query_as!(
68        CourseAudience,
69        "
70UPDATE course_audiences
71SET deleted_at = now()
72WHERE id = ANY($1::UUID [])
73AND deleted_at IS NULL
74RETURNING *
75",
76        &ids_to_delete
77    )
78    .fetch_all(conn)
79    .await?;
80    Ok(res)
81}