From 597e6de09e116798c67e53ae879021d787cd8cfb Mon Sep 17 00:00:00 2001 From: Akulij Date: Mon, 2 Jun 2025 16:45:10 +0500 Subject: [PATCH] db: create get_random_users --- src/db/mod.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/db/mod.rs b/src/db/mod.rs index db6b0c2..508bdbe 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -11,6 +11,7 @@ use chrono::{DateTime, Utc}; use enum_stringify::EnumStringify; use futures::stream::TryStreamExt; +use futures::StreamExt; use mongodb::options::IndexOptions; use mongodb::{bson::doc, options::ClientOptions, Client}; use mongodb::{Collection, Database, IndexModel}; @@ -230,6 +231,8 @@ impl GetCollection for T { pub enum DbError { #[error("error while processing mongodb query: {0}")] MongodbError(#[from] mongodb::error::Error), + #[error("error while coverting values: {0}")] + SerdeJsonError(#[from] serde_json::error::Error), } pub type DbResult = Result; @@ -246,6 +249,26 @@ pub trait CallDB { Ok(users.find(doc! {}).await?.try_collect().await?) } + async fn get_random_users(&self, n: u32) -> DbResult> { + let db = self.get_database_immut().await; + let users = db.collection::("users"); + + let random_users: Vec = users + .aggregate(vec![doc! {"$sample": {"size": n}}]) + .await? + .try_collect() + .await?; + let random_users = random_users + .into_iter() + .map(|d| match serde_json::to_value(d) { + Ok(value) => serde_json::from_value::(value), + Err(err) => Err(err), + }) + .collect::>()?; + + Ok(random_users) + } + async fn set_admin(&mut self, userid: i64, isadmin: bool) -> DbResult<()> { let db = self.get_database().await; let users = db.collection::("users");