Skip to content

Commit cc86a67

Browse files
authored
fix: resource and policy declaration fixes (#88)
* fix: ensure resources can be declared separate to policies * fix: ensure topics and subscriptions can be created in separate services
1 parent 64afac8 commit cc86a67

File tree

2 files changed

+75
-35
lines changed

2 files changed

+75
-35
lines changed

nitric/manager.go

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,24 @@ type Manager interface {
4141
Run() error
4242
addWorker(name string, s workers.Worker)
4343
resourceServiceClient() (v1.ResourcesClient, error)
44+
registerResource(request *v1.ResourceDeclareRequest, registerResourceChan chan RegisterResult)
45+
registerPolicy(res *v1.ResourceIdentifier, actions ...v1.Action) (*manager, error)
4446

4547
newApi(name string, opts ...ApiOption) (Api, error)
4648
newBucket(name string, permissions ...BucketPermission) (storage.Bucket, error)
4749
newSecret(name string, permissions ...SecretPermission) (secrets.SecretRef, error)
4850
newQueue(name string, permissions ...QueuePermission) (queues.Queue, error)
4951
newSchedule(name string) Schedule
50-
newTopic(name string, permissions ...TopicPermission) (Topic, error)
5152
newWebsocket(socket string) (Websocket, error)
5253
newKv(name string, permissions ...KvStorePermission) (keyvalue.Store, error)
5354
newOidcSecurityDefinition(apiName string, options OidcOptions) (OidcSecurityDefinition, error)
5455
}
5556

57+
type RegisterResult struct {
58+
Identifier *v1.ResourceIdentifier
59+
Err error
60+
}
61+
5662
type manager struct {
5763
workers map[string]workers.Worker
5864
conn grpc.ClientConnInterface
@@ -104,6 +110,47 @@ func (m *manager) resourceServiceClient() (v1.ResourcesClient, error) {
104110
return m.rsc, nil
105111
}
106112

113+
func (m *manager) registerResource(request *v1.ResourceDeclareRequest, registerResourceChan chan RegisterResult) {
114+
rsc, err := m.resourceServiceClient()
115+
if err != nil {
116+
registerResourceChan <- RegisterResult{
117+
Err: err,
118+
Identifier: nil,
119+
}
120+
121+
return
122+
}
123+
124+
_, err = rsc.Declare(context.Background(), request)
125+
if err != nil {
126+
registerResourceChan <- RegisterResult{
127+
Err: err,
128+
Identifier: nil,
129+
}
130+
131+
return
132+
}
133+
134+
registerResourceChan <- RegisterResult{
135+
Err: nil,
136+
Identifier: request.Id,
137+
}
138+
}
139+
140+
func (m *manager) registerPolicy(res *v1.ResourceIdentifier, actions ...v1.Action) (*manager, error) {
141+
rsc, err := m.resourceServiceClient()
142+
if err != nil {
143+
return m, err
144+
}
145+
146+
_, err = rsc.Declare(context.Background(), functionResourceDeclareRequest(res, actions))
147+
if err != nil {
148+
return m, err
149+
}
150+
151+
return m, nil
152+
}
153+
107154
// Run will run the function and callback the required handlers when these events are received.
108155
func Run() error {
109156
return defaultManager.Run()

nitric/topic.go

Lines changed: 27 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
package nitric
1616

1717
import (
18-
"context"
1918
"fmt"
2019

2120
"github.com/nitrictech/go-sdk/api/topics"
@@ -52,48 +51,37 @@ type topic struct {
5251
}
5352

5453
type subscribableTopic struct {
55-
name string
56-
manager Manager
54+
name string
55+
manager Manager
56+
registerChan chan RegisterResult
5757
}
5858

5959
// NewTopic creates a new Topic with the give permissions.
6060
func NewTopic(name string) SubscribableTopic {
61-
return &subscribableTopic{
62-
name: name,
63-
manager: defaultManager,
64-
}
65-
}
66-
67-
func (t *subscribableTopic) Allow(permission TopicPermission, permissions ...TopicPermission) (Topic, error) {
68-
allPerms := append([]TopicPermission{permission}, permissions...)
69-
70-
return defaultManager.newTopic(t.name, allPerms...)
71-
}
72-
73-
func (m *manager) newTopic(name string, permissions ...TopicPermission) (Topic, error) {
74-
rsc, err := m.resourceServiceClient()
75-
if err != nil {
76-
return nil, err
77-
}
78-
79-
res := &v1.ResourceIdentifier{
80-
Type: v1.ResourceType_Topic,
81-
Name: name,
61+
topic := &subscribableTopic{
62+
name: name,
63+
manager: defaultManager,
64+
registerChan: make(chan RegisterResult),
8265
}
8366

84-
dr := &v1.ResourceDeclareRequest{
85-
Id: res,
67+
go defaultManager.registerResource(&v1.ResourceDeclareRequest{
68+
Id: &v1.ResourceIdentifier{
69+
Type: v1.ResourceType_Topic,
70+
Name: name,
71+
},
8672
Config: &v1.ResourceDeclareRequest_Topic{
8773
Topic: &v1.TopicResource{},
8874
},
89-
}
90-
_, err = rsc.Declare(context.Background(), dr)
91-
if err != nil {
92-
return nil, err
93-
}
75+
}, topic.registerChan)
76+
77+
return topic
78+
}
79+
80+
func (t *subscribableTopic) Allow(permission TopicPermission, permissions ...TopicPermission) (Topic, error) {
81+
allPerms := append([]TopicPermission{permission}, permissions...)
9482

9583
actions := []v1.Action{}
96-
for _, perm := range permissions {
84+
for _, perm := range allPerms {
9785
switch perm {
9886
case TopicPublish:
9987
actions = append(actions, v1.Action_TopicPublish)
@@ -102,7 +90,12 @@ func (m *manager) newTopic(name string, permissions ...TopicPermission) (Topic,
10290
}
10391
}
10492

105-
_, err = rsc.Declare(context.Background(), functionResourceDeclareRequest(res, actions))
93+
registerResult := <-t.registerChan
94+
if registerResult.Err != nil {
95+
return nil, registerResult.Err
96+
}
97+
98+
m, err := t.manager.registerPolicy(registerResult.Identifier, actions...)
10699
if err != nil {
107100
return nil, err
108101
}
@@ -116,7 +109,7 @@ func (m *manager) newTopic(name string, permissions ...TopicPermission) (Topic,
116109
}
117110

118111
return &topic{
119-
Topic: m.topics.Topic(name),
112+
Topic: m.topics.Topic(t.name),
120113
manager: m,
121114
}, nil
122115
}

0 commit comments

Comments
 (0)