From 078e2fd62ad4849cd8f2c9007fb68879be5d00f6 Mon Sep 17 00:00:00 2001 From: Akulij Date: Tue, 29 Apr 2025 17:37:20 +0300 Subject: [PATCH] create CallbackInfo and its tests --- src/db/callback_info.rs | 57 +++++++++++++++++++++++++++++ src/db/mod.rs | 2 + src/db/tests/callback_info_tests.rs | 28 ++++++++++++++ src/db/tests/mod.rs | 1 + 4 files changed, 88 insertions(+) create mode 100644 src/db/callback_info.rs create mode 100644 src/db/tests/callback_info_tests.rs diff --git a/src/db/callback_info.rs b/src/db/callback_info.rs new file mode 100644 index 0000000..ee20982 --- /dev/null +++ b/src/db/callback_info.rs @@ -0,0 +1,57 @@ +use crate::query_call; +use crate::CallDB; +use bson::oid::ObjectId; +use serde::{Deserialize, Serialize}; + +use super::DbResult; +use bson::doc; + +#[derive(Serialize, Deserialize, Default)] +pub struct CallbackInfo +where + C: Serialize, +{ + pub _id: bson::oid::ObjectId, + #[serde(flatten)] + pub callback: C, +} + +impl CallbackInfo +where + C: Serialize + for<'a> Deserialize<'a> + Send + Sync, +{ + pub fn new(callback: C) -> Self { + Self { + _id: Default::default(), + callback, + } + } + + pub fn get_id(&self) -> String { + self._id.to_hex() + } + + query_call!(store, self, db, (), { + let db = db.get_database().await; + let ci = db.collection::("callback_info"); + + ci.insert_one(self).await?; + + Ok(()) + }); + + pub async fn get(db: &mut D, id: &str) -> DbResult> { + let db = db.get_database().await; + let ci = db.collection::("callback_info"); + + let id = match ObjectId::parse_str(id) { + Ok(id) => id, + Err(_) => return Ok(None), + }; + + ci.find_one(doc! { + "_id": id + }) + .await + } +} diff --git a/src/db/mod.rs b/src/db/mod.rs index b01c65c..e569c58 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -1,3 +1,5 @@ +pub mod callback_info; + use async_trait::async_trait; use chrono::{DateTime, Utc}; use enum_stringify::EnumStringify; diff --git a/src/db/tests/callback_info_tests.rs b/src/db/tests/callback_info_tests.rs new file mode 100644 index 0000000..25871da --- /dev/null +++ b/src/db/tests/callback_info_tests.rs @@ -0,0 +1,28 @@ +use super::super::{callback_info::CallbackInfo, CallDB, DB}; +use super::setup_db; + +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Default)] +#[serde(tag = "type")] +#[serde(rename = "snake_case")] +pub enum Callback { + #[default] + MoreInfo, + NextPage, +} + +type CI = CallbackInfo; + +#[tokio::test] +async fn test_store() { + let mut db = setup_db().await; + + let ci = CI::new(Default::default()); + + ci.store(&mut db).await.unwrap(); + + let ci = CI::get(&mut db, &ci.get_id()).await.unwrap(); + + assert!(ci.is_some()); +} diff --git a/src/db/tests/mod.rs b/src/db/tests/mod.rs index 8a0e3b4..5c63fa8 100644 --- a/src/db/tests/mod.rs +++ b/src/db/tests/mod.rs @@ -1,5 +1,6 @@ #![allow(clippy::unwrap_used)] +mod callback_info_tests; use dotenvy; use super::CallDB;