scufflecloud_core/
emails.rs

1use std::sync::Arc;
2
3use sailfish::{TemplateOnce, TemplateSimple};
4
5use crate::CoreConfig;
6
7#[derive(sailfish::TemplateSimple)]
8#[template(path = "emails/register_with_email/subject.stpl")]
9struct RegisterWithEmailSubjectTemplate;
10
11#[derive(sailfish::Template)]
12#[template(path = "emails/register_with_email/text.stpl")]
13#[allow(dead_code)]
14struct RegisterWithEmailTextTemplate {
15    pub url: String,
16}
17
18#[derive(sailfish::Template)]
19#[template(path = "emails/register_with_email/html.stpl")]
20#[allow(dead_code)]
21struct RegisterWithEmailHtmlTemplate {
22    pub url: String,
23}
24
25pub(crate) async fn register_with_email_email<G: CoreConfig>(
26    global: &Arc<G>,
27    to_address: String,
28    code: String,
29) -> Result<pb::scufflecloud::email::v1::Email, sailfish::RenderError> {
30    let url = format!("{}/register/confirm?code={}", global.dashboard_origin(), code);
31
32    let subject = RegisterWithEmailSubjectTemplate.render_once()?;
33    let text = RegisterWithEmailTextTemplate { url: url.to_string() }.render_once()?;
34    let html = RegisterWithEmailHtmlTemplate { url }.render_once()?;
35
36    Ok(pb::scufflecloud::email::v1::Email {
37        to_address,
38        source_address: global.email_from_address().to_string(),
39        subject,
40        text,
41        html,
42    })
43}
44
45#[derive(sailfish::TemplateSimple)]
46#[template(path = "emails/add_new_email/subject.stpl")]
47struct AddNewEmailSubjectTemplate;
48
49#[derive(sailfish::Template)]
50#[template(path = "emails/add_new_email/text.stpl")]
51#[allow(dead_code)]
52struct AddNewEmailTextTemplate {
53    pub url: String,
54}
55
56#[derive(sailfish::Template)]
57#[template(path = "emails/add_new_email/html.stpl")]
58#[allow(dead_code)]
59struct AddNewEmailHtmlTemplate {
60    pub url: String,
61}
62
63pub(crate) async fn add_new_email_email<G: CoreConfig>(
64    global: &Arc<G>,
65    to_address: String,
66    code: String,
67) -> Result<pb::scufflecloud::email::v1::Email, sailfish::RenderError> {
68    let url = format!("{}/settings/emails/confirm?code={}", global.dashboard_origin(), code);
69
70    let subject = AddNewEmailSubjectTemplate.render_once()?;
71    let text = AddNewEmailTextTemplate { url: url.clone() }.render_once()?;
72    let html = AddNewEmailHtmlTemplate { url }.render_once()?;
73
74    Ok(pb::scufflecloud::email::v1::Email {
75        to_address,
76        source_address: global.email_from_address().to_string(),
77        subject,
78        text,
79        html,
80    })
81}
82
83#[derive(sailfish::TemplateSimple)]
84#[template(path = "emails/magic_link/subject.stpl")]
85struct MagicLinkSubjectTemplate;
86
87#[derive(sailfish::Template)]
88#[template(path = "emails/magic_link/text.stpl")]
89#[allow(dead_code)]
90struct MagicLinkTextTemplate {
91    pub url: String,
92}
93
94#[derive(sailfish::Template)]
95#[template(path = "emails/magic_link/html.stpl")]
96#[allow(dead_code)]
97struct MagicLinkHtmlTemplate {
98    pub url: String,
99}
100
101pub(crate) async fn magic_link_email<G: CoreConfig>(
102    global: &Arc<G>,
103    to_address: String,
104    code: String,
105) -> Result<pb::scufflecloud::email::v1::Email, sailfish::RenderError> {
106    let url = format!("{}/login/magic-link?code={}", global.dashboard_origin(), code);
107
108    let subject = MagicLinkSubjectTemplate.render_once()?;
109    let text = MagicLinkTextTemplate { url: url.clone() }.render_once()?;
110    let html = MagicLinkHtmlTemplate { url }.render_once()?;
111
112    Ok(pb::scufflecloud::email::v1::Email {
113        to_address,
114        source_address: global.email_from_address().to_string(),
115        subject,
116        text,
117        html,
118    })
119}