summaryrefslogtreecommitdiffstats
path: root/routers/api
diff options
context:
space:
mode:
author6543 <6543@obermui.de>2022-05-02 15:35:45 +0200
committerGitHub <noreply@github.com>2022-05-02 21:35:45 +0800
commite2a3f3d259d230b7d1f62138e789ccdfd8f43b73 (patch)
treebfb79a507a767f82f0ecf695eea66c2777d2f09d /routers/api
parent509d8112432bd90f070e35e03f4cf78a416914fc (diff)
downloadgitea-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.go42
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)
}