summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-07-24 16:59:43 -0600
committermo khan <mo@mokhan.ca>2025-07-24 16:59:43 -0600
commita3496a1114c6958aa1831af5348d7340e29ebf06 (patch)
treee467d6d54a4a16ac0002bad784b7c3a1dd9fe0bd
parent0babaa518db6cbdc17779e9c4846a8a277d098b7 (diff)
refactor: delegate to GlobalID to provide object references
-rw-r--r--app/domain/entity.go17
-rw-r--r--app/domain/entity_test.go17
-rw-r--r--app/domain/identifiable.go3
-rw-r--r--app/domain/permission.go4
-rw-r--r--app/domain/sparkle.go12
-rw-r--r--app/domain/sparkle_test.go5
-rw-r--r--app/domain/user.go14
-rw-r--r--app/init.go9
8 files changed, 21 insertions, 60 deletions
diff --git a/app/domain/entity.go b/app/domain/entity.go
index 4f3e63b..9cce1aa 100644
--- a/app/domain/entity.go
+++ b/app/domain/entity.go
@@ -2,8 +2,6 @@ package domain
import (
"errors"
-
- v1 "github.com/authzed/authzed-go/proto/authzed/api/v1"
)
type Entity interface {
@@ -24,17 +22,10 @@ func (s *entity) SetID(id ID) error {
return nil
}
-func (s *entity) ToGID() string {
- return "gid://sparkle/Entity/" + s.ID.String()
-}
-
-func (self *entity) ToObjectReference() *v1.ObjectReference {
- return &v1.ObjectReference{
- ObjectType: "entity",
- ObjectId: self.ID.String(),
- }
-}
-
func (s *entity) Validate() error {
return errors.New("method Validate not implemented")
}
+
+func (s *entity) ToGID() GlobalID {
+ return GlobalID("gid://sparkle/Entity/" + s.ID.String())
+}
diff --git a/app/domain/entity_test.go b/app/domain/entity_test.go
index 3f4c788..1ac1d26 100644
--- a/app/domain/entity_test.go
+++ b/app/domain/entity_test.go
@@ -5,7 +5,6 @@ import (
"testing"
"github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
"github.com/xlgmokha/x/pkg/x"
)
@@ -30,26 +29,12 @@ func TestEntity(t *testing.T) {
assert.Equal(t, id, example.GetID())
})
-
})
t.Run("ToGID", func(t *testing.T) {
example := x.New[*example](WithULID[*example]())
gid := example.ToGID()
- assert.Equal(t, fmt.Sprintf("gid://sparkle/Entity/%s", example.ID), gid)
- })
-
- t.Run("ToObjectReference", func(t *testing.T) {
- t.Run("returns a valid object reference", func(t *testing.T) {
- example := x.New[*example](WithULID[*example]())
- reference := example.ToObjectReference()
-
- require.NotNil(t, reference)
- require.NoError(t, reference.Validate())
- require.NoError(t, reference.ValidateAll())
- assert.Equal(t, example.ID.String(), reference.GetObjectId())
- assert.Equal(t, "entity", reference.GetObjectType())
- })
+ assert.Equal(t, fmt.Sprintf("gid://sparkle/Entity/%s", example.ID), gid.String())
})
}
diff --git a/app/domain/identifiable.go b/app/domain/identifiable.go
index 3a39cf9..005c98c 100644
--- a/app/domain/identifiable.go
+++ b/app/domain/identifiable.go
@@ -1,7 +1,6 @@
package domain
import (
- v1 "github.com/authzed/authzed-go/proto/authzed/api/v1"
"github.com/xlgmokha/x/pkg/x"
"gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/pkg/pls"
)
@@ -9,7 +8,7 @@ import (
type Identifiable interface {
GetID() ID
SetID(id ID) error
- ToObjectReference() *v1.ObjectReference
+ ToGID() GlobalID
}
func WithID[T Identifiable](id ID) x.Option[T] {
diff --git a/app/domain/permission.go b/app/domain/permission.go
index 53d4754..c7a5ffe 100644
--- a/app/domain/permission.go
+++ b/app/domain/permission.go
@@ -9,10 +9,10 @@ type Permission string
func (p Permission) RequestFor(user Identifiable, resource Identifiable) *v1.CheckPermissionRequest {
return &v1.CheckPermissionRequest{
Subject: &v1.SubjectReference{
- Object: user.ToObjectReference(),
+ Object: user.ToGID().ToObjectReference(),
},
Permission: p.String(),
- Resource: resource.ToObjectReference(),
+ Resource: resource.ToGID().ToObjectReference(),
}
}
diff --git a/app/domain/sparkle.go b/app/domain/sparkle.go
index 41c46e5..5ed73df 100644
--- a/app/domain/sparkle.go
+++ b/app/domain/sparkle.go
@@ -4,7 +4,6 @@ import (
"errors"
"regexp"
- v1 "github.com/authzed/authzed-go/proto/authzed/api/v1"
"github.com/xlgmokha/x/pkg/x"
)
@@ -38,15 +37,8 @@ func WithText(text string) x.Option[*Sparkle] {
})
}
-func (s *Sparkle) ToGID() string {
- return "gid://sparkle/Sparkle/" + s.ID.String()
-}
-
-func (self *Sparkle) ToObjectReference() *v1.ObjectReference {
- return &v1.ObjectReference{
- ObjectType: "sparkle",
- ObjectId: self.ID.String(),
- }
+func (s *Sparkle) ToGID() GlobalID {
+ return GlobalID("gid://sparkle/Sparkle/" + s.ID.String())
}
func (s *Sparkle) Validate() error {
diff --git a/app/domain/sparkle_test.go b/app/domain/sparkle_test.go
index 5d3449f..fcaf2f2 100644
--- a/app/domain/sparkle_test.go
+++ b/app/domain/sparkle_test.go
@@ -43,17 +43,16 @@ func TestSparkle(t *testing.T) {
sparkle := x.New[*Sparkle](WithULID[*Sparkle]())
gid := sparkle.ToGID()
- assert.Equal(t, fmt.Sprintf("gid://sparkle/Sparkle/%s", sparkle.ID), gid)
+ assert.Equal(t, fmt.Sprintf("gid://sparkle/Sparkle/%s", sparkle.ID), gid.String())
})
})
t.Run("ToObjectReference", func(t *testing.T) {
t.Run("returns a valid object reference", func(t *testing.T) {
sparkle := x.New[*Sparkle](WithULID[*Sparkle]())
- reference := sparkle.ToObjectReference()
+ reference := sparkle.ToGID().ToObjectReference()
require.NotNil(t, reference)
- require.NoError(t, reference.Validate())
require.NoError(t, reference.ValidateAll())
assert.Equal(t, sparkle.ID.String(), reference.GetObjectId())
assert.Equal(t, "sparkle", reference.GetObjectType())
diff --git a/app/domain/user.go b/app/domain/user.go
index c9dcfb4..198fafc 100644
--- a/app/domain/user.go
+++ b/app/domain/user.go
@@ -32,20 +32,12 @@ func (self *User) Sparkle(sparklee string, reason string) *Sparkle {
}
}
-func (self *User) ToGID() string {
- return "gid://sparkle/User/" + self.ID.String()
+func (self *User) ToGID() GlobalID {
+ return GlobalID("gid://sparkle/User/" + self.Username)
}
func (self *User) ToSubjectReference() *v1.SubjectReference {
return &v1.SubjectReference{
- Object: self.ToObjectReference(),
- }
-}
-
-func (self *User) ToObjectReference() *v1.ObjectReference {
- return &v1.ObjectReference{
- ObjectType: "user",
- // ObjectId: self.ID.String(),
- ObjectId: self.Username,
+ Object: self.ToGID().ToObjectReference(),
}
}
diff --git a/app/init.go b/app/init.go
index 581944b..c22628c 100644
--- a/app/init.go
+++ b/app/init.go
@@ -85,12 +85,15 @@ func init() {
ioc.MustResolve[*event.TypedAggregator[*domain.Sparkle]](c).SubscribeTo("after.create", func(item *domain.Sparkle) {
client := ioc.MustResolve[*authzed.Client](c)
+
+ resource := item.ToGID().ToObjectReference()
+
response, err := client.WriteRelationships(context.Background(), &v1.WriteRelationshipsRequest{
Updates: []*v1.RelationshipUpdate{
&v1.RelationshipUpdate{
Operation: v1.RelationshipUpdate_OPERATION_CREATE,
Relationship: &v1.Relationship{
- Resource: item.ToObjectReference(),
+ Resource: resource,
Relation: "sparkler",
Subject: item.Author.ToSubjectReference(),
},
@@ -98,7 +101,7 @@ func init() {
&v1.RelationshipUpdate{
Operation: v1.RelationshipUpdate_OPERATION_CREATE,
Relationship: &v1.Relationship{
- Resource: item.ToObjectReference(),
+ Resource: resource,
Relation: "sparklee",
Subject: &v1.SubjectReference{
Object: &v1.ObjectReference{
@@ -111,7 +114,7 @@ func init() {
&v1.RelationshipUpdate{
Operation: v1.RelationshipUpdate_OPERATION_CREATE,
Relationship: &v1.Relationship{
- Resource: item.ToObjectReference(),
+ Resource: resource,
Relation: "reader",
Subject: &v1.SubjectReference{
Object: &v1.ObjectReference{