actix-admin 0.8.0

An admin interface for actix-web
Documentation
use actix_session::Session;
use actix_web::HttpRequest;
use actix_web::{error, web, Error, HttpResponse};
use sea_orm::DatabaseConnection;
use tera::Context;
use super::helpers::{add_default_context, SearchParams};
use crate::prelude::*;
use crate::ActixAdminNotification;

use super::{add_auth_context, render_unauthorized, user_can_access_page};
use super::{Params, DEFAULT_ENTITIES_PER_PAGE};

pub async fn show<E: ActixAdminViewModelTrait>(
    session: Session,
    req: HttpRequest,
    data: web::Data<ActixAdmin>,
    id: web::Path<i32>,
    db: web::Data<DatabaseConnection>,
) -> Result<HttpResponse, Error> {
    let actix_admin = &data.into_inner();

    let mut ctx = Context::new();
    let entity_name = E::get_entity_name();
    let view_model: &ActixAdminViewModel = actix_admin.view_models.get(&entity_name).unwrap();
    if !user_can_access_page(&session, actix_admin, view_model) {
        return render_unauthorized(&ctx, &actix_admin);
    }

    let tenant_ref = actix_admin
        .configuration
        .user_tenant_ref
        .map_or(None, |f| f(&session));

    let mut errors: Vec<crate::ActixAdminError> = Vec::new();
    let model = match E::get_entity(&db, id.into_inner(), tenant_ref).await {
        Ok(res) => res,
        Err(e) => {
            errors.push(e);
            ActixAdminModel::create_empty()
        }
    };

    let mut http_response_code = match errors.is_empty() {
        false => HttpResponse::InternalServerError(),
        true => HttpResponse::Ok(),
    };
    let notifications: Vec<ActixAdminNotification> = errors
        .into_iter()
        .map(|err| ActixAdminNotification::from(err))
        .collect();

    let params = web::Query::<Params>::from_query(req.query_string()).unwrap();

    let search_params = SearchParams {
        page: params.page.unwrap_or(1),
        entities_per_page: params
            .entities_per_page
            .unwrap_or(DEFAULT_ENTITIES_PER_PAGE),
        search: params.search.clone().unwrap_or(String::new()),
        sort_by: params
            .sort_by
            .clone()
            .unwrap_or(view_model.primary_key.to_string()),
        sort_order: params
            .sort_order
            .as_ref()
            .unwrap_or(&SortOrder::Asc)
            .clone(),
    };

    add_auth_context(&session, actix_admin, &mut ctx);

    add_default_context(
        &mut ctx,
        req,
        view_model,
        entity_name,
        actix_admin,
        notifications,
        &search_params,
    );
    ctx.insert("model", &model);

    let body = actix_admin
        .tera
        .render("show.html", &ctx)
        .map_err(|err| error::ErrorInternalServerError(err))?;
    Ok(http_response_code.content_type("text/html").body(body))
}