File size: 1,260 Bytes
8c9f41d
 
 
 
a02919a
8c9f41d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
41
42
43
use deadpool_diesel::postgres::Pool;
use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl, SelectableHelper};

use crate::{
    models::entities::{keyframes::KeyframeEntity, videos::VideoEntity},
    services::keyframes::KeyframeService,
};

#[derive(Clone)]
pub struct KeyframeRepository<'a> {
    pool: &'a Pool,
}

impl<'a> From<&'a KeyframeService<'_>> for KeyframeRepository<'a> {
    fn from(value: &'a KeyframeService) -> Self {
        Self { pool: value.pool() }
    }
}

impl<'a> KeyframeRepository<'a> {
    pub async fn find_by_id_and_join_video(
        &self,
        id: i64,
    ) -> anyhow::Result<Option<(KeyframeEntity, VideoEntity)>> {
        use crate::schema::keyframes::dsl as keyframe_dsl;
        use crate::schema::videos::dsl as video_dsl;

        let query = keyframe_dsl::keyframes
            .inner_join(video_dsl::videos)
            .filter(keyframe_dsl::id.eq(id))
            .select((KeyframeEntity::as_select(), VideoEntity::as_select()));

        let conn = self.pool.get().await?;

        let results = conn
            .interact(move |conn| query.load::<(KeyframeEntity, VideoEntity)>(conn))
            .await
            .map_err(|e| anyhow::anyhow!("{:?}", e))??;

        Ok(results.into_iter().next())
    }
}