aboutsummaryrefslogtreecommitdiff
path: root/models/forgefed/repository.go
diff options
context:
space:
mode:
Diffstat (limited to 'models/forgefed/repository.go')
-rw-r--r--models/forgefed/repository.go71
1 files changed, 71 insertions, 0 deletions
diff --git a/models/forgefed/repository.go b/models/forgefed/repository.go
new file mode 100644
index 000000000..8c8ae1d31
--- /dev/null
+++ b/models/forgefed/repository.go
@@ -0,0 +1,71 @@
+// Copyright 2022 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package forgefed
+
+import (
+ ap "github.com/go-ap/activitypub"
+ "github.com/valyala/fastjson"
+)
+
+const (
+ RepositoryType ap.ActivityVocabularyType = "Repository"
+)
+
+type Repository struct {
+ ap.Actor
+ // Team Collection of actors who have management/push access to the repository
+ Team ap.Item `jsonld:"team,omitempty"`
+ // Forks OrderedCollection of repositories that are forks of this repository
+ Forks ap.Item `jsonld:"forks,omitempty"`
+}
+
+// GetItemByType instantiates a new Repository object if the type matches
+// otherwise it defaults to existing activitypub package typer function.
+func GetItemByType(typ ap.ActivityVocabularyType) (ap.Item, error) {
+ if typ == RepositoryType {
+ return RepositoryNew(""), nil
+ }
+ return ap.GetItemByType(typ)
+}
+
+// RepositoryNew initializes a Repository type actor
+func RepositoryNew(id ap.ID) *Repository {
+ a := ap.ActorNew(id, RepositoryType)
+ o := Repository{Actor: *a}
+ o.Type = RepositoryType
+ return &o
+}
+
+func (r Repository) MarshalJSON() ([]byte, error) {
+ b, err := r.Actor.MarshalJSON()
+ if len(b) == 0 || err != nil {
+ return make([]byte, 0), err
+ }
+
+ b = b[:len(b)-1]
+ if r.Team != nil {
+ ap.WriteItemJSONProp(&b, "team", r.Team)
+ }
+ if r.Forks != nil {
+ ap.WriteItemJSONProp(&b, "forks", r.Forks)
+ }
+ ap.Write(&b, '}')
+ return b, nil
+}
+
+func (r *Repository) UnmarshalJSON(data []byte) error {
+ p := fastjson.Parser{}
+ val, err := p.ParseBytes(data)
+ if err != nil {
+ return err
+ }
+
+ r.Team = ap.JSONGetItem(val, "team")
+ r.Forks = ap.JSONGetItem(val, "forks")
+
+ return ap.OnActor(&r.Actor, func(a *ap.Actor) error {
+ return ap.LoadActor(val, a)
+ })
+}