summaryrefslogtreecommitdiffstats
path: root/models/forgefed/nodeinfo.go
diff options
context:
space:
mode:
Diffstat (limited to 'models/forgefed/nodeinfo.go')
-rw-r--r--models/forgefed/nodeinfo.go123
1 files changed, 123 insertions, 0 deletions
diff --git a/models/forgefed/nodeinfo.go b/models/forgefed/nodeinfo.go
new file mode 100644
index 0000000..66d2eca
--- /dev/null
+++ b/models/forgefed/nodeinfo.go
@@ -0,0 +1,123 @@
+// Copyright 2023 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package forgefed
+
+import (
+ "net/url"
+
+ "code.gitea.io/gitea/modules/validation"
+
+ "github.com/valyala/fastjson"
+)
+
+// ToDo: Search for full text SourceType and Source, also in .md files
+type (
+ SoftwareNameType string
+)
+
+const (
+ ForgejoSourceType SoftwareNameType = "forgejo"
+ GiteaSourceType SoftwareNameType = "gitea"
+)
+
+var KnownSourceTypes = []any{
+ ForgejoSourceType, GiteaSourceType,
+}
+
+// ------------------------------------------------ NodeInfoWellKnown ------------------------------------------------
+
+// NodeInfo data type
+// swagger:model
+type NodeInfoWellKnown struct {
+ Href string
+}
+
+// Factory function for NodeInfoWellKnown. Created struct is asserted to be valid.
+func NewNodeInfoWellKnown(body []byte) (NodeInfoWellKnown, error) {
+ result, err := NodeInfoWellKnownUnmarshalJSON(body)
+ if err != nil {
+ return NodeInfoWellKnown{}, err
+ }
+
+ if valid, err := validation.IsValid(result); !valid {
+ return NodeInfoWellKnown{}, err
+ }
+
+ return result, nil
+}
+
+func NodeInfoWellKnownUnmarshalJSON(data []byte) (NodeInfoWellKnown, error) {
+ p := fastjson.Parser{}
+ val, err := p.ParseBytes(data)
+ if err != nil {
+ return NodeInfoWellKnown{}, err
+ }
+ href := string(val.GetStringBytes("links", "0", "href"))
+ return NodeInfoWellKnown{Href: href}, nil
+}
+
+// Validate collects error strings in a slice and returns this
+func (node NodeInfoWellKnown) Validate() []string {
+ var result []string
+ result = append(result, validation.ValidateNotEmpty(node.Href, "Href")...)
+
+ parsedURL, err := url.Parse(node.Href)
+ if err != nil {
+ result = append(result, err.Error())
+ return result
+ }
+
+ if parsedURL.Host == "" {
+ result = append(result, "Href has to be absolute")
+ }
+
+ result = append(result, validation.ValidateOneOf(parsedURL.Scheme, []any{"http", "https"}, "parsedURL.Scheme")...)
+
+ if parsedURL.RawQuery != "" {
+ result = append(result, "Href may not contain query")
+ }
+
+ return result
+}
+
+// ------------------------------------------------ NodeInfo ------------------------------------------------
+
+// NodeInfo data type
+// swagger:model
+type NodeInfo struct {
+ SoftwareName SoftwareNameType
+}
+
+func NodeInfoUnmarshalJSON(data []byte) (NodeInfo, error) {
+ p := fastjson.Parser{}
+ val, err := p.ParseBytes(data)
+ if err != nil {
+ return NodeInfo{}, err
+ }
+ source := string(val.GetStringBytes("software", "name"))
+ result := NodeInfo{}
+ result.SoftwareName = SoftwareNameType(source)
+ return result, nil
+}
+
+func NewNodeInfo(body []byte) (NodeInfo, error) {
+ result, err := NodeInfoUnmarshalJSON(body)
+ if err != nil {
+ return NodeInfo{}, err
+ }
+
+ if valid, err := validation.IsValid(result); !valid {
+ return NodeInfo{}, err
+ }
+ return result, nil
+}
+
+// Validate collects error strings in a slice and returns this
+func (node NodeInfo) Validate() []string {
+ var result []string
+ result = append(result, validation.ValidateNotEmpty(string(node.SoftwareName), "node.SoftwareName")...)
+ result = append(result, validation.ValidateOneOf(node.SoftwareName, KnownSourceTypes, "node.SoftwareName")...)
+
+ return result
+}