use toasty::Db;
use topcoat::router::{Router, RouterBuilderDiscoverExt};
use crate::{Panel, RouterBuilderPanelExt, Table, TextColumn, lens, resource::Resource};
#[derive(Debug, Clone, toasty::Model, crate::ModelColumns)]
pub(crate) struct Dummy {
#[key]
#[auto]
pub(crate) id: uuid::Uuid,
pub(crate) name: String,
}
pub(crate) fn dummy_table() -> Table<Dummy> {
Table::<Dummy>::new(TextColumn::new(lens!(Dummy.name)))
}
#[derive(Debug, Clone, toasty::Model, crate::ModelColumns)]
pub(crate) struct Subscriber {
#[key]
#[auto]
pub(crate) id: uuid::Uuid,
#[unique]
pub(crate) email: String,
}
pub(crate) fn panel_for<R: Resource>() -> Panel {
Panel::new("admin")
.resource::<R>()
.auth(crate::Auth::disabled())
}
pub(crate) fn panel_state<U: crate::PanelUser>(
prefix: &str,
auth: crate::Auth<U>,
) -> super::state::PanelState {
super::state::PanelState {
realm: std::sync::Arc::new(crate::auth::Realm {
prefix: prefix.to_string(),
auth: auth.into_config(),
login_hint: None,
time_zone: jiff::tz::TimeZone::UTC,
catalog: std::sync::Arc::new(
crate::i18n::Catalog::new(std::slice::from_ref(&crate::i18n::ENGLISH), &[])
.expect("`en` builds"),
),
notifications: false,
serves_tenants: false,
pages: crate::auth::SettingsPaths::under(prefix),
audit_log: false,
}),
nav_items: Vec::new(),
areas: Vec::new(),
brand: None,
dark_mode: false,
environment: None,
shell_assets: None,
children: std::collections::HashMap::new(),
mounts: std::sync::Arc::default(),
root_redirect: None,
user_menu: Vec::new(),
banners: Vec::new(),
mounted_pages: std::collections::HashMap::new(),
uploads: None,
served_paths: Vec::new(),
signed_roots: Vec::new(),
urls: std::collections::HashMap::new(),
endpoints: Vec::new(),
searches: Vec::new(),
limits: crate::Limits::default(),
commit_hooks: Vec::new(),
}
}
pub(crate) fn serving(
builder: topcoat::context::Cx,
panel: &std::sync::Arc<super::state::PanelState>,
) -> topcoat::context::Cx {
builder
.with(crate::auth::AuthHost(&super::host::PanelHost))
.with(super::state::CurrentPanel(std::sync::Arc::clone(panel)))
.with(crate::auth::CurrentRealm(std::sync::Arc::clone(
&panel.realm,
)))
}
pub(crate) fn mount(db: Db, panel: Panel) -> topcoat::Result<Router> {
Ok(Router::builder().discover().with(db).panel(panel)?.build())
}
pub(crate) fn refusal<T>(mounted: topcoat::Result<T>) -> Vec<crate::DeclarationError> {
let Err(error) = mounted else {
panic!("the panel must not build");
};
error
.downcast_ref::<crate::MountError>()
.unwrap_or_else(|| panic!("a declaration mistake refuses the panel, got {error}"))
.errors()
.to_vec()
}
pub(crate) async fn seed_dummies(db: &mut Db, rows: usize, name: impl Fn(usize) -> String) {
let mut create = Dummy::create_many();
for i in 0..rows {
create = create.item(Dummy::create().name(name(i)));
}
create.exec(&mut *db).await.unwrap();
}