use async_trait::async_trait; use loco_rs::{ app::{AppContext, Hooks, Initializer}, bgworker::{BackgroundWorker, Queue}, boot::{create_app, BootResult, StartMode}, config::Config, controller::AppRoutes, db::{self, truncate_table}, environment::Environment, task::Tasks, Result, }; use migration::Migrator; use std::path::Path; #[allow(unused_imports)] use crate::{ controllers, initializers, models::_entities::users, tasks, workers::downloader::DownloadWorker, }; pub struct App; #[async_trait] impl Hooks for App { fn app_name() -> &'static str { env!("CARGO_CRATE_NAME") } fn app_version() -> String { format!( "{} ({})", env!("CARGO_PKG_VERSION"), option_env!("BUILD_SHA") .or(option_env!("GITHUB_SHA")) .unwrap_or("dev") ) } async fn boot( mode: StartMode, environment: &Environment, config: Config, ) -> Result { create_app::(mode, environment, config).await } async fn initializers(_ctx: &AppContext) -> Result>> { Ok(vec![ Box::new(initializers::view_engine::ViewEngineInitializer), Box::new(initializers::admin_seeder::AdminSeeder), ]) } fn routes(_ctx: &AppContext) -> AppRoutes { AppRoutes::with_default_routes() // controller routes below .add_route(controllers::calendar::routes()) .add_route(controllers::about::routes()) .add_route(controllers::about::admin_routes()) .add_route(controllers::admin::routes()) } async fn connect_workers(ctx: &AppContext, queue: &Queue) -> Result<()> { queue.register(DownloadWorker::build(ctx)).await?; Ok(()) } #[allow(unused_variables)] fn register_tasks(tasks: &mut Tasks) { // tasks-inject (do not remove) } async fn truncate(ctx: &AppContext) -> Result<()> { truncate_table(&ctx.db, users::Entity).await?; Ok(()) } async fn seed(ctx: &AppContext, base: &Path) -> Result<()> { db::seed::(&ctx.db, &base.join("users.yaml").display().to_string()) .await?; Ok(()) } }