headless_lms_models/
email_templates.rs1use 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}