From d494cc335633ff838eaea547438b95e753aeec0f Mon Sep 17 00:00:00 2001
From: zeripath <art27@cantab.net>
Date: Mon, 16 May 2022 08:36:57 +0100
Subject: [PATCH] Fix nodeinfo caching and prevent NPE if cache non-existent
 (#19721)

Extract from #19703

Signed-off-by: Andrew Thornton <art27@cantab.net>
---
 routers/api/v1/misc/nodeinfo.go | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/routers/api/v1/misc/nodeinfo.go b/routers/api/v1/misc/nodeinfo.go
index ce1f9ec0f76..c786544e145 100644
--- a/routers/api/v1/misc/nodeinfo.go
+++ b/routers/api/v1/misc/nodeinfo.go
@@ -30,8 +30,11 @@ func NodeInfo(ctx *context.APIContext) {
 
 	nodeInfoUsage := structs.NodeInfoUsage{}
 	if setting.Federation.ShareUserStatistics {
-		info, ok := ctx.Cache.Get(cacheKeyNodeInfoUsage).(structs.NodeInfoUsage)
-		if !ok {
+		cached := false
+		if setting.CacheService.Enabled {
+			nodeInfoUsage, cached = ctx.Cache.Get(cacheKeyNodeInfoUsage).(structs.NodeInfoUsage)
+		}
+		if !cached {
 			usersTotal := int(user_model.CountUsers(nil))
 			now := time.Now()
 			timeOneMonthAgo := now.AddDate(0, -1, 0).Unix()
@@ -42,7 +45,7 @@ func NodeInfo(ctx *context.APIContext) {
 			allIssues, _ := models.CountIssues(&models.IssuesOptions{})
 			allComments, _ := models.CountComments(&models.FindCommentsOptions{})
 
-			info = structs.NodeInfoUsage{
+			nodeInfoUsage = structs.NodeInfoUsage{
 				Users: structs.NodeInfoUsageUsers{
 					Total:          usersTotal,
 					ActiveMonth:    usersActiveMonth,
@@ -51,12 +54,13 @@ func NodeInfo(ctx *context.APIContext) {
 				LocalPosts:    int(allIssues),
 				LocalComments: int(allComments),
 			}
-			if err := ctx.Cache.Put(cacheKeyNodeInfoUsage, nodeInfoUsage, 180); err != nil {
-				ctx.InternalServerError(err)
-				return
+			if setting.CacheService.Enabled {
+				if err := ctx.Cache.Put(cacheKeyNodeInfoUsage, nodeInfoUsage, 180); err != nil {
+					ctx.InternalServerError(err)
+					return
+				}
 			}
 		}
-		nodeInfoUsage = info
 	}
 
 	nodeInfo := &structs.NodeInfo{