use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::core::reader::queries::{search, SearchParams};
use crate::core::types::TodoList;
use crate::state::AppState;
use crate::tools::lists::ProjectStatusArg;
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, Default)]
pub struct SearchArgs {
#[serde(default)]
pub query: Option<String>,
#[serde(default)]
pub tags: Vec<String>,
#[serde(default)]
pub area_id: Option<String>,
#[serde(default)]
pub project_id: Option<String>,
#[serde(default)]
pub status: Option<ProjectStatusArg>,
#[serde(default)]
pub due_before: Option<String>,
#[serde(default)]
pub due_after: Option<String>,
#[serde(default)]
pub scheduled_before: Option<String>,
#[serde(default)]
pub scheduled_after: Option<String>,
#[serde(default)]
pub limit: Option<u32>,
}
pub async fn things_search(
state: AppState,
args: SearchArgs,
) -> anyhow::Result<TodoList> {
let params = SearchParams {
query: args.query,
tags: args.tags,
area_id: args.area_id,
project_id: args.project_id,
status: args.status.unwrap_or_default().into(),
due_before: args.due_before,
due_after: args.due_after,
scheduled_before: args.scheduled_before,
scheduled_after: args.scheduled_after,
limit: args.limit.unwrap_or(50),
};
let items = search(&state.pool, params).await?;
Ok(TodoList { items })
}