Skip to main content

headless_lms_server/
openapi.rs

1use utoipa::{
2    Modify, OpenApi,
3    openapi::security::{HttpAuthScheme, HttpBuilder, SecurityScheme},
4};
5
6#[derive(OpenApi)]
7#[openapi(
8    nest(
9        (path = "/api/v0/cms", api = crate::controllers::cms::CmsRoutesApiDoc),
10        (path = "/api/v0/files", api = crate::controllers::files::CmsFilesApiDoc)
11    ),
12    info(
13        title = "CMS API",
14        version = "0.1.0"
15    )
16)]
17pub struct CmsApiDoc;
18
19#[derive(OpenApi)]
20#[openapi(
21    nest(
22        (
23            path = "/api/v0/main-frontend",
24            api = crate::controllers::main_frontend::MainFrontendRoutesApiDoc
25        ),
26        (path = "/api/v0/files", api = crate::controllers::files::FilesApiDoc)
27    ),
28    components(schemas(
29        headless_lms_models::suspected_cheaters::SuspectedCheaterStatus
30    )),
31    tags(
32        (name = "glossary", description = "Glossary endpoints used by main-frontend")
33    ),
34    info(
35        title = "Main Frontend API",
36        version = "0.1.0"
37    )
38)]
39pub struct MainFrontendApiDoc;
40
41#[derive(OpenApi)]
42#[openapi(
43    nest(
44        (
45            path = "/api/v0/course-material",
46            api = crate::controllers::course_material::CourseMaterialRoutesApiDoc
47        )
48    ),
49    components(schemas(
50        headless_lms_models::teacher_grading_decisions::TeacherDecisionType
51    )),
52    info(
53        title = "Course Material API",
54        version = "0.1.0"
55    )
56)]
57pub struct CourseMaterialApiDoc;
58
59#[derive(OpenApi)]
60#[openapi(
61    nest((path = "/api/v0/auth", api = crate::controllers::auth::AuthRoutesApiDoc)),
62    info(
63        title = "Auth API",
64        version = "0.1.0"
65    )
66)]
67pub struct AuthApiDoc;
68
69#[derive(OpenApi)]
70#[openapi(
71    nest((path = "/api/v0/errors", api = crate::controllers::errors::ErrorsRoutesApiDoc)),
72    info(
73        title = "Errors API",
74        version = "0.1.0"
75    )
76)]
77pub struct ErrorsApiDoc;
78
79/// Declares the single `bearer_auth` HTTP bearer scheme that every
80/// `/api/v0/exercise-services/client` operation references.
81struct ExerciseServicesClientSecurityAddon;
82
83impl Modify for ExerciseServicesClientSecurityAddon {
84    fn modify(&self, openapi: &mut utoipa::openapi::OpenApi) {
85        let components = openapi.components.get_or_insert_with(Default::default);
86        components.add_security_scheme(
87            "bearer_auth",
88            SecurityScheme::Http(
89                HttpBuilder::new()
90                    .scheme(HttpAuthScheme::Bearer)
91                    .description(Some(
92                        "Access token passed as an HTTP bearer token in the Authorization header.",
93                    ))
94                    .build(),
95            ),
96        );
97    }
98}
99
100#[derive(OpenApi)]
101#[openapi(
102    nest((path = "/api/v0/exercise-services/client", api = crate::controllers::exercise_services::client::ExerciseServicesClientRoutesApiDoc)),
103    modifiers(&ExerciseServicesClientSecurityAddon),
104    info(
105        title = "Exercise Services Client API",
106        version = "0.1.0"
107    )
108)]
109pub struct ExerciseServicesClientApiDoc;