44 lines
1.3 KiB
Rust
44 lines
1.3 KiB
Rust
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<Uuid, models::directory::Directory> for DirectoryBatcher {
|
|
async fn load(&mut self, keys: &[Uuid]) -> HashMap<Uuid, models::directory::Directory> {
|
|
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<Utc>, Option<DateTime<Utc>>)>(db_conn)
|
|
.unwrap()
|
|
{
|
|
let row: (Uuid, DateTime<Utc>, Option<DateTime<Utc>>) = 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<Uuid, models::directory::Directory, DirectoryBatcher>;
|
|
|
|
pub const YIELD_COUNT: usize = 100;
|