diff options
Diffstat (limited to 'models/forgefed/repository.go')
-rw-r--r-- | models/forgefed/repository.go | 71 |
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) + }) +} |