headless_lms_server/controllers/cms/
email_templates.rs

1//! Controllers for requests starting with `/api/v0/cms/email-templates`.
2
3use 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/**
13GET `/api/v0/cms/email-templates/:id`
14*/
15#[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/**
51PUT `/api/v0/cms/email-templates/:id
52*/
53#[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/**
98DELETE `/api/v0/cms/email-templates/:id`
99*/
100#[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
137/**
138Add a route for each controller in this module.
139
140The name starts with an underline in order to appear before other functions in the module documentation.
141
142We add the routes by calling the route method instead of using the route annotations because this method preserves the function signatures for documentation.
143*/
144pub 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}