From 94cbf97534d3712c7223208160b900c6733b096b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Fri, 17 Jan 2025 16:16:26 +0100 Subject: [PATCH] fix(permissions_v2): add membership fields migration (#9199) # Which Problems Are Solved Memberships did not have a fields table fill migration. # How the Problems Are Solved Add filling of membership fields to the repeatable steps. # Additional Changes - Use the same repeatable step for multiple fill fields handlers. - Fix an error for PostgreSQL 15 where a subquery in a `FROM` clause needs an alias ing the `permitted_orgs` function. # Additional Context - Part of https://github.com/zitadel/zitadel/issues/9188 - Introduced in https://github.com/zitadel/zitadel/pull/9152 --- cmd/setup/41.go | 44 ---------------- cmd/setup/46/06-permitted_orgs_function.sql | 2 +- cmd/setup/fill_fields.go | 51 +++++++++++++++++++ cmd/setup/setup.go | 7 ++- go.mod | 4 +- .../user/v2/integration_test/user_test.go | 3 +- .../api/scim/integration_test/scim_test.go | 3 +- .../integration_test/users_create_test.go | 14 ++--- .../integration_test/users_delete_test.go | 16 +++--- .../scim/integration_test/users_get_test.go | 12 +++-- .../integration_test/users_replace_test.go | 12 +++-- internal/command/instance.go | 2 +- internal/command/milestone.go | 1 + internal/command/project_member_model.go | 8 +-- .../eventstore/handler/v2/field_handler.go | 4 ++ internal/eventstore/v3/event.go | 1 + internal/query/projection/eventstore_field.go | 31 +++++++++++ internal/query/projection/project_member.go | 16 +++--- .../query/projection/project_member_test.go | 12 ++--- internal/query/projection/projection.go | 2 + internal/repository/project/eventstore.go | 8 +-- internal/repository/project/member.go | 16 +++--- 22 files changed, 164 insertions(+), 105 deletions(-) delete mode 100644 cmd/setup/41.go create mode 100644 cmd/setup/fill_fields.go diff --git a/cmd/setup/41.go b/cmd/setup/41.go deleted file mode 100644 index fa4a1d5a4b..0000000000 --- a/cmd/setup/41.go +++ /dev/null @@ -1,44 +0,0 @@ -package setup - -import ( - "context" - - "github.com/zitadel/zitadel/internal/api/authz" - "github.com/zitadel/zitadel/internal/eventstore" - "github.com/zitadel/zitadel/internal/query/projection" - "github.com/zitadel/zitadel/internal/repository/instance" -) - -type FillFieldsForInstanceDomains struct { - eventstore *eventstore.Eventstore -} - -func (mig *FillFieldsForInstanceDomains) Execute(ctx context.Context, _ eventstore.Event) error { - instances, err := mig.eventstore.InstanceIDs( - ctx, - eventstore.NewSearchQueryBuilder(eventstore.ColumnsInstanceIDs). - OrderDesc(). - AddQuery(). - AggregateTypes("instance"). - EventTypes(instance.InstanceAddedEventType). - Builder(), - ) - if err != nil { - return err - } - for _, instance := range instances { - ctx := authz.WithInstanceID(ctx, instance) - if err := projection.InstanceDomainFields.Trigger(ctx); err != nil { - return err - } - } - return nil -} - -func (mig *FillFieldsForInstanceDomains) String() string { - return "repeatable_fill_fields_for_instance_domains" -} - -func (f *FillFieldsForInstanceDomains) Check(lastRun map[string]interface{}) bool { - return true -} diff --git a/cmd/setup/46/06-permitted_orgs_function.sql b/cmd/setup/46/06-permitted_orgs_function.sql index 55d63c1a19..0c8c0fc673 100644 --- a/cmd/setup/46/06-permitted_orgs_function.sql +++ b/cmd/setup/46/06-permitted_orgs_function.sql @@ -44,7 +44,7 @@ BEGIN WHERE om.role = ANY(matched_roles) AND om.instance_id = instanceID AND om.user_id = userId - ); + ) AS orgs; RETURN; END; $$; diff --git a/cmd/setup/fill_fields.go b/cmd/setup/fill_fields.go new file mode 100644 index 0000000000..9dbb2fed7e --- /dev/null +++ b/cmd/setup/fill_fields.go @@ -0,0 +1,51 @@ +package setup + +import ( + "context" + "fmt" + + "github.com/zitadel/logging" + + "github.com/zitadel/zitadel/internal/api/authz" + "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/eventstore/handler/v2" + "github.com/zitadel/zitadel/internal/repository/instance" +) + +type RepeatableFillFields struct { + eventstore *eventstore.Eventstore + handlers []*handler.FieldHandler +} + +func (mig *RepeatableFillFields) Execute(ctx context.Context, _ eventstore.Event) error { + instances, err := mig.eventstore.InstanceIDs( + ctx, + eventstore.NewSearchQueryBuilder(eventstore.ColumnsInstanceIDs). + OrderDesc(). + AddQuery(). + AggregateTypes(instance.AggregateType). + EventTypes(instance.InstanceAddedEventType). + Builder(), + ) + if err != nil { + return err + } + for _, instance := range instances { + ctx := authz.WithInstanceID(ctx, instance) + for _, handler := range mig.handlers { + logging.WithFields("migration", mig.String(), "instance_id", instance, "handler", handler.String()).Info("run fields trigger") + if err := handler.Trigger(ctx); err != nil { + return fmt.Errorf("%s: %s: %w", mig.String(), handler.String(), err) + } + } + } + return nil +} + +func (mig *RepeatableFillFields) String() string { + return "repeatable_fill_fields" +} + +func (f *RepeatableFillFields) Check(lastRun map[string]interface{}) bool { + return true +} diff --git a/cmd/setup/setup.go b/cmd/setup/setup.go index cd9d3d9673..a48b74acb8 100644 --- a/cmd/setup/setup.go +++ b/cmd/setup/setup.go @@ -28,6 +28,7 @@ import ( "github.com/zitadel/zitadel/internal/database" "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/eventstore/handler/v2" old_es "github.com/zitadel/zitadel/internal/eventstore/repository/sql" new_es "github.com/zitadel/zitadel/internal/eventstore/v3" "github.com/zitadel/zitadel/internal/i18n" @@ -189,8 +190,12 @@ func Setup(ctx context.Context, config *Config, steps *Steps, masterKey string) &DeleteStaleOrgFields{ eventstore: eventstoreClient, }, - &FillFieldsForInstanceDomains{ + &RepeatableFillFields{ eventstore: eventstoreClient, + handlers: []*handler.FieldHandler{ + projection.InstanceDomainFields, + projection.MembershipFields, + }, }, &SyncRolePermissions{ eventstore: eventstoreClient, diff --git a/go.mod b/go.mod index aa9fbb64a2..20d7322124 100644 --- a/go.mod +++ b/go.mod @@ -28,6 +28,8 @@ require ( github.com/go-jose/go-jose/v4 v4.0.4 github.com/go-ldap/ldap/v3 v3.4.8 github.com/go-webauthn/webauthn v0.10.2 + github.com/goccy/go-json v0.10.3 + github.com/golang/protobuf v1.5.4 github.com/gorilla/csrf v1.7.2 github.com/gorilla/mux v1.8.1 github.com/gorilla/schema v1.4.1 @@ -106,11 +108,9 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/go-sql-driver/mysql v1.7.1 // indirect github.com/go-webauthn/x v0.1.9 // indirect - github.com/goccy/go-json v0.10.3 // indirect github.com/golang-jwt/jwt/v4 v4.5.1 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.4 // indirect github.com/google/go-tpm v0.9.0 // indirect github.com/google/pprof v0.0.0-20240528025155-186aa0362fba // indirect github.com/google/s2a-go v0.1.7 // indirect diff --git a/internal/api/grpc/user/v2/integration_test/user_test.go b/internal/api/grpc/user/v2/integration_test/user_test.go index 8d4c254c6b..1d6d12241a 100644 --- a/internal/api/grpc/user/v2/integration_test/user_test.go +++ b/internal/api/grpc/user/v2/integration_test/user_test.go @@ -10,12 +10,11 @@ import ( "testing" "time" - "github.com/zitadel/logging" - "github.com/brianvoe/gofakeit/v6" "github.com/muhlemmer/gu" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/zitadel/logging" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/timestamppb" diff --git a/internal/api/scim/integration_test/scim_test.go b/internal/api/scim/integration_test/scim_test.go index e722ffdb18..84c4d96bec 100644 --- a/internal/api/scim/integration_test/scim_test.go +++ b/internal/api/scim/integration_test/scim_test.go @@ -4,10 +4,11 @@ package integration_test import ( "context" - "github.com/zitadel/zitadel/internal/integration" "os" "testing" "time" + + "github.com/zitadel/zitadel/internal/integration" ) var ( diff --git a/internal/api/scim/integration_test/users_create_test.go b/internal/api/scim/integration_test/users_create_test.go index 1a3e2b8dd5..b9bc708d95 100644 --- a/internal/api/scim/integration_test/users_create_test.go +++ b/internal/api/scim/integration_test/users_create_test.go @@ -5,22 +5,24 @@ package integration_test import ( "context" _ "embed" + "net/http" + "path" + "testing" + "time" + "github.com/brianvoe/gofakeit/v6" "github.com/muhlemmer/gu" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "golang.org/x/text/language" + "google.golang.org/grpc/codes" + "github.com/zitadel/zitadel/internal/api/scim/resources" "github.com/zitadel/zitadel/internal/api/scim/schemas" "github.com/zitadel/zitadel/internal/integration" "github.com/zitadel/zitadel/internal/integration/scim" "github.com/zitadel/zitadel/pkg/grpc/management" "github.com/zitadel/zitadel/pkg/grpc/user/v2" - "golang.org/x/text/language" - "google.golang.org/grpc/codes" - "net/http" - "path" - "testing" - "time" ) var ( diff --git a/internal/api/scim/integration_test/users_delete_test.go b/internal/api/scim/integration_test/users_delete_test.go index 88c7bf88ef..bfdd0eae88 100644 --- a/internal/api/scim/integration_test/users_delete_test.go +++ b/internal/api/scim/integration_test/users_delete_test.go @@ -4,16 +4,18 @@ package integration_test import ( "context" - "github.com/brianvoe/gofakeit/v6" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "github.com/zitadel/zitadel/internal/integration" - "github.com/zitadel/zitadel/internal/integration/scim" - "github.com/zitadel/zitadel/pkg/grpc/user/v2" - "google.golang.org/grpc/codes" "net/http" "testing" "time" + + "github.com/brianvoe/gofakeit/v6" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/grpc/codes" + + "github.com/zitadel/zitadel/internal/integration" + "github.com/zitadel/zitadel/internal/integration/scim" + "github.com/zitadel/zitadel/pkg/grpc/user/v2" ) func TestDeleteUser_errors(t *testing.T) { diff --git a/internal/api/scim/integration_test/users_get_test.go b/internal/api/scim/integration_test/users_get_test.go index 0790b591c7..a8055db600 100644 --- a/internal/api/scim/integration_test/users_get_test.go +++ b/internal/api/scim/integration_test/users_get_test.go @@ -4,21 +4,23 @@ package integration_test import ( "context" + "net/http" + "path" + "testing" + "time" + "github.com/brianvoe/gofakeit/v6" "github.com/muhlemmer/gu" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "golang.org/x/text/language" + "github.com/zitadel/zitadel/internal/api/scim/resources" "github.com/zitadel/zitadel/internal/api/scim/schemas" "github.com/zitadel/zitadel/internal/integration" "github.com/zitadel/zitadel/internal/integration/scim" "github.com/zitadel/zitadel/pkg/grpc/management" "github.com/zitadel/zitadel/pkg/grpc/user/v2" - "golang.org/x/text/language" - "net/http" - "path" - "testing" - "time" ) func TestGetUser(t *testing.T) { diff --git a/internal/api/scim/integration_test/users_replace_test.go b/internal/api/scim/integration_test/users_replace_test.go index 664364bbee..b43dd3acf0 100644 --- a/internal/api/scim/integration_test/users_replace_test.go +++ b/internal/api/scim/integration_test/users_replace_test.go @@ -5,20 +5,22 @@ package integration_test import ( "context" _ "embed" + "net/http" + "path" + "testing" + "time" + "github.com/muhlemmer/gu" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "golang.org/x/text/language" + "github.com/zitadel/zitadel/internal/api/scim/resources" "github.com/zitadel/zitadel/internal/api/scim/schemas" "github.com/zitadel/zitadel/internal/integration" "github.com/zitadel/zitadel/internal/integration/scim" "github.com/zitadel/zitadel/pkg/grpc/management" "github.com/zitadel/zitadel/pkg/grpc/user/v2" - "golang.org/x/text/language" - "net/http" - "path" - "testing" - "time" ) var ( diff --git a/internal/command/instance.go b/internal/command/instance.go index 144378ce58..99075ccfad 100644 --- a/internal/command/instance.go +++ b/internal/command/instance.go @@ -4,9 +4,9 @@ import ( "context" "time" + "github.com/zitadel/logging" "golang.org/x/text/language" - "github.com/zitadel/logging" "github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/api/http" "github.com/zitadel/zitadel/internal/command/preparation" diff --git a/internal/command/milestone.go b/internal/command/milestone.go index 11e6e5ab7f..e2f4fdc9de 100644 --- a/internal/command/milestone.go +++ b/internal/command/milestone.go @@ -4,6 +4,7 @@ import ( "context" "github.com/zitadel/logging" + "github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/command/preparation" "github.com/zitadel/zitadel/internal/eventstore" diff --git a/internal/command/project_member_model.go b/internal/command/project_member_model.go index 4e78fb4f52..8e743e0a46 100644 --- a/internal/command/project_member_model.go +++ b/internal/command/project_member_model.go @@ -58,9 +58,9 @@ func (wm *ProjectMemberWriteModel) Query() *eventstore.SearchQueryBuilder { AddQuery(). AggregateTypes(project.AggregateType). AggregateIDs(wm.MemberWriteModel.AggregateID). - EventTypes(project.MemberAddedType, - project.MemberChangedType, - project.MemberRemovedType, - project.MemberCascadeRemovedType). + EventTypes(project.MemberAddedEventType, + project.MemberChangedEventType, + project.MemberRemovedEventType, + project.MemberCascadeRemovedEventType). Builder() } diff --git a/internal/eventstore/handler/v2/field_handler.go b/internal/eventstore/handler/v2/field_handler.go index bbe40ed465..ad309ac790 100644 --- a/internal/eventstore/handler/v2/field_handler.go +++ b/internal/eventstore/handler/v2/field_handler.go @@ -32,6 +32,9 @@ func (f *fieldProjection) Reducers() []AggregateReducer { var _ Projection = (*fieldProjection)(nil) +// NewFieldHandler returns a projection handler which backfills the `eventstore.fields` table with historic events which +// might have existed before they had and Field Operations defined. +// The events are filtered by the mapped aggregate types and each event type for that aggregate. func NewFieldHandler(config *Config, name string, eventTypes map[eventstore.AggregateType][]eventstore.EventType) *FieldHandler { return &FieldHandler{ Handler: Handler{ @@ -51,6 +54,7 @@ func NewFieldHandler(config *Config, name string, eventTypes map[eventstore.Aggr } } +// Trigger executes the backfill job of events for the instance currently in the context. func (h *FieldHandler) Trigger(ctx context.Context, opts ...TriggerOpt) (err error) { config := new(triggerConfig) for _, opt := range opts { diff --git a/internal/eventstore/v3/event.go b/internal/eventstore/v3/event.go index da4e7a0383..1141a9eacf 100644 --- a/internal/eventstore/v3/event.go +++ b/internal/eventstore/v3/event.go @@ -7,6 +7,7 @@ import ( "time" "github.com/zitadel/logging" + "github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/zerrors" diff --git a/internal/query/projection/eventstore_field.go b/internal/query/projection/eventstore_field.go index 59dde7507d..5dbdad717a 100644 --- a/internal/query/projection/eventstore_field.go +++ b/internal/query/projection/eventstore_field.go @@ -12,6 +12,7 @@ const ( fieldsProjectGrant = "project_grant_fields" fieldsOrgDomainVerified = "org_domain_verified_fields" fieldsInstanceDomain = "instance_domain_fields" + fieldsMemberships = "membership_fields" ) func newFillProjectGrantFields(config handler.Config) *handler.FieldHandler { @@ -52,3 +53,33 @@ func newFillInstanceDomainFields(config handler.Config) *handler.FieldHandler { }, ) } + +func newFillMembershipFields(config handler.Config) *handler.FieldHandler { + return handler.NewFieldHandler( + &config, + fieldsMemberships, + map[eventstore.AggregateType][]eventstore.EventType{ + instance.AggregateType: { + instance.MemberAddedEventType, + instance.MemberChangedEventType, + instance.MemberRemovedEventType, + instance.MemberCascadeRemovedEventType, + instance.InstanceRemovedEventType, + }, + org.AggregateType: { + org.MemberAddedEventType, + org.MemberChangedEventType, + org.MemberRemovedEventType, + org.MemberCascadeRemovedEventType, + org.OrgRemovedEventType, + }, + project.AggregateType: { + project.MemberAddedEventType, + project.MemberChangedEventType, + project.MemberRemovedEventType, + project.MemberCascadeRemovedEventType, + project.ProjectRemovedType, + }, + }, + ) +} diff --git a/internal/query/projection/project_member.go b/internal/query/projection/project_member.go index 822e2e8d7e..8f03192019 100644 --- a/internal/query/projection/project_member.go +++ b/internal/query/projection/project_member.go @@ -60,19 +60,19 @@ func (p *projectMemberProjection) Reducers() []handler.AggregateReducer { Aggregate: project.AggregateType, EventReducers: []handler.EventReducer{ { - Event: project.MemberAddedType, + Event: project.MemberAddedEventType, Reduce: p.reduceAdded, }, { - Event: project.MemberChangedType, + Event: project.MemberChangedEventType, Reduce: p.reduceChanged, }, { - Event: project.MemberCascadeRemovedType, + Event: project.MemberCascadeRemovedEventType, Reduce: p.reduceCascadeRemoved, }, { - Event: project.MemberRemovedType, + Event: project.MemberRemovedEventType, Reduce: p.reduceRemoved, }, { @@ -114,7 +114,7 @@ func (p *projectMemberProjection) Reducers() []handler.AggregateReducer { func (p *projectMemberProjection) reduceAdded(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.MemberAddedEvent) if !ok { - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-bgx5Q", "reduce.wrong.event.type %s", project.MemberAddedType) + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-bgx5Q", "reduce.wrong.event.type %s", project.MemberAddedEventType) } ctx := setMemberContext(e.Aggregate()) userOwner, err := getUserResourceOwner(ctx, p.es, e.Aggregate().InstanceID, e.UserID) @@ -131,7 +131,7 @@ func (p *projectMemberProjection) reduceAdded(event eventstore.Event) (*handler. func (p *projectMemberProjection) reduceChanged(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.MemberChangedEvent) if !ok { - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-90WJ1", "reduce.wrong.event.type %s", project.MemberChangedType) + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-90WJ1", "reduce.wrong.event.type %s", project.MemberChangedEventType) } return reduceMemberChanged( *member.NewMemberChangedEvent(&e.BaseEvent, e.UserID, e.Roles...), @@ -142,7 +142,7 @@ func (p *projectMemberProjection) reduceChanged(event eventstore.Event) (*handle func (p *projectMemberProjection) reduceCascadeRemoved(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.MemberCascadeRemovedEvent) if !ok { - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-aGd43", "reduce.wrong.event.type %s", project.MemberCascadeRemovedType) + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-aGd43", "reduce.wrong.event.type %s", project.MemberCascadeRemovedEventType) } return reduceMemberCascadeRemoved( *member.NewCascadeRemovedEvent(&e.BaseEvent, e.UserID), @@ -153,7 +153,7 @@ func (p *projectMemberProjection) reduceCascadeRemoved(event eventstore.Event) ( func (p *projectMemberProjection) reduceRemoved(event eventstore.Event) (*handler.Statement, error) { e, ok := event.(*project.MemberRemovedEvent) if !ok { - return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-eJZPh", "reduce.wrong.event.type %s", project.MemberRemovedType) + return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-eJZPh", "reduce.wrong.event.type %s", project.MemberRemovedEventType) } return reduceMemberRemoved(e, withMemberCond(MemberUserIDCol, e.UserID), diff --git a/internal/query/projection/project_member_test.go b/internal/query/projection/project_member_test.go index bd7e1049cf..c33a319524 100644 --- a/internal/query/projection/project_member_test.go +++ b/internal/query/projection/project_member_test.go @@ -32,7 +32,7 @@ func TestProjectMemberProjection_reduces(t *testing.T) { args: args{ event: getEvent( testEvent( - project.MemberAddedType, + project.MemberAddedEventType, project.AggregateType, []byte(`{ "userId": "user-id", @@ -56,7 +56,7 @@ func TestProjectMemberProjection_reduces(t *testing.T) { args: args{ event: getEvent( testEvent( - project.MemberAddedType, + project.MemberAddedEventType, project.AggregateType, []byte(`{ "userId": "user-id", @@ -110,7 +110,7 @@ func TestProjectMemberProjection_reduces(t *testing.T) { args: args{ event: getEvent( testEvent( - project.MemberAddedType, + project.MemberAddedEventType, project.AggregateType, []byte(`{ "userId": "user-id", @@ -176,7 +176,7 @@ func TestProjectMemberProjection_reduces(t *testing.T) { args: args{ event: getEvent( testEvent( - project.MemberChangedType, + project.MemberChangedEventType, project.AggregateType, []byte(`{ "userId": "user-id", @@ -210,7 +210,7 @@ func TestProjectMemberProjection_reduces(t *testing.T) { args: args{ event: getEvent( testEvent( - project.MemberCascadeRemovedType, + project.MemberCascadeRemovedEventType, project.AggregateType, []byte(`{ "userId": "user-id" @@ -240,7 +240,7 @@ func TestProjectMemberProjection_reduces(t *testing.T) { args: args{ event: getEvent( testEvent( - project.MemberRemovedType, + project.MemberRemovedEventType, project.AggregateType, []byte(`{ "userId": "user-id" diff --git a/internal/query/projection/projection.go b/internal/query/projection/projection.go index ebe7454b58..d6647d0961 100644 --- a/internal/query/projection/projection.go +++ b/internal/query/projection/projection.go @@ -85,6 +85,7 @@ var ( ProjectGrantFields *handler.FieldHandler OrgDomainVerifiedFields *handler.FieldHandler InstanceDomainFields *handler.FieldHandler + MembershipFields *handler.FieldHandler ) type projection interface { @@ -174,6 +175,7 @@ func Create(ctx context.Context, sqlClient *database.DB, es handler.EventStore, ProjectGrantFields = newFillProjectGrantFields(applyCustomConfig(projectionConfig, config.Customizations[fieldsProjectGrant])) OrgDomainVerifiedFields = newFillOrgDomainVerifiedFields(applyCustomConfig(projectionConfig, config.Customizations[fieldsOrgDomainVerified])) InstanceDomainFields = newFillInstanceDomainFields(applyCustomConfig(projectionConfig, config.Customizations[fieldsInstanceDomain])) + MembershipFields = newFillMembershipFields(applyCustomConfig(projectionConfig, config.Customizations[fieldsMemberships])) newProjectionsList() return nil diff --git a/internal/repository/project/eventstore.go b/internal/repository/project/eventstore.go index 5705649739..2648737d3b 100644 --- a/internal/repository/project/eventstore.go +++ b/internal/repository/project/eventstore.go @@ -10,10 +10,10 @@ func init() { eventstore.RegisterFilterEventMapper(AggregateType, ProjectDeactivatedType, ProjectDeactivatedEventMapper) eventstore.RegisterFilterEventMapper(AggregateType, ProjectReactivatedType, ProjectReactivatedEventMapper) eventstore.RegisterFilterEventMapper(AggregateType, ProjectRemovedType, ProjectRemovedEventMapper) - eventstore.RegisterFilterEventMapper(AggregateType, MemberAddedType, MemberAddedEventMapper) - eventstore.RegisterFilterEventMapper(AggregateType, MemberChangedType, MemberChangedEventMapper) - eventstore.RegisterFilterEventMapper(AggregateType, MemberRemovedType, MemberRemovedEventMapper) - eventstore.RegisterFilterEventMapper(AggregateType, MemberCascadeRemovedType, MemberCascadeRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MemberAddedEventType, MemberAddedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MemberChangedEventType, MemberChangedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MemberRemovedEventType, MemberRemovedEventMapper) + eventstore.RegisterFilterEventMapper(AggregateType, MemberCascadeRemovedEventType, MemberCascadeRemovedEventMapper) eventstore.RegisterFilterEventMapper(AggregateType, RoleAddedType, RoleAddedEventMapper) eventstore.RegisterFilterEventMapper(AggregateType, RoleChangedType, RoleChangedEventMapper) eventstore.RegisterFilterEventMapper(AggregateType, RoleRemovedType, RoleRemovedEventMapper) diff --git a/internal/repository/project/member.go b/internal/repository/project/member.go index d04709b5fa..6fb3ceddfe 100644 --- a/internal/repository/project/member.go +++ b/internal/repository/project/member.go @@ -8,10 +8,10 @@ import ( ) var ( - MemberAddedType = projectEventTypePrefix + member.AddedEventType - MemberChangedType = projectEventTypePrefix + member.ChangedEventType - MemberRemovedType = projectEventTypePrefix + member.RemovedEventType - MemberCascadeRemovedType = projectEventTypePrefix + member.CascadeRemovedEventType + MemberAddedEventType = projectEventTypePrefix + member.AddedEventType + MemberChangedEventType = projectEventTypePrefix + member.ChangedEventType + MemberRemovedEventType = projectEventTypePrefix + member.RemovedEventType + MemberCascadeRemovedEventType = projectEventTypePrefix + member.CascadeRemovedEventType ) const ( @@ -37,7 +37,7 @@ func NewProjectMemberAddedEvent( eventstore.NewBaseEventForPush( ctx, aggregate, - MemberAddedType, + MemberAddedEventType, ), userID, roles..., @@ -74,7 +74,7 @@ func NewProjectMemberChangedEvent( eventstore.NewBaseEventForPush( ctx, aggregate, - MemberChangedType, + MemberChangedEventType, ), userID, roles..., @@ -110,7 +110,7 @@ func NewProjectMemberRemovedEvent( eventstore.NewBaseEventForPush( ctx, aggregate, - MemberRemovedType, + MemberRemovedEventType, ), userID, ), @@ -145,7 +145,7 @@ func NewProjectMemberCascadeRemovedEvent( eventstore.NewBaseEventForPush( ctx, aggregate, - MemberCascadeRemovedType, + MemberCascadeRemovedEventType, ), userID, ),