1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use crate::db::{
    models::community_advisors_reviews::AdvisorReview,
    schema::community_advisors_reviews::{self, dsl as reviews_dsl},
    DbConnection, DbConnectionPool,
};
use crate::v0::errors::HandleError;

use diesel::{ExpressionMethods, Insertable, QueryDsl, QueryResult, RunQueryDsl};

pub async fn query_reviews_by_fund_id(
    id: i32,
    pool: &DbConnectionPool,
) -> Result<Vec<AdvisorReview>, HandleError> {
    let db_conn = pool.get().map_err(HandleError::DatabaseError)?;
    tokio::task::spawn_blocking(move || {
        reviews_dsl::community_advisors_reviews
            .filter(reviews_dsl::proposal_id.eq(id))
            .load::<AdvisorReview>(&db_conn)
            .map_err(|_e| {
                HandleError::NotFound("Error loading community advisors reviews".to_string())
            })
    })
    .await
    .map_err(|_e| HandleError::InternalError("Error executing request".to_string()))?
}

pub fn batch_insert_advisor_reviews(
    reviews: &[AdvisorReview],
    db_conn: &DbConnection,
) -> QueryResult<usize> {
    diesel::insert_into(community_advisors_reviews::table)
        .values(
            reviews
                .iter()
                .cloned()
                .map(|r| r.values())
                .collect::<Vec<_>>(),
        )
        .execute(db_conn)
}