Skip to main content

headless_lms_server/controllers/main_frontend/course_credit_registrations/
export.rs

1//! The course's credit registrations as a downloadable csv.
2
3use crate::domain::csv_export::{
4    credit_registrations_export::CreditRegistrationsExportOperation, general_export,
5};
6use crate::prelude::*;
7
8/**
9GET `/api/v0/main-frontend/course-credit-registrations/courses/{course_id}/export` - Every credit
10registration of the course as csv.
11*/
12#[instrument(skip(pool))]
13#[utoipa::path(
14    get,
15    path = "/courses/{course_id}/export",
16    operation_id = "exportCourseCreditRegistrations",
17    tag = "course-credit-registrations",
18    params(("course_id" = Uuid, Path, description = "Course id")),
19    responses(
20        (status = 200, description = "The course's credit registrations", body = String, content_type = "text/csv")
21    )
22)]
23pub async fn export_course_credit_registrations(
24    user: AuthUser,
25    pool: web::Data<PgPool>,
26    course_id: web::Path<Uuid>,
27) -> ControllerResult<HttpResponse> {
28    let mut conn = pool.acquire().await?;
29    let token =
30        super::authorize_credit_registration_teacher(&mut conn, user.id, *course_id).await?;
31
32    let course = models::courses::get_course(&mut conn, *course_id).await?;
33    general_export(
34        pool,
35        &format!(
36            "attachment; filename=\"{} - Credit registrations {}.csv\"",
37            course.name,
38            Utc::now().format("%Y-%m-%d")
39        ),
40        CreditRegistrationsExportOperation {
41            course_id: *course_id,
42        },
43        token,
44    )
45    .await
46}
47
48pub fn _add_routes(cfg: &mut ServiceConfig) {
49    cfg.route(
50        "/courses/{course_id}/export",
51        web::get().to(export_course_credit_registrations),
52    );
53}