headless_lms_server/controllers/tmc_server/
users_by_upstream_id.rs

1/*!
2Handlers for HTTP requests to `/api/v0/tmc-server/users-by-upstream-id`.
3
4These endpoints are used by the TMC server so that it can integrate with this system.
5*/
6
7use std::env;
8
9use crate::{
10    domain::authorization::{
11        authorize_access_to_tmc_server, get_user_from_moocfi_by_tmc_access_token_and_upstream_id,
12    },
13    prelude::*,
14};
15use models::users::User;
16
17/**
18GET `/api/v0/tmc-server/users-by-upstream-id/:id` Endpoint that TMC server uses to get user information by using its own ids.
19
20Only works if the authorization header is set to a secret value.
21*/
22#[instrument(skip(pool))]
23pub async fn get_user_by_upstream_id(
24    upstream_id: web::Path<i32>,
25    pool: web::Data<PgPool>,
26    request: HttpRequest,
27) -> ControllerResult<web::Json<User>> {
28    let mut conn = pool.acquire().await?;
29    let token = authorize_access_to_tmc_server(&request).await?;
30    let tmc_access_token = env::var("TMC_ACCESS_TOKEN").expect("TMC_ACCESS_TOKEN must be defined");
31    let user = get_user_from_moocfi_by_tmc_access_token_and_upstream_id(
32        &mut conn,
33        &tmc_access_token,
34        &upstream_id,
35    )
36    .await?;
37
38    token.authorized_ok(web::Json(user))
39}
40
41pub fn _add_routes(cfg: &mut ServiceConfig) {
42    cfg.route("/{user_id}", web::get().to(get_user_by_upstream_id));
43}