2021-09-19 19:49:59 +08:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2021-09-19 19:49:59 +08:00
2022-08-25 10:31:57 +08:00
package activities
2021-09-19 19:49:59 +08:00
2021-09-24 19:32:56 +08:00
import (
2023-09-14 19:09:32 +02:00
"context"
2021-12-10 16:14:24 +08:00
asymkey_model "code.gitea.io/gitea/models/asymkey"
2022-01-02 21:12:35 +08:00
"code.gitea.io/gitea/models/auth"
2021-09-24 19:32:56 +08:00
"code.gitea.io/gitea/models/db"
2024-03-12 19:21:09 +08:00
git_model "code.gitea.io/gitea/models/git"
2022-04-08 17:11:15 +08:00
issues_model "code.gitea.io/gitea/models/issues"
2022-03-29 14:29:02 +08:00
"code.gitea.io/gitea/models/organization"
2022-05-11 18:09:36 +08:00
access_model "code.gitea.io/gitea/models/perm/access"
2022-03-29 22:16:31 +08:00
project_model "code.gitea.io/gitea/models/project"
2021-11-19 21:39:57 +08:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-17 17:58:31 +08:00
user_model "code.gitea.io/gitea/models/user"
2021-11-10 13:13:16 +08:00
"code.gitea.io/gitea/models/webhook"
2021-10-04 00:46:44 +02:00
"code.gitea.io/gitea/modules/setting"
2021-09-24 19:32:56 +08:00
)
2021-09-19 19:49:59 +08:00
// Statistic contains the database statistics
type Statistic struct {
Counter struct {
User , Org , PublicKey ,
2023-06-03 22:03:41 +08:00
Repo , Watch , Star , Access ,
2021-09-19 19:49:59 +08:00
Issue , IssueClosed , IssueOpen ,
Comment , Oauth , Follow ,
2022-01-02 21:12:35 +08:00
Mirror , Release , AuthSource , Webhook ,
2021-09-19 19:49:59 +08:00
Milestone , Label , HookTask ,
2021-10-02 03:32:15 +02:00
Team , UpdateTask , Project ,
2024-05-27 16:59:54 +08:00
ProjectColumn , Attachment ,
2024-03-12 19:21:09 +08:00
Branches , Tags , CommitStatus int64
2021-10-05 20:39:37 +02:00
IssueByLabel [ ] IssueByLabelCount
IssueByRepository [ ] IssueByRepositoryCount
2021-09-19 19:49:59 +08:00
}
}
2021-10-04 00:46:44 +02:00
// IssueByLabelCount contains the number of issue group by label
type IssueByLabelCount struct {
Count int64
Label string
}
2021-10-05 20:39:37 +02:00
// IssueByRepositoryCount contains the number of issue group by repository
type IssueByRepositoryCount struct {
Count int64
OwnerName string
Repository string
}
2021-09-19 19:49:59 +08:00
// GetStatistic returns the database statistics
2023-09-14 19:09:32 +02:00
func GetStatistic ( ctx context . Context ) ( stats Statistic ) {
e := db . GetEngine ( ctx )
stats . Counter . User = user_model . CountUsers ( ctx , nil )
2023-11-24 11:49:41 +08:00
stats . Counter . Org , _ = db . Count [ organization . Organization ] ( ctx , organization . FindOrgOptions { IncludePrivate : true } )
2021-12-10 16:14:24 +08:00
stats . Counter . PublicKey , _ = e . Count ( new ( asymkey_model . PublicKey ) )
2023-09-14 19:09:32 +02:00
stats . Counter . Repo , _ = repo_model . CountRepositories ( ctx , repo_model . CountRepositoryOptions { } )
2021-12-12 23:48:20 +08:00
stats . Counter . Watch , _ = e . Count ( new ( repo_model . Watch ) )
stats . Counter . Star , _ = e . Count ( new ( repo_model . Star ) )
2022-05-11 18:09:36 +08:00
stats . Counter . Access , _ = e . Count ( new ( access_model . Access ) )
2024-03-12 19:21:09 +08:00
stats . Counter . Branches , _ = e . Count ( new ( git_model . Branch ) )
stats . Counter . Tags , _ = e . Where ( "is_draft=?" , false ) . Count ( new ( repo_model . Release ) )
stats . Counter . CommitStatus , _ = e . Count ( new ( git_model . CommitStatus ) )
2021-09-19 19:49:59 +08:00
type IssueCount struct {
Count int64
IsClosed bool
}
2021-10-04 00:46:44 +02:00
if setting . Metrics . EnabledIssueByLabel {
stats . Counter . IssueByLabel = [ ] IssueByLabelCount { }
_ = e . Select ( "COUNT(*) AS count, l.name AS label" ) .
Join ( "LEFT" , "label l" , "l.id=il.label_id" ) .
Table ( "issue_label il" ) .
GroupBy ( "l.name" ) .
Find ( & stats . Counter . IssueByLabel )
}
2021-10-05 20:39:37 +02:00
if setting . Metrics . EnabledIssueByRepository {
stats . Counter . IssueByRepository = [ ] IssueByRepositoryCount { }
_ = e . Select ( "COUNT(*) AS count, r.owner_name, r.name AS repository" ) .
Join ( "LEFT" , "repository r" , "r.id=i.repo_id" ) .
Table ( "issue i" ) .
GroupBy ( "r.owner_name, r.name" ) .
Find ( & stats . Counter . IssueByRepository )
}
2023-06-03 22:03:41 +08:00
var issueCounts [ ] IssueCount
2021-09-19 19:49:59 +08:00
2021-10-02 03:32:15 +02:00
_ = e . Select ( "COUNT(*) AS count, is_closed" ) . Table ( "issue" ) . GroupBy ( "is_closed" ) . Find ( & issueCounts )
2021-09-19 19:49:59 +08:00
for _ , c := range issueCounts {
if c . IsClosed {
stats . Counter . IssueClosed = c . Count
} else {
stats . Counter . IssueOpen = c . Count
}
}
stats . Counter . Issue = stats . Counter . IssueClosed + stats . Counter . IssueOpen
2022-06-13 17:37:59 +08:00
stats . Counter . Comment , _ = e . Count ( new ( issues_model . Comment ) )
2021-09-19 19:49:59 +08:00
stats . Counter . Oauth = 0
2021-11-17 17:58:31 +08:00
stats . Counter . Follow , _ = e . Count ( new ( user_model . Follow ) )
2021-12-10 09:27:50 +08:00
stats . Counter . Mirror , _ = e . Count ( new ( repo_model . Mirror ) )
2022-08-25 10:31:57 +08:00
stats . Counter . Release , _ = e . Count ( new ( repo_model . Release ) )
2023-11-24 11:49:41 +08:00
stats . Counter . AuthSource , _ = db . Count [ auth . Source ] ( ctx , auth . FindSourcesOptions { } )
2021-11-10 13:13:16 +08:00
stats . Counter . Webhook , _ = e . Count ( new ( webhook . Webhook ) )
2022-04-08 17:11:15 +08:00
stats . Counter . Milestone , _ = e . Count ( new ( issues_model . Milestone ) )
2022-06-13 17:37:59 +08:00
stats . Counter . Label , _ = e . Count ( new ( issues_model . Label ) )
2021-11-10 13:13:16 +08:00
stats . Counter . HookTask , _ = e . Count ( new ( webhook . HookTask ) )
2022-03-29 14:29:02 +08:00
stats . Counter . Team , _ = e . Count ( new ( organization . Team ) )
2021-11-19 21:39:57 +08:00
stats . Counter . Attachment , _ = e . Count ( new ( repo_model . Attachment ) )
2022-03-29 22:16:31 +08:00
stats . Counter . Project , _ = e . Count ( new ( project_model . Project ) )
2024-05-27 16:59:54 +08:00
stats . Counter . ProjectColumn , _ = e . Count ( new ( project_model . Column ) )
2022-06-20 12:02:49 +02:00
return stats
2021-09-19 19:49:59 +08:00
}