drawbridge_server/users/
put.rs

1// SPDX-FileCopyrightText: 2022 Profian Inc. <opensource@profian.com>
2// SPDX-License-Identifier: Apache-2.0
3
4use super::super::{OidcClaims, ScopeContext, ScopeLevel, Store};
5
6use drawbridge_type::{Meta, UserContext, UserRecord};
7
8use async_std::sync::Arc;
9use axum::http::StatusCode;
10use axum::response::IntoResponse;
11use axum::{Extension, Json};
12use tracing::{debug, trace};
13
14pub async fn put(
15    Extension(store): Extension<Arc<Store>>,
16    claims: OidcClaims,
17    cx: UserContext,
18    meta: Meta,
19    Json(record): Json<UserRecord>,
20) -> impl IntoResponse {
21    trace!(target: "app::users::put", "called for `{cx}`");
22
23    claims
24        .assert_scope(ScopeContext::User, ScopeLevel::Write)
25        .map_err(IntoResponse::into_response)?;
26
27    if record.subject != claims.subject() {
28        return Err((StatusCode::UNAUTHORIZED, "OpenID Connect subject mismatch").into_response());
29    }
30
31    store
32        .create_user(&cx, meta, &record)
33        .await
34        .map_err(|e| {
35            debug!(target: "app::users::put", "failed for `{cx}`: {:?}", e);
36            e.into_response()
37        })
38        .map(|_| StatusCode::CREATED)
39}