gitdataai/libs/service/user/summary.rs

100 lines
2.9 KiB
Rust

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<UserRepoInfo>,
pub projects: Vec<UserProjectInfo>,
pub activity: Vec<UserActivityItem>,
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<UserSummaryResponse, AppError> {
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,
})
}
}