summaryrefslogtreecommitdiff
path: root/internal/api
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2025-02-04 16:52:42 +0100
committerLibravatar GitHub <noreply@github.com>2025-02-04 16:52:42 +0100
commit07d27709957248008c61d6b8d553e3d2eb14d154 (patch)
treed054e92729708e275886100492a458d633fbaa59 /internal/api
parentadds support for build specifically without wasm ffmpeg (#3732) (diff)
downloadgotosocial-07d27709957248008c61d6b8d553e3d2eb14d154.tar.xz
[feature] Change `instance-stats-randomize` to `instance-stats-mode` with multiple options; implement nodeinfo 2.1 (#3734)
* [feature] Change `instance-stats-randomize` to `instance-stats-mode` with multiple options; implement nodeinfo 2.1 * swaggalaggadingdong
Diffstat (limited to 'internal/api')
-rw-r--r--internal/api/client/instance/instanceget.go25
-rw-r--r--internal/api/model/well-known.go15
-rw-r--r--internal/api/nodeinfo.go4
-rw-r--r--internal/api/nodeinfo/nodeinfo.go11
-rw-r--r--internal/api/nodeinfo/nodeinfoget.go32
5 files changed, 73 insertions, 14 deletions
diff --git a/internal/api/client/instance/instanceget.go b/internal/api/client/instance/instanceget.go
index d7a688b43..3ca69d93b 100644
--- a/internal/api/client/instance/instanceget.go
+++ b/internal/api/client/instance/instanceget.go
@@ -60,10 +60,21 @@ func (m *Module) InstanceInformationGETHandlerV1(c *gin.Context) {
return
}
- if config.GetInstanceStatsRandomize() {
+ switch config.GetInstanceStatsMode() {
+
+ case config.InstanceStatsModeBaffle:
// Replace actual stats with cached randomized ones.
instance.Stats["user_count"] = util.Ptr(int(instance.RandomStats.TotalUsers))
instance.Stats["status_count"] = util.Ptr(int(instance.RandomStats.Statuses))
+
+ case config.InstanceStatsModeZero:
+ // Replace actual stats with zero.
+ instance.Stats["user_count"] = new(int)
+ instance.Stats["status_count"] = new(int)
+
+ default:
+ // serve or default.
+ // Leave stats alone.
}
apiutil.JSON(c, http.StatusOK, instance)
@@ -101,9 +112,19 @@ func (m *Module) InstanceInformationGETHandlerV2(c *gin.Context) {
return
}
- if config.GetInstanceStatsRandomize() {
+ switch config.GetInstanceStatsMode() {
+
+ case config.InstanceStatsModeBaffle:
// Replace actual stats with cached randomized ones.
instance.Usage.Users.ActiveMonth = int(instance.RandomStats.MonthlyActiveUsers)
+
+ case config.InstanceStatsModeZero:
+ // Replace actual stats with zero.
+ instance.Usage.Users.ActiveMonth = 0
+
+ default:
+ // serve or default.
+ // Leave stats alone.
}
apiutil.JSON(c, http.StatusOK, instance)
diff --git a/internal/api/model/well-known.go b/internal/api/model/well-known.go
index 54d9912c8..d9948f951 100644
--- a/internal/api/model/well-known.go
+++ b/internal/api/model/well-known.go
@@ -70,6 +70,12 @@ type NodeInfoSoftware struct {
Name string `json:"name"`
// example: 0.1.2 1234567
Version string `json:"version"`
+ // Repository for the software. Omitted in version 2.0.
+ // example: https://codeberg.org/superseriousbusiness/gotosocial
+ Repository string `json:"repository,omitempty"`
+ // Homepage for the software. Omitted in version 2.0.
+ // example: https://docs.gotosocial.org
+ Homepage string `json:"homepage,omitempty"`
}
// NodeInfoServices represents inbound and outbound services that this node offers connections to.
@@ -80,13 +86,16 @@ type NodeInfoServices struct {
// NodeInfoUsage represents usage information about this server, such as number of users.
type NodeInfoUsage struct {
- Users NodeInfoUsers `json:"users"`
- LocalPosts int `json:"localPosts"`
+ Users NodeInfoUsers `json:"users"`
+ LocalPosts int `json:"localPosts,omitempty"`
+ LocalComments int `json:"localComments,omitempty"`
}
// NodeInfoUsers represents aggregate information about the users on the server.
type NodeInfoUsers struct {
- Total int `json:"total"`
+ Total int `json:"total"`
+ ActiveHalfYear int `json:"activeHalfYear,omitempty"`
+ ActiveMonth int `json:"activeMonth,omitempty"`
}
// HostMeta represents a hostmeta document.
diff --git a/internal/api/nodeinfo.go b/internal/api/nodeinfo.go
index fb7918edc..29942aba4 100644
--- a/internal/api/nodeinfo.go
+++ b/internal/api/nodeinfo.go
@@ -36,9 +36,9 @@ func (w *NodeInfo) Route(r *router.Router, m ...gin.HandlerFunc) {
// attach middlewares appropriate for this group
nodeInfoGroup.Use(m...)
nodeInfoGroup.Use(
- // Allow public cache for 2 minutes.
+ // Allow public cache for 24 hours.
middleware.CacheControl(middleware.CacheControlConfig{
- Directives: []string{"public", "max-age=120"},
+ Directives: []string{"public", "max-age=86400"},
Vary: []string{"Accept-Encoding"},
}),
)
diff --git a/internal/api/nodeinfo/nodeinfo.go b/internal/api/nodeinfo/nodeinfo.go
index bf334b5e2..96adbc956 100644
--- a/internal/api/nodeinfo/nodeinfo.go
+++ b/internal/api/nodeinfo/nodeinfo.go
@@ -25,9 +25,12 @@ import (
)
const (
- NodeInfo2Version = "2.0"
- NodeInfo2Path = "/" + NodeInfo2Version
- NodeInfo2ContentType = "application/json; profile=\"http://nodeinfo.diaspora.software/ns/schema/" + NodeInfo2Version + "#\""
+ NodeInfo20 = "2.0"
+ NodeInfo20ContentType = "application/json; profile=\"http://nodeinfo.diaspora.software/ns/schema/" + NodeInfo20 + "#\""
+ NodeInfo21 = "2.1"
+ NodeInfo21ContentType = "application/json; profile=\"http://nodeinfo.diaspora.software/ns/schema/" + NodeInfo21 + "#\""
+ NodeInfoSchema = "schema"
+ NodeInfoPath = "/:" + NodeInfoSchema
)
type Module struct {
@@ -41,5 +44,5 @@ func New(processor *processing.Processor) *Module {
}
func (m *Module) Route(attachHandler func(method string, path string, f ...gin.HandlerFunc) gin.IRoutes) {
- attachHandler(http.MethodGet, NodeInfo2Path, m.NodeInfo2GETHandler)
+ attachHandler(http.MethodGet, NodeInfoPath, m.NodeInfo2GETHandler)
}
diff --git a/internal/api/nodeinfo/nodeinfoget.go b/internal/api/nodeinfo/nodeinfoget.go
index 368a5503d..28a60cff9 100644
--- a/internal/api/nodeinfo/nodeinfoget.go
+++ b/internal/api/nodeinfo/nodeinfoget.go
@@ -18,6 +18,7 @@
package nodeinfo
import (
+ "errors"
"net/http"
"github.com/gin-gonic/gin"
@@ -25,7 +26,7 @@ import (
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
)
-// NodeInfo2GETHandler swagger:operation GET /nodeinfo/2.0 nodeInfoGet
+// NodeInfo2GETHandler swagger:operation GET /nodeinfo/{schema_version} nodeInfoGet
//
// Returns a compliant nodeinfo response to node info queries.
//
@@ -35,8 +36,17 @@ import (
// tags:
// - nodeinfo
//
+// parameters:
+// -
+// name: schema_version
+// type: string
+// description: Schema version of nodeinfo to request. 2.0 and 2.1 are currently supported.
+// in: path
+// required: true
+//
// produces:
// - application/json; profile="http://nodeinfo.diaspora.software/ns/schema/2.0#"
+// - application/json; profile="http://nodeinfo.diaspora.software/ns/schema/2.1#"
//
// responses:
// '200':
@@ -48,7 +58,23 @@ func (m *Module) NodeInfo2GETHandler(c *gin.Context) {
return
}
- nodeInfo, errWithCode := m.processor.Fedi().NodeInfoGet(c.Request.Context())
+ var (
+ contentType string
+ schemaVersion = c.Param(NodeInfoSchema)
+ )
+
+ switch schemaVersion {
+ case NodeInfo20:
+ contentType = NodeInfo20ContentType
+ case NodeInfo21:
+ contentType = NodeInfo21ContentType
+ default:
+ const errText = "only nodeinfo 2.0 and 2.1 are supported"
+ apiutil.ErrorHandler(c, gtserror.NewErrorNotFound(errors.New(errText), errText), m.processor.InstanceGetV1)
+ return
+ }
+
+ nodeInfo, errWithCode := m.processor.Fedi().NodeInfoGet(c.Request.Context(), schemaVersion)
if errWithCode != nil {
apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1)
return
@@ -59,7 +85,7 @@ func (m *Module) NodeInfo2GETHandler(c *gin.Context) {
c.Writer,
c.Request,
http.StatusOK,
- NodeInfo2ContentType,
+ contentType,
nodeInfo,
)
}