pib-service-api 0.12.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::body::{Body, GetBodyListResponseBody};

use crate::{Result, ServiceState, api_permissions::EnforcePermissions as _, oidc::UserInfo};
pub(crate) mod by_body_id;

pub(crate) async fn get(
    State(service_state): State<Arc<ServiceState>>,
    Extension(user): Extension<UserInfo>,
) -> Result<Json<GetBodyListResponseBody>> {
    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::Body, Method::GET, user.id)
        .await?;

    let bodies = inventory.get_bodies_for_user(user.id).await?;

    let data = bodies
        .into_iter()
        .map(
            |pib_service_inventory::Body {
                 id,
                 created,
                 modified,
                 short_name,
                 name,
                 website,
                 license,
                 license_valid_since,
                 oparl_since,
                 ags,
                 rgs,
                 contact_email,
                 contact_name,
                 classification,
                 is_public,
             }| Body {
                id,
                created,
                modified,
                short_name,
                name,
                website,
                license,
                license_valid_since,
                oparl_since,
                ags,
                rgs,
                contact_email,
                contact_name,
                classification,
                is_public,
            },
        )
        .collect();

    Ok(Json(GetBodyListResponseBody { data }))
}