use tracing::info;
use crate::collect::collector::CollectionStats;
use crate::collect::linear::LinearClient;
use crate::core::config::Config;
use crate::core::db::Database;
pub(super) async fn fetch_and_store_linear_issues(
db: &mut Database,
config: &Config,
stats: &mut CollectionStats,
) {
if let Some(linear_cfg) = &config.linear {
if linear_cfg.fetch_on_reference {
match LinearClient::new(linear_cfg) {
Ok(client) => {
let messages: Vec<String> = {
let conn = db.connection();
let mut stmt = match conn.prepare("SELECT message FROM commits") {
Ok(s) => s,
Err(e) => {
stats
.errors
.push(format!("Linear: query commits failed: {e}"));
return;
}
};
let rows = match stmt.query_map([], |row| row.get::<_, String>(0)) {
Ok(r) => r,
Err(e) => {
stats
.errors
.push(format!("Linear: read commits failed: {e}"));
return;
}
};
let mut out = Vec::new();
for r in rows.flatten() {
out.push(r);
}
out
};
let msg_refs: Vec<&str> = messages.iter().map(String::as_str).collect();
let issues = client
.fetch_referenced_issues(&msg_refs, &linear_cfg.team_keys)
.await;
for issue in &issues {
info!(
id = %issue.identifier,
state = %issue.state,
team = %issue.team,
"Linear issue fetched"
);
}
match client.store_issues(db, &issues) {
Ok(n) => {
info!(stored = n, "persisted linear_issues rows");
stats.linear_issues_fetched += n;
}
Err(e) => {
stats
.errors
.push(format!("Linear: store issues failed: {e}"));
}
}
}
Err(e) => {
stats.errors.push(format!("Linear client init failed: {e}"));
}
}
}
}
}