aven-core 0.1.13

Core library for the Aven local-first task manager
Documentation
use crate::ids::WorkspaceId;
use anyhow::Result;
use chrono::NaiveDate;
use sqlx::SqliteConnection;

use crate::queue::queue_meta_on;
use crate::refs::DisplayRefContext;
use crate::task_enrichment::load_task_enrichment;
use crate::types::Task;

use super::TaskListItem;

/// Build a `Vec<TaskListItem>` from tasks by loading enrichment and display refs.
///
/// Preserves input task order. Callers are responsible for any post-processing
/// such as sorting, filtering, or truncation.
pub async fn build_task_list_items(
    conn: &mut SqliteConnection,
    workspace_id: &WorkspaceId,
    tasks: Vec<Task>,
    now_seconds: i64,
    local_today: NaiveDate,
    display_refs: &DisplayRefContext,
) -> Result<Vec<TaskListItem>> {
    let task_ids = tasks.iter().map(|task| task.id.clone()).collect::<Vec<_>>();
    let mut enrichment = load_task_enrichment(conn, workspace_id, &task_ids, display_refs).await?;

    let mut items = Vec::with_capacity(tasks.len());
    for task in tasks {
        let task_id = task.id.clone();
        let display_ref = display_refs.display_ref(&task);
        let labels = enrichment
            .labels_by_task
            .remove(&task_id)
            .unwrap_or_default();
        let notes = enrichment
            .notes_by_task
            .remove(&task_id)
            .unwrap_or_default();
        let attachments = enrichment
            .attachments_by_task
            .remove(&task_id)
            .unwrap_or_default();
        let has_conflict = enrichment.conflicted_task_ids.contains(&task_id);
        let unresolved_blocker_count = *enrichment
            .unresolved_blocker_counts_by_task
            .get(&task_id)
            .unwrap_or(&0);
        let dependent_count = *enrichment
            .dependent_counts_by_task
            .get(&task_id)
            .unwrap_or(&0);
        let depends_on = enrichment
            .depends_on_by_task
            .remove(&task_id)
            .unwrap_or_default();
        let blocks = enrichment
            .blocks_by_task
            .remove(&task_id)
            .unwrap_or_default();
        let epic_children = enrichment
            .epic_children_by_task
            .remove(&task_id)
            .unwrap_or_default();
        let epic_parent = enrichment.epic_parent_by_task.remove(&task_id);
        let queue = queue_meta_on(
            &task,
            has_conflict,
            unresolved_blocker_count > 0,
            dependent_count,
            now_seconds,
            local_today,
        );

        items.push(TaskListItem {
            task,
            display_ref,
            labels,
            notes,
            attachments,
            has_conflict,
            unresolved_blocker_count,
            dependent_count,
            depends_on,
            blocks,
            epic_children,
            epic_parent,
            queue,
        });
    }

    Ok(items)
}