use super::chpc::{ContributionHeatmapQuery, ContributionHeatmapResponse}; use super::projects::{UserProjectInfo, UserProjectsQuery}; use super::repository::{UserRepoInfo, UserReposQuery}; use super::user_activity::{UserActivityItem, UserActivityQuery}; use super::user_info::UserInfoExternal; use crate::AppService; use crate::error::AppError; use serde::{Deserialize, Serialize}; use session::Session; use utoipa::ToSchema; #[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, }) } }