aven-core 0.1.34

Core library for the Aven local-first task manager
Documentation
use anyhow::Result;
use sqlx::SqliteConnection;

use crate::ids::WorkspaceId;

pub struct WorkspaceTaskCounts {
    pub visible: i64,
    pub total: i64,
}

pub async fn workspace_task_counts(
    conn: &mut SqliteConnection,
    workspace_id: &WorkspaceId,
) -> Result<WorkspaceTaskCounts> {
    let visible =
        sqlx::query_scalar("SELECT count(*) FROM tasks WHERE workspace_id = ? AND deleted = 0")
            .bind(workspace_id)
            .fetch_one(&mut *conn)
            .await?;
    let total = sqlx::query_scalar("SELECT count(*) FROM tasks WHERE workspace_id = ?")
        .bind(workspace_id)
        .fetch_one(&mut *conn)
        .await?;
    Ok(WorkspaceTaskCounts { visible, total })
}

pub async fn unresolved_conflict_count(conn: &mut SqliteConnection) -> Result<i64> {
    Ok(
        sqlx::query_scalar("SELECT count(*) FROM conflicts WHERE resolved = 0")
            .fetch_one(&mut *conn)
            .await?,
    )
}

pub async fn unresolved_task_conflict_count_in_workspace(
    conn: &mut SqliteConnection,
    workspace_id: &WorkspaceId,
) -> Result<i64> {
    Ok(sqlx::query_scalar(
        "SELECT count(*) FROM conflicts
             WHERE workspace_id = ? AND entity_type = 'task' AND resolved = 0
             AND field NOT LIKE 'metadata:%'",
    )
    .bind(workspace_id)
    .fetch_one(&mut *conn)
    .await?)
}