use lazy_static::lazy_static;
pub mod models;
pub use models::*;
use mongodb::bson::doc;
use crate::core::error2::Error;
use crate::core::error2::Result;
use crate::core::auth0::UserDetails;
use crate::core::mongo;
use crate::services::feeds_service::FEEDS_DB;
lazy_static! {
pub static ref FEED_COMMENTS_COL: &'static str = "t_feed_comments";
}
pub async fn save_feed_comment(
client: &mongo::MongoClient,
record: models::FeedsCommentFormData,
curr_user: &UserDetails,
) -> Result<String> {
let user_feeds_record = FeedCommentSave::from(&record, curr_user);
client
.insert_one(*FEEDS_DB, *FEED_COMMENTS_COL, user_feeds_record)
.await
.map_err(Error::run_time)
}
pub async fn feed_comment_list(
client: &mongo::MongoClient,
user_id: Option<String>,
feed_id: &str,
) -> Result<Vec<FeedCommentVo>> {
let _filter = doc! {"feed_id": feed_id};
let _sort = doc! {"created_at": 1};
let list = client
.select::<FeedCommentRecord>(*FEEDS_DB, *FEED_COMMENTS_COL, _filter, _sort, (0, 15000))
.await?
.into_iter()
.map(|r| FeedCommentVo::from(&r, user_id.as_ref()))
.collect();
Ok(list)
}
pub async fn feeds_comment_count(client: &mongo::MongoClient, feed_id: &str) -> Result<i32> {
let pipeline = vec![
doc! { "$match": { "feed_id": feed_id } },
doc! {
"$group": {
"_id": "$feed_id",
"_cnt": { "$sum": 1 }
}
},
];
let result = client
.pipeline(*FEEDS_DB, *FEED_COMMENTS_COL, pipeline)
.await?;
if !result.is_empty() {
Ok(result[0].1)
} else {
Ok(0)
}
}