pib-service-api 0.11.0

pib-service edit API
Documentation
// SPDX-FileCopyrightText: Politik im Blick developers
// SPDX-FileCopyrightText: Wolfgang Silbermayr <wolfgang@silbermayr.at>
//
// SPDX-License-Identifier: AGPL-3.0-or-later OR EUPL-1.2

use std::sync::Arc;

use axum::{Extension, Json, extract::State};
use pib_service_api_permissions::{Method, Resource};
use pib_service_api_types::me::profile::{GetResponseBody, PatchRequestBody};
use pib_service_inventory::{UpdateUser, User};

use crate::{Result, ServiceState, api_permissions::EnforcePermissions as _, oidc::UserInfo};

pub(crate) async fn get(
    State(service_state): State<Arc<ServiceState>>,
    Extension(user): Extension<UserInfo>,
) -> Result<Json<GetResponseBody>> {
    let mut inventory = service_state.inventory_provider.get_inventory().await?;

    let user = inventory.get_user_by_sub(user.sub.to_string()).await?;

    service_state
        .permissions
        .enforce(Resource::MeProfile, Method::GET, user.id)
        .await?;

    Ok(Json(GetResponseBody {
        display_name: user.display_name,
    }))
}

pub(crate) async fn patch(
    State(service_state): State<Arc<ServiceState>>,
    Extension(user): Extension<UserInfo>,
    Json(PatchRequestBody { display_name }): Json<PatchRequestBody>,
) -> Result<Json<GetResponseBody>> {
    let mut inventory = service_state.inventory_provider.get_inventory().await?;

    let user = inventory.get_user_by_sub(user.sub.to_string()).await?;

    service_state
        .permissions
        .enforce(Resource::MeProfile, Method::PATCH, user.id)
        .await?;

    let User {
        id: _,
        sub: _,
        display_name,
    } = inventory
        .update_user(UpdateUser {
            id: user.id,
            sub: None,
            display_name,
        })
        .await?;

    Ok(Json(GetResponseBody { display_name }))
}