headless_lms_server/controllers/main_frontend/
exercise_services.rs

1//! Controllers for requests starting with `/api/v0/main-frontend/exercise-services/`.
2
3use models::exercise_services::{ExerciseService, ExerciseServiceNewOrUpdate};
4
5use crate::prelude::*;
6
7/**
8DELETE `/api/v0/main-frontend/exercise-services/:id`
9*/
10#[instrument(skip(pool))]
11async fn delete_exercise_service(
12    exercise_service_id: web::Path<Uuid>,
13    pool: web::Data<PgPool>,
14    user: AuthUser,
15) -> ControllerResult<web::Json<ExerciseService>> {
16    let mut conn = pool.acquire().await?;
17    let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::ExerciseService).await?;
18
19    let deleted =
20        models::exercise_services::delete_exercise_service(&mut conn, *exercise_service_id).await?;
21
22    token.authorized_ok(web::Json(deleted))
23}
24
25/**
26POST `/api/v0/main-frontend/exercise-services`
27*/
28#[instrument(skip(pool))]
29async fn add_exercise_service(
30    pool: web::Data<PgPool>,
31    user: AuthUser,
32    payload: web::Json<ExerciseServiceNewOrUpdate>,
33) -> ControllerResult<web::Json<ExerciseService>> {
34    let mut conn = pool.acquire().await?;
35    let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::ExerciseService).await?;
36
37    let exercise_service = payload.0;
38    let created =
39        models::exercise_services::insert_exercise_service(&mut conn, &exercise_service).await?;
40
41    token.authorized_ok(web::Json(created))
42}
43
44/**
45GET `/api/v0/main-frontend/exercise-services/:id`
46*/
47#[instrument(skip(pool))]
48async fn get_exercise_service_by_id(
49    exercise_service_id: web::Path<Uuid>,
50    pool: web::Data<PgPool>,
51    user: AuthUser,
52) -> ControllerResult<web::Json<ExerciseService>> {
53    let mut conn = pool.acquire().await?;
54    let exercise_service =
55        models::exercise_services::get_exercise_service(&mut conn, *exercise_service_id).await?;
56
57    let token = authorize(&mut conn, Act::Teach, Some(user.id), Res::ExerciseService).await?;
58    token.authorized_ok(web::Json(exercise_service))
59}
60
61/**
62GET `/api/v0/main-frontend/exercise-services`
63*/
64#[instrument(skip(pool))]
65async fn get_exercise_services(
66    pool: web::Data<PgPool>,
67    user: AuthUser,
68) -> ControllerResult<web::Json<Vec<ExerciseService>>> {
69    let mut conn = pool.acquire().await?;
70    let exercise_services = models::exercise_services::get_exercise_services(&mut conn).await?;
71
72    let token = authorize(&mut conn, Act::Teach, Some(user.id), Res::ExerciseService).await?;
73    token.authorized_ok(web::Json(exercise_services))
74}
75
76/**
77PUT `/api/v0/main-frontend/exercise-services/:id`
78*/
79#[instrument(skip(pool))]
80async fn update_exercise_service(
81    payload: web::Json<ExerciseServiceNewOrUpdate>,
82    exercise_service_id: web::Path<Uuid>,
83    pool: web::Data<PgPool>,
84    user: AuthUser,
85) -> ControllerResult<web::Json<ExerciseService>> {
86    let mut conn = pool.acquire().await?;
87    let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::ExerciseService).await?;
88
89    let updated_exercise_service = payload.0;
90    let updated_service = models::exercise_services::update_exercise_service(
91        &mut conn,
92        *exercise_service_id,
93        &updated_exercise_service,
94    )
95    .await?;
96
97    token.authorized_ok(web::Json(updated_service))
98}
99
100/**
101Add a route for each controller in this module.
102
103The name starts with an underline in order to appear before other functions in the module documentation.
104
105We add the routes by calling the route method instead of using the route annotations because this method preserves the function signatures for documentation.
106*/
107pub fn _add_routes(cfg: &mut ServiceConfig) {
108    cfg.route("/", web::post().to(add_exercise_service))
109        .route("/", web::get().to(get_exercise_services))
110        .route(
111            "/{exercise_service_id}",
112            web::delete().to(delete_exercise_service),
113        )
114        .route(
115            "/{exercise_service_id}",
116            web::put().to(update_exercise_service),
117        )
118        .route(
119            "/{exercise_service_id}",
120            web::get().to(get_exercise_service_by_id),
121        );
122}