diff options
author | 6543 <6543@obermui.de> | 2022-05-02 15:35:45 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-02 21:35:45 +0800 |
commit | e2a3f3d259d230b7d1f62138e789ccdfd8f43b73 (patch) | |
tree | bfb79a507a767f82f0ecf695eea66c2777d2f09d /routers/api | |
parent | 509d8112432bd90f070e35e03f4cf78a416914fc (diff) | |
download | gitea-e2a3f3d259d230b7d1f62138e789ccdfd8f43b73.tar.gz gitea-e2a3f3d259d230b7d1f62138e789ccdfd8f43b73.zip |
Federation: return useful statistic information for nodeinfo (#19561)
Add statistic information for total user count, active user count, issue count and comment count for `/nodeinfo`
Diffstat (limited to 'routers/api')
-rw-r--r-- | routers/api/v1/misc/nodeinfo.go | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/routers/api/v1/misc/nodeinfo.go b/routers/api/v1/misc/nodeinfo.go index bc36fa1be1..ce1f9ec0f7 100644 --- a/routers/api/v1/misc/nodeinfo.go +++ b/routers/api/v1/misc/nodeinfo.go @@ -6,12 +6,17 @@ package misc import ( "net/http" + "time" + "code.gitea.io/gitea/models" + user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/structs" ) +const cacheKeyNodeInfoUsage = "API_NodeInfoUsage" + // NodeInfo returns the NodeInfo for the Gitea instance to allow for federation func NodeInfo(ctx *context.APIContext) { // swagger:operation GET /nodeinfo miscellaneous getNodeInfo @@ -23,6 +28,37 @@ func NodeInfo(ctx *context.APIContext) { // "200": // "$ref": "#/responses/NodeInfo" + nodeInfoUsage := structs.NodeInfoUsage{} + if setting.Federation.ShareUserStatistics { + info, ok := ctx.Cache.Get(cacheKeyNodeInfoUsage).(structs.NodeInfoUsage) + if !ok { + usersTotal := int(user_model.CountUsers(nil)) + now := time.Now() + timeOneMonthAgo := now.AddDate(0, -1, 0).Unix() + timeHaveYearAgo := now.AddDate(0, -6, 0).Unix() + usersActiveMonth := int(user_model.CountUsers(&user_model.CountUserFilter{LastLoginSince: &timeOneMonthAgo})) + usersActiveHalfyear := int(user_model.CountUsers(&user_model.CountUserFilter{LastLoginSince: &timeHaveYearAgo})) + + allIssues, _ := models.CountIssues(&models.IssuesOptions{}) + allComments, _ := models.CountComments(&models.FindCommentsOptions{}) + + info = structs.NodeInfoUsage{ + Users: structs.NodeInfoUsageUsers{ + Total: usersTotal, + ActiveMonth: usersActiveMonth, + ActiveHalfyear: usersActiveHalfyear, + }, + LocalPosts: int(allIssues), + LocalComments: int(allComments), + } + if err := ctx.Cache.Put(cacheKeyNodeInfoUsage, nodeInfoUsage, 180); err != nil { + ctx.InternalServerError(err) + return + } + } + nodeInfoUsage = info + } + nodeInfo := &structs.NodeInfo{ Version: "2.1", Software: structs.NodeInfoSoftware{ @@ -34,12 +70,10 @@ func NodeInfo(ctx *context.APIContext) { Protocols: []string{"activitypub"}, Services: structs.NodeInfoServices{ Inbound: []string{}, - Outbound: []string{}, + Outbound: []string{"rss2.0"}, }, OpenRegistrations: setting.Service.ShowRegistrationButton, - Usage: structs.NodeInfoUsage{ - Users: structs.NodeInfoUsageUsers{}, - }, + Usage: nodeInfoUsage, } ctx.JSON(http.StatusOK, nodeInfo) } |