scufflecloud_core/
emails.rs1use 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}