Skip to content

Commit 49f1151

Browse files
committed
Introduces namespaces for memberships.
1 parent b7c2724 commit 49f1151

File tree

8 files changed

+107
-18
lines changed

8 files changed

+107
-18
lines changed

api/v1/project_member.pb.go

Lines changed: 27 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1/tenant_member.pb.go

Lines changed: 24 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func main() {
3131

3232
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
3333
defer cancel()
34-
c, err := client.NewClient(ctx, "localhost", 50051, "certs/client.pem", "certs/client-key.pem", "certs/ca.pem", hmacKey, true, logger)
34+
c, err := client.NewClient(ctx, "localhost", 50051, "certs/client.pem", "certs/client-key.pem", "certs/ca.pem", hmacKey, true, logger, "test")
3535
if err != nil {
3636
logger.Error(err.Error())
3737
panic(err)

pkg/client/client.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ type GRPCClient struct {
3434
}
3535

3636
// NewClient creates a new client for the services for the given address, with the certificate and hmac.
37-
func NewClient(ctx context.Context, hostname string, port int, certFile string, keyFile string, caFile string, hmacKey string, insecure bool, logger *slog.Logger) (Client, error) {
37+
func NewClient(ctx context.Context, hostname string, port int, certFile string, keyFile string, caFile string, hmacKey string, insecure bool, logger *slog.Logger, namespace string) (Client, error) {
3838

3939
address := fmt.Sprintf("%s:%d", hostname, port)
4040

@@ -83,6 +83,20 @@ func NewClient(ctx context.Context, hostname string, port int, certFile string,
8383
return nil, fmt.Errorf("failed to create hmac-authenticator: %w", err)
8484
}
8585

86+
namespaceInterceptor := func(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
87+
switch r := req.(type) {
88+
case *v1.TenantMemberCreateRequest:
89+
r.TenantMember.Namespace = namespace
90+
case *v1.TenantMemberFindRequest:
91+
r.Namespace = namespace
92+
case *v1.ProjectMemberCreateRequest:
93+
r.ProjectMember.Namespace = namespace
94+
case *v1.ProjectMemberFindRequest:
95+
r.Namespace = namespace
96+
}
97+
return invoker(ctx, method, req, reply, cc, opts...)
98+
}
99+
86100
opts := []grpc.DialOption{
87101
// In addition to the following grpc.DialOption, callers may also use
88102
// the grpc.CallOption grpc.PerRPCCredentials with the RPC invocation
@@ -93,6 +107,8 @@ func NewClient(ctx context.Context, hostname string, port int, certFile string,
93107
// credentials.
94108
grpc.WithTransportCredentials(creds),
95109

110+
grpc.WithChainUnaryInterceptor(namespaceInterceptor),
111+
96112
// grpc.WithInsecure(),
97113
}
98114
// Set up a connection to the server.

pkg/service/projectmember.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,24 @@ func (s *projectMemberService) Create(ctx context.Context, req *v1.ProjectMember
5353
err = s.projectMemberStore.Create(ctx, projectMember)
5454
return projectMember.NewProjectMemberResponse(), err
5555
}
56+
5657
func (s *projectMemberService) Update(ctx context.Context, req *v1.ProjectMemberUpdateRequest) (*v1.ProjectMemberResponse, error) {
5758
projectMember := req.ProjectMember
58-
err := s.projectMemberStore.Update(ctx, projectMember)
59+
60+
old, err := s.projectMemberStore.Get(ctx, projectMember.Meta.Id)
61+
if err != nil {
62+
return nil, err
63+
}
64+
65+
if old.Namespace != projectMember.Namespace {
66+
return nil, status.Error(codes.InvalidArgument, "updating the namespace of a project member is not allowed")
67+
}
68+
69+
err = s.projectMemberStore.Update(ctx, projectMember)
70+
5971
return projectMember.NewProjectMemberResponse(), err
6072
}
73+
6174
func (s *projectMemberService) Delete(ctx context.Context, req *v1.ProjectMemberDeleteRequest) (*v1.ProjectMemberResponse, error) {
6275
projectMember := req.NewProjectMember()
6376
err := s.projectMemberStore.Delete(ctx, projectMember.Meta.Id)
@@ -78,6 +91,9 @@ func (s *projectMemberService) Find(ctx context.Context, req *v1.ProjectMemberFi
7891
if req.TenantId != nil {
7992
filter["projectmember ->> 'tenant_id'"] = req.TenantId
8093
}
94+
if req.TenantId != nil {
95+
filter["projectmember ->> 'tenant_id'"] = req.TenantId
96+
}
8197
for key, value := range req.Annotations {
8298
// select * from projectMember where projectMember -> 'meta' -> 'annotations' ->> 'metal-stack.io/role' = 'owner';
8399
f := fmt.Sprintf("projectmember -> 'meta' -> 'annotations' ->> '%s'", key)

pkg/service/tenantmember.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,18 @@ func (s *tenantMemberService) Create(ctx context.Context, req *v1.TenantMemberCr
5353
}
5454
func (s *tenantMemberService) Update(ctx context.Context, req *v1.TenantMemberUpdateRequest) (*v1.TenantMemberResponse, error) {
5555
tenantMember := req.TenantMember
56-
err := s.tenantMemberStore.Update(ctx, tenantMember)
56+
57+
old, err := s.tenantMemberStore.Get(ctx, tenantMember.Meta.Id)
58+
if err != nil {
59+
return nil, err
60+
}
61+
62+
if old.Namespace != tenantMember.Namespace {
63+
return nil, status.Error(codes.InvalidArgument, "updating the namespace of a tenant member is not allowed")
64+
}
65+
66+
err = s.tenantMemberStore.Update(ctx, tenantMember)
67+
5768
return tenantMember.NewTenantMemberResponse(), err
5869
}
5970
func (s *tenantMemberService) Delete(ctx context.Context, req *v1.TenantMemberDeleteRequest) (*v1.TenantMemberResponse, error) {
@@ -69,7 +80,9 @@ func (s *tenantMemberService) Get(ctx context.Context, req *v1.TenantMemberGetRe
6980
return tenantMember.NewTenantMemberResponse(), nil
7081
}
7182
func (s *tenantMemberService) Find(ctx context.Context, req *v1.TenantMemberFindRequest) (*v1.TenantMemberListResponse, error) {
72-
filter := make(map[string]any)
83+
filter := map[string]any{
84+
"tenantmember ->> 'namespace'": req.Namespace,
85+
}
7386
if req.TenantId != nil {
7487
filter["tenantmember ->> 'tenant_id'"] = req.TenantId
7588
}

proto/v1/project_member.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ message ProjectMember {
1717
Meta meta = 1;
1818
string project_id = 2;
1919
string tenant_id = 4;
20+
// Namespace introduces the possibility to associate memberships for different applications that use the masterdata-api as a backend.
21+
string namespace = 5;
2022
}
2123

2224
message ProjectMemberCreateRequest {
@@ -39,6 +41,7 @@ message ProjectMemberFindRequest {
3941
optional string project_id = 1;
4042
optional string tenant_id = 2;
4143
map<string, string> annotations = 6;
44+
string namespace = 7;
4245
}
4346

4447
message ProjectMemberResponse {

proto/v1/tenant_member.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ message TenantMember {
1919
string tenant_id = 2;
2020
// MemberId is the id of the member tenant
2121
string member_id = 3;
22+
// Namespace introduces the possibility to associate memberships for different applications that use the masterdata-api as a backend.
23+
string namespace = 4;
2224
}
2325

2426
message TenantMemberCreateRequest {
@@ -41,6 +43,7 @@ message TenantMemberFindRequest {
4143
optional string tenant_id = 1;
4244
optional string member_id = 2;
4345
map<string, string> annotations = 6;
46+
string namespace = 7;
4447
}
4548

4649
message TenantMemberResponse {

0 commit comments

Comments
 (0)