headless_lms_server/controllers/cms/
email_templates.rs1use models::email_templates::{EmailTemplate, EmailTemplateUpdate};
4use utoipa::OpenApi;
5
6use crate::prelude::*;
7
8#[derive(OpenApi)]
9#[openapi(paths(get_email_template, update_email_template, delete_email_template))]
10pub(crate) struct CmsEmailTemplatesApiDoc;
11
12#[instrument(skip(pool))]
16#[utoipa::path(
17 get,
18 path = "/{email_template_id}",
19 operation_id = "getCmsEmailTemplate",
20 tag = "cms_email_templates",
21 params(
22 ("email_template_id" = Uuid, Path, description = "Email template id")
23 ),
24 responses(
25 (status = 200, description = "Email template", body = EmailTemplate)
26 )
27)]
28async fn get_email_template(
29 email_template_id: web::Path<Uuid>,
30 pool: web::Data<PgPool>,
31 user: AuthUser,
32) -> ControllerResult<web::Json<EmailTemplate>> {
33 let mut conn = pool.acquire().await?;
34 let email_templates =
35 models::email_templates::get_email_template(&mut conn, *email_template_id).await?;
36 let token = if let Some(course_id) = email_templates.course_id {
37 authorize(&mut conn, Act::Teach, Some(user.id), Res::Course(course_id)).await?
38 } else {
39 authorize(
40 &mut conn,
41 Act::Administrate,
42 Some(user.id),
43 Res::GlobalPermissions,
44 )
45 .await?
46 };
47 token.authorized_ok(web::Json(email_templates))
48}
49
50#[instrument(skip(pool))]
54#[utoipa::path(
55 put,
56 path = "/{email_template_id}",
57 operation_id = "updateCmsEmailTemplate",
58 tag = "cms_email_templates",
59 params(
60 ("email_template_id" = Uuid, Path, description = "Email template id")
61 ),
62 request_body = EmailTemplateUpdate,
63 responses(
64 (status = 200, description = "Updated email template", body = EmailTemplate)
65 )
66)]
67async fn update_email_template(
68 email_template_id: web::Path<Uuid>,
69 payload: web::Json<EmailTemplateUpdate>,
70 pool: web::Data<PgPool>,
71 user: AuthUser,
72) -> ControllerResult<web::Json<EmailTemplate>> {
73 let mut conn = pool.acquire().await?;
74 let template =
75 models::email_templates::get_email_template(&mut conn, *email_template_id).await?;
76 let token = if let Some(course_id) = template.course_id {
77 authorize(&mut conn, Act::Teach, Some(user.id), Res::Course(course_id)).await?
78 } else {
79 authorize(
80 &mut conn,
81 Act::Administrate,
82 Some(user.id),
83 Res::GlobalPermissions,
84 )
85 .await?
86 };
87 let request_update_template = payload.0;
88 let updated_template = models::email_templates::update_email_template(
89 &mut conn,
90 *email_template_id,
91 request_update_template,
92 )
93 .await?;
94 token.authorized_ok(web::Json(updated_template))
95}
96
97#[instrument(skip(pool))]
101#[utoipa::path(
102 delete,
103 path = "/{email_template_id}",
104 operation_id = "deleteCmsEmailTemplate",
105 tag = "cms_email_templates",
106 params(
107 ("email_template_id" = Uuid, Path, description = "Email template id")
108 ),
109 responses(
110 (status = 200, description = "Deleted email template", body = EmailTemplate)
111 )
112)]
113async fn delete_email_template(
114 email_template_id: web::Path<Uuid>,
115 pool: web::Data<PgPool>,
116 user: AuthUser,
117) -> ControllerResult<web::Json<EmailTemplate>> {
118 let mut conn = pool.acquire().await?;
119 let template =
120 models::email_templates::get_email_template(&mut conn, *email_template_id).await?;
121 let token = if let Some(course_id) = template.course_id {
122 authorize(&mut conn, Act::Teach, Some(user.id), Res::Course(course_id)).await?
123 } else {
124 authorize(
125 &mut conn,
126 Act::Administrate,
127 Some(user.id),
128 Res::GlobalPermissions,
129 )
130 .await?
131 };
132 let deleted =
133 models::email_templates::delete_email_template(&mut conn, *email_template_id).await?;
134 token.authorized_ok(web::Json(deleted))
135}
136
137pub fn _add_routes(cfg: &mut ServiceConfig) {
145 cfg.route("/{email_template_id}", web::get().to(get_email_template))
146 .route("/{email_template_id}", web::put().to(update_email_template))
147 .route(
148 "/{email_template_id}",
149 web::delete().to(delete_email_template),
150 );
151}