use crate::AppService; use crate::error::AppError; use serde::{Deserialize, Serialize}; use session::Session; use utoipa::ToSchema; use super::user_info::UserInfoExternal; use super::repository::{UserRepoInfo, UserReposQuery}; use super::projects::{UserProjectInfo, UserProjectsQuery}; use super::user_activity::{UserActivityItem, UserActivityQuery}; use super::chpc::{ContributionHeatmapResponse, ContributionHeatmapQuery}; #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct UserSummaryResponse { pub info: UserInfoExternal, pub repos: Vec, pub projects: Vec, pub activity: Vec, pub heatmap: ContributionHeatmapResponse, pub follower_count: u64, pub following_count: u64, pub stars_count: u64, } impl AppService { pub async fn user_get_summary( &self, context: Session, username: String, ) -> Result { let info = self.user_info(context.clone(), username.clone()).await?; let repos_resp = self.get_user_repos(context.clone(), username.clone(), UserReposQuery { page: Some(1), per_page: Some(4) }).await?; let projects_resp = self.get_user_projects(context.clone(), username.clone(), UserProjectsQuery { page: Some(1), per_page: Some(4) }).await?; let activity_resp = self.get_user_activity(context.clone(), username.clone(), UserActivityQuery { page: Some(1), per_page: Some(8) }).await?; let heatmap = self.get_user_contribution_heatmap(context.clone(), username.clone(), ContributionHeatmapQuery { start_date: None, end_date: None }).await?; let follower_count = self.user_get_subscriber_count(context.clone(), username.clone()).await?; let following_count = self.user_get_subscription_count(context.clone(), username.clone()).await?; let stars_resp = self.get_user_stars(context.clone(), username.clone()).await?; let stars_count = stars_resp.total; Ok(UserSummaryResponse { info, repos: repos_resp.repos, projects: projects_resp.projects, activity: activity_resp.items, heatmap, follower_count, following_count, stars_count, }) } }