diff --git a/models/organization/org_profile.go b/models/organization/org_profile.go index 4667a4af8c..2bfc65b699 100644 --- a/models/organization/org_profile.go +++ b/models/organization/org_profile.go @@ -144,10 +144,10 @@ func GetMemberPublicVisibility(ctx context.Context, orgID, userID int64) (bool, // OrgOverviewStats represents statistics for the organization overview type OrgOverviewStats struct { - MemberCount int64 - RepoCount int64 - PublicRepoCount int64 - TeamCount int64 + TotalRepos int64 + TotalMembers int64 + TotalTeams int64 + TotalStars int64 } // GetOrgMemberAndTeamCounts returns member and team counts for an organization diff --git a/models/repo/repo.go b/models/repo/repo.go index 605a9e0f3f..3b70a9c9d3 100644 --- a/models/repo/repo.go +++ b/models/repo/repo.go @@ -968,6 +968,17 @@ func CountNullArchivedRepository(ctx context.Context) (int64, error) { return db.GetEngine(ctx).Where(builder.IsNull{"is_archived"}).Count(new(Repository)) } +// CountOrgRepoStars returns the total number of stars across all repos owned by an organization +func CountOrgRepoStars(ctx context.Context, orgID int64) (int64, error) { + var total int64 + _, err := db.GetEngine(ctx). + Table("repository"). + Where("owner_id = ?", orgID). + Select("COALESCE(SUM(num_stars), 0)"). + Get(&total) + return total, err +} + // FixNullArchivedRepository sets is_archived to false where it is null func FixNullArchivedRepository(ctx context.Context) (int64, error) { return db.GetEngine(ctx).Where(builder.IsNull{"is_archived"}).Cols("is_archived").NoAutoTime().Update(&Repository{ diff --git a/modules/structs/org.go b/modules/structs/org.go index 2aa9199d55..6f695e28e2 100644 --- a/modules/structs/org.go +++ b/modules/structs/org.go @@ -179,10 +179,10 @@ type OrgOverview struct { // OrgOverviewStats represents organization statistics type OrgOverviewStats struct { - MemberCount int64 `json:"member_count"` - RepoCount int64 `json:"repo_count"` - PublicRepoCount int64 `json:"public_repo_count"` - TeamCount int64 `json:"team_count"` + TotalRepos int64 `json:"total_repos"` + TotalMembers int64 `json:"total_members"` + TotalTeams int64 `json:"total_teams"` + TotalStars int64 `json:"total_stars"` } // OrgProfileContent represents the organization profile content diff --git a/routers/api/v1/org/profile.go b/routers/api/v1/org/profile.go index e2a0c4d911..fccf1a4014 100644 --- a/routers/api/v1/org/profile.go +++ b/routers/api/v1/org/profile.go @@ -92,10 +92,10 @@ func GetOverview(ctx *context.APIContext) { PublicMembers: apiPublicMembers, TotalMembers: totalMembers, Stats: &api.OrgOverviewStats{ - MemberCount: stats.MemberCount, - RepoCount: stats.RepoCount, - PublicRepoCount: stats.PublicRepoCount, - TeamCount: stats.TeamCount, + TotalRepos: stats.TotalRepos, + TotalMembers: stats.TotalMembers, + TotalTeams: stats.TotalTeams, + TotalStars: stats.TotalStars, }, } diff --git a/services/org/pinned.go b/services/org/pinned.go index a288c79c23..e82cfa17f1 100644 --- a/services/org/pinned.go +++ b/services/org/pinned.go @@ -8,7 +8,6 @@ import ( "code.gitea.io/gitea/models/organization" repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/optional" ) // GetOrgPinnedReposWithDetails returns all pinned repos with repo and group details loaded @@ -54,23 +53,22 @@ func GetOrgOverviewStats(ctx context.Context, orgID int64) (*organization.OrgOve if err != nil { return nil, err } - stats.MemberCount = memberCount - stats.TeamCount = teamCount + stats.TotalMembers = memberCount + stats.TotalTeams = teamCount - // Repo counts - stats.RepoCount, err = repo_model.CountRepositories(ctx, repo_model.CountRepositoryOptions{ + // Repo count + stats.TotalRepos, err = repo_model.CountRepositories(ctx, repo_model.CountRepositoryOptions{ OwnerID: orgID, }) if err != nil { return nil, err } - stats.PublicRepoCount, err = repo_model.CountRepositories(ctx, repo_model.CountRepositoryOptions{ - OwnerID: orgID, - Private: optional.Some(false), - }) + // Total stars across all repos + stats.TotalStars, err = repo_model.CountOrgRepoStars(ctx, orgID) if err != nil { - return nil, err + // Non-fatal, just log and continue + stats.TotalStars = 0 } return stats, nil