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
44
45
46
47
use async_trait::async_trait;
use uuid::Uuid;

use crate::{
    backend::loaders::SDKLoaders,
    errors::sdk::SDKError,
    resources::{members::member::Member, tasks::task::Task},
};

use super::label::Label;

#[async_trait]
pub trait LabelRelations {
    async fn owner(&self, loaders: &SDKLoaders) -> Result<Member, SDKError>;
    async fn tasks(&self, loaders: &SDKLoaders) -> Result<Vec<Task>, SDKError>;
}

#[async_trait]
impl LabelRelations for Label {
    async fn owner(&self, loaders: &SDKLoaders) -> Result<Member, SDKError> {
        let data = loaders.member_loader.load_one(self.owner_id).await.unwrap().unwrap();

        Ok(data)
    }

    async fn tasks(&self, loaders: &SDKLoaders) -> Result<Vec<Task>, SDKError> {
        let ids: Vec<Uuid> = sqlx::query!(
            r#"
            SELECT task_id FROM labels_by_tasks
            WHERE label_id = $1
            "#,
            &self.id
        )
        .fetch_all(&*loaders.engine.db_pool)
        .await
        .unwrap()
        .into_iter()
        .map(|id| id.task_id)
        .collect();

        let tasks_map = loaders.task_loader.load_many(ids.clone()).await.unwrap();

        let tasks: &Vec<Task> = &ids.into_iter().map(|id| tasks_map.get(&id).unwrap().clone()).collect();

        Ok(tasks.clone())
    }
}