Some checks failed
CI / Run lints and checks (push) Failing after 47s
CI / Run tests (push) Failing after 1s
CI / Run race tests (push) Failing after 5s
CI / Build CLI docs (push) Has been skipped
CI / Run buf actions (push) Failing after 5s
CodeQL / Analyze (go) (push) Failing after 3s
CodeQL / Analyze (javascript) (push) Failing after 2s
Docker Image Scanners / scanners (push) Failing after 3s
Format / format (push) Failing after 3s
Synchronize Issue Labels / Synchronize Issue Labels (push) Has been skipped
CI / Generate release (push) Has been skipped
CI / Draft newsletter (push) Has been skipped
CI / Pending approval Slack notification (push) Has been skipped
CI / Send newsletter (push) Has been skipped
115 lines
2.3 KiB
Go
115 lines
2.3 KiB
Go
// Copyright © 2023 Ory Corp
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package relationtuple
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
rts "github.com/ory/keto/gen/go/ory/keto/relation_tuples/v1alpha2"
|
|
"github.com/ory/keto/ketoapi"
|
|
)
|
|
|
|
type (
|
|
Collection struct {
|
|
apiRelations []*ketoapi.RelationTuple
|
|
}
|
|
OutputTuple struct {
|
|
*ketoapi.RelationTuple
|
|
}
|
|
)
|
|
|
|
func NewProtoCollection(rels []*rts.RelationTuple) (*Collection, error) {
|
|
r := &Collection{apiRelations: make([]*ketoapi.RelationTuple, len(rels))}
|
|
for i, rel := range rels {
|
|
var err error
|
|
r.apiRelations[i], err = (&ketoapi.RelationTuple{}).FromDataProvider(rel)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
return r, nil
|
|
}
|
|
|
|
func MustNewProtoCollection(rels []*rts.RelationTuple) *Collection {
|
|
c, err := NewProtoCollection(rels)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return c
|
|
}
|
|
|
|
func NewAPICollection(rels []*ketoapi.RelationTuple) *Collection {
|
|
return &Collection{apiRelations: rels}
|
|
}
|
|
|
|
func (r *Collection) Header() []string {
|
|
return []string{
|
|
"NAMESPACE",
|
|
"OBJECT",
|
|
"RELATION NAME",
|
|
"SUBJECT",
|
|
}
|
|
}
|
|
|
|
func (r *Collection) Table() [][]string {
|
|
ir := r.apiRelations
|
|
|
|
data := make([][]string, len(ir))
|
|
for i, rel := range ir {
|
|
var sub string
|
|
if rel.SubjectID != nil {
|
|
sub = *rel.SubjectID
|
|
} else {
|
|
sub = rel.SubjectSet.String()
|
|
}
|
|
|
|
data[i] = []string{rel.Namespace, rel.Object, rel.Relation, sub}
|
|
}
|
|
|
|
return data
|
|
}
|
|
|
|
func (r *Collection) Interface() any { return r.apiRelations }
|
|
func (r *Collection) UnmarshalJSON(raw []byte) error { return json.Unmarshal(raw, &r.apiRelations) }
|
|
func (r *Collection) Len() int { return len(r.apiRelations) }
|
|
|
|
func (r *Collection) MarshalJSON() ([]byte, error) {
|
|
ir := r.apiRelations
|
|
return json.Marshal(ir)
|
|
}
|
|
|
|
func (r *Collection) IDs() []string {
|
|
ts := r.apiRelations
|
|
ids := make([]string, len(ts))
|
|
for i, rt := range ts {
|
|
ids[i] = rt.String()
|
|
}
|
|
return ids
|
|
}
|
|
|
|
func (r *OutputTuple) Header() []string {
|
|
return []string{
|
|
"NAMESPACE",
|
|
"OBJECT ID",
|
|
"RELATION NAME",
|
|
"SUBJECT",
|
|
}
|
|
}
|
|
|
|
func (r *OutputTuple) Columns() []string {
|
|
return []string{
|
|
r.Namespace,
|
|
r.Object,
|
|
r.Relation,
|
|
outputSubject(r.RelationTuple),
|
|
}
|
|
}
|
|
|
|
func outputSubject(r *ketoapi.RelationTuple) string {
|
|
if r.SubjectID != nil {
|
|
return *r.SubjectID
|
|
}
|
|
return r.SubjectSet.String()
|
|
}
|