diff options
| author | mo khan <mo@mokhan.ca> | 2025-07-24 16:59:43 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2025-07-24 16:59:43 -0600 |
| commit | a3496a1114c6958aa1831af5348d7340e29ebf06 (patch) | |
| tree | e467d6d54a4a16ac0002bad784b7c3a1dd9fe0bd | |
| parent | 0babaa518db6cbdc17779e9c4846a8a277d098b7 (diff) | |
refactor: delegate to GlobalID to provide object references
| -rw-r--r-- | app/domain/entity.go | 17 | ||||
| -rw-r--r-- | app/domain/entity_test.go | 17 | ||||
| -rw-r--r-- | app/domain/identifiable.go | 3 | ||||
| -rw-r--r-- | app/domain/permission.go | 4 | ||||
| -rw-r--r-- | app/domain/sparkle.go | 12 | ||||
| -rw-r--r-- | app/domain/sparkle_test.go | 5 | ||||
| -rw-r--r-- | app/domain/user.go | 14 | ||||
| -rw-r--r-- | app/init.go | 9 |
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{ |
