use async_trait::async_trait; use chrono::prelude::*; use dataloader::non_cached::Loader; use dataloader::BatchFn; use diesel::prelude::*; use std::collections::HashMap; use uuidv7::Uuid; use crate::{api::models, db}; pub struct DirectoryBatcher; #[async_trait] impl BatchFn for DirectoryBatcher { async fn load(&mut self, keys: &[Uuid]) -> HashMap { let db_conn = &mut db::POOL.get().unwrap(); let mut map = HashMap::new(); for row in db::schema::directories::table .select(( db::schema::directories::id, db::schema::directories::created_at, db::schema::directories::updated_at, )) .filter(db::schema::directories::id.eq_any(keys)) .load::<(Uuid, DateTime, Option>)>(db_conn) .unwrap() { let row: (Uuid, DateTime, Option>) = row; let data = models::directory::Directory { id: row.0, created_at: row.1, updated_at: row.2, }; map.insert(data.id, data); } map } } pub type DirectoryLoader = Loader; pub const YIELD_COUNT: usize = 100;