drawbridge_server/users/
put.rs1use 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}