headless_lms_server/controllers/main_frontend/
email_templates.rs

1//! Controllers for requests starting with `/api/v0/main-frontend/email-templates/`.
2
3use models::email_templates::EmailTemplate;
4use utoipa::OpenApi;
5
6use crate::prelude::*;
7
8#[derive(OpenApi)]
9#[openapi(paths(get_all_email_templates, delete_email_template))]
10pub(crate) struct MainFrontendEmailTemplatesApiDoc;
11
12/**
13GET `/api/v0/main-frontend/email-templates`
14*/
15#[instrument(skip(pool))]
16#[utoipa::path(
17    get,
18    path = "",
19    operation_id = "getEmailTemplates",
20    tag = "email_templates",
21    responses(
22        (status = 200, description = "Email templates", body = Vec<EmailTemplate>)
23    )
24)]
25async fn get_all_email_templates(
26    pool: web::Data<PgPool>,
27    user: AuthUser,
28) -> ControllerResult<web::Json<Vec<EmailTemplate>>> {
29    let mut conn = pool.acquire().await?;
30    let token = authorize(
31        &mut conn,
32        Act::Administrate,
33        Some(user.id),
34        Res::GlobalPermissions,
35    )
36    .await?;
37    let email_templates = models::email_templates::get_all_email_templates(&mut conn).await?;
38    token.authorized_ok(web::Json(email_templates))
39}
40
41/**
42DELETE `/api/v0/main-frontend/email-templates/:id`
43*/
44#[instrument(skip(pool))]
45#[utoipa::path(
46    delete,
47    path = "/{email_template_id}",
48    operation_id = "deleteEmailTemplate",
49    tag = "email_templates",
50    params(
51        ("email_template_id" = Uuid, Path, description = "Email template id")
52    ),
53    responses(
54        (status = 200, description = "Deleted email template", body = EmailTemplate)
55    )
56)]
57async fn delete_email_template(
58    email_template_id: web::Path<Uuid>,
59    pool: web::Data<PgPool>,
60    user: AuthUser,
61) -> ControllerResult<web::Json<EmailTemplate>> {
62    let mut conn = pool.acquire().await?;
63    let deleted =
64        models::email_templates::delete_email_template(&mut conn, *email_template_id).await?;
65
66    let token = authorize(&mut conn, Act::Teach, Some(user.id), Res::AnyCourse).await?;
67    token.authorized_ok(web::Json(deleted))
68}
69
70/**
71Add a route for each controller in this module.
72
73The name starts with an underline in order to appear before other functions in the module documentation.
74
75We add the routes by calling the route method instead of using the route annotations because this method preserves the function signatures for documentation.
76*/
77pub fn _add_routes(cfg: &mut ServiceConfig) {
78    cfg.route("", web::get().to(get_all_email_templates)).route(
79        "/{email_template_id}",
80        web::delete().to(delete_email_template),
81    );
82}