use anyhow::Result;
use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
use crate::api::github::{Client, CommitMeta, IssueMeta, PullMeta, ReleaseMeta, Repository};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ActivityRawData {
pub commits_18m: Vec<CommitMeta>,
pub issues_90d: Vec<IssueMeta>,
pub prs_90d: Vec<PullMeta>,
pub releases: Vec<ReleaseMeta>,
pub archived: bool,
pub issues_enabled: bool,
}
pub async fn collect(
client: &Client,
owner: &str,
repo: &str,
now: OffsetDateTime,
) -> Result<(Repository, ActivityRawData)> {
let metadata = client.get_repo(owner, repo).await?;
let cutoff_18m = now - time::Duration::days(30 * 18);
let cutoff_90d = now - time::Duration::days(90);
let commits_18m = client.list_commits(owner, repo, cutoff_18m, now).await?;
let releases = client.list_releases(owner, repo).await?;
let issues_90d = if metadata.has_issues {
client.list_issues_since(owner, repo, cutoff_90d).await?
} else {
Vec::new()
};
let prs_90d = client.list_pulls(owner, repo, cutoff_90d).await?;
let raw = ActivityRawData {
commits_18m,
issues_90d,
prs_90d,
releases,
archived: metadata.archived,
issues_enabled: metadata.has_issues,
};
Ok((metadata, raw))
}