headless_lms_models/
email_templates.rs

1use crate::prelude::*;
2
3#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
4#[cfg_attr(feature = "ts_rs", derive(TS))]
5pub struct EmailTemplate {
6    pub id: Uuid,
7    pub created_at: DateTime<Utc>,
8    pub updated_at: DateTime<Utc>,
9    pub deleted_at: Option<DateTime<Utc>>,
10    pub content: Option<serde_json::Value>,
11    pub name: String,
12    pub subject: Option<String>,
13    pub exercise_completions_threshold: Option<i32>,
14    pub points_threshold: Option<i32>,
15    pub course_instance_id: Uuid,
16}
17
18#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
19#[cfg_attr(feature = "ts_rs", derive(TS))]
20pub struct EmailTemplateNew {
21    pub name: String,
22}
23
24#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
25#[cfg_attr(feature = "ts_rs", derive(TS))]
26pub struct EmailTemplateUpdate {
27    pub name: String,
28    pub subject: String,
29    pub content: serde_json::Value,
30    pub exercise_completions_threshold: Option<i32>,
31    pub points_threshold: Option<i32>,
32}
33
34pub async fn get_email_templates(
35    conn: &mut PgConnection,
36    course_instance_id: Uuid,
37) -> ModelResult<Vec<EmailTemplate>> {
38    let res = sqlx::query_as!(
39        EmailTemplate,
40        "SELECT *
41FROM email_templates
42WHERE course_instance_id = $1
43  AND deleted_at IS NULL",
44        course_instance_id
45    )
46    .fetch_all(conn)
47    .await?;
48    Ok(res)
49}
50
51pub async fn insert_email_template(
52    conn: &mut PgConnection,
53    course_instance_id: Uuid,
54    email_template: EmailTemplateNew,
55    subject: Option<&'_ str>,
56) -> ModelResult<EmailTemplate> {
57    let res = sqlx::query_as!(
58        EmailTemplate,
59        "
60INSERT INTO email_templates (name, course_instance_id, subject)
61VALUES ($1, $2, $3)
62RETURNING *
63",
64        email_template.name,
65        course_instance_id,
66        subject,
67    )
68    .fetch_one(conn)
69    .await?;
70    Ok(res)
71}
72
73pub async fn get_email_template(
74    conn: &mut PgConnection,
75    email_template_id: Uuid,
76) -> ModelResult<EmailTemplate> {
77    let res = sqlx::query_as!(
78        EmailTemplate,
79        "SELECT *
80FROM email_templates
81WHERE id = $1
82  AND deleted_at IS NULL",
83        email_template_id
84    )
85    .fetch_one(conn)
86    .await?;
87    Ok(res)
88}
89
90pub async fn update_email_template(
91    conn: &mut PgConnection,
92    email_template_id: Uuid,
93    email_template_update: EmailTemplateUpdate,
94) -> ModelResult<EmailTemplate> {
95    let res = sqlx::query_as!(
96        EmailTemplate,
97        r#"
98UPDATE email_templates
99SET name = $1,
100  subject = $2,
101  content = $3,
102  exercise_completions_threshold = $4,
103  points_threshold = $5
104WHERE id = $6
105RETURNING *
106  "#,
107        email_template_update.name,
108        email_template_update.subject,
109        email_template_update.content,
110        email_template_update.exercise_completions_threshold,
111        email_template_update.points_threshold,
112        email_template_id
113    )
114    .fetch_one(conn)
115    .await?;
116    Ok(res)
117}
118
119pub async fn delete_email_template(
120    conn: &mut PgConnection,
121    email_template_id: Uuid,
122) -> ModelResult<EmailTemplate> {
123    let deleted = sqlx::query_as!(
124        EmailTemplate,
125        r#"
126UPDATE email_templates
127SET deleted_at = now()
128WHERE id = $1
129RETURNING *
130  "#,
131        email_template_id
132    )
133    .fetch_one(conn)
134    .await?;
135    Ok(deleted)
136}