feat: remove org (#4148)

* feat(command): remove org

* refactor: imports, unused code, error handling

* reduce org removed in action

* add org deletion to projections

* add org removal to projections

* add org removal to projections

* org removed projection

* lint import

* projections

* fix: table names in tests

* fix: table names in tests

* logging

* add org state

* fix(domain): add Owner removed to object details

* feat(ListQuery): add with owner removed

* fix(org-delete): add bool to functions to select with owner removed

* fix(org-delete): add bools to user grants with events to determine if dependencies lost owner

* fix(org-delete): add unit tests for owner removed and org removed events

* fix(org-delete): add handling of org remove for grants and members

* fix(org-delete): correction of unit tests for owner removed

* fix(org-delete): update projections, unit tests and get functions

* fix(org-delete): add change date to authnkeys and owner removed to org metadata

* fix(org-delete): include owner removed for login names

* fix(org-delete): some column fixes in projections and build for queries with owner removed

* indexes

* fix(org-delete): include review changes

* fix(org-delete): change user projection name after merge

* fix(org-delete): include review changes for project grant where no project owner is necessary

* fix(org-delete): include auth and adminapi tables with owner removed information

* fix(org-delete): cleanup username and orgdomain uniqueconstraints when org is removed

* fix(org-delete): add permissions for org.remove

* remove unnecessary unique constraints

* fix column order in primary keys

* fix(org-delete): include review changes

* fix(org-delete): add owner removed indexes and chang setup step to create tables

* fix(org-delete): move PK order of instance_id and change added user_grant from review

* fix(org-delete): no params for prepareUserQuery

* change to step 6

* merge main

* fix(org-delete): OldUserName rename to private

* fix linting

* cleanup

* fix: remove org test

* create prerelease

* chore: delete org-delete as prerelease

Co-authored-by: Stefan Benz <[email protected]>
Co-authored-by: Livio Spring <[email protected]>
Co-authored-by: Fabi <[email protected]>
Co-authored-by: Stefan Benz <[email protected]>
This commit is contained in:
Silvan
2022-11-30 17:01:17 +01:00
committed by GitHub
co-authored by Stefan Benz Livio Spring Fabi Stefan Benz
parent 21a4e73bb6
commit f3e6f3b23b
304 changed files with 7293 additions and 3286 deletions
+22 -13
View File
@@ -67,6 +67,10 @@ var (
name: projection.ActionAllowedToFailCol,
table: actionTable,
}
ActionColumnOwnerRemoved = Column{
name: projection.ActionOwnerRemovedCol,
table: actionTable,
}
)
type Actions struct {
@@ -108,13 +112,15 @@ func (q *ActionSearchQueries) toQuery(query sq.SelectBuilder) sq.SelectBuilder {
return query
}
func (q *Queries) SearchActions(ctx context.Context, queries *ActionSearchQueries) (actions *Actions, err error) {
func (q *Queries) SearchActions(ctx context.Context, queries *ActionSearchQueries, withOwnerRemoved bool) (actions *Actions, err error) {
query, scan := prepareActionsQuery()
stmt, args, err := queries.toQuery(query).
Where(sq.Eq{
ActionColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}).
ToSql()
eq := sq.Eq{
ActionColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[ActionColumnOwnerRemoved.identifier()] = false
}
stmt, args, err := queries.toQuery(query).Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-SDgwg", "Errors.Query.InvalidRequest")
}
@@ -131,14 +137,17 @@ func (q *Queries) SearchActions(ctx context.Context, queries *ActionSearchQuerie
return actions, err
}
func (q *Queries) GetActionByID(ctx context.Context, id string, orgID string) (*Action, error) {
func (q *Queries) GetActionByID(ctx context.Context, id string, orgID string, withOwnerRemoved bool) (*Action, error) {
stmt, scan := prepareActionQuery()
query, args, err := stmt.Where(
sq.Eq{
ActionColumnID.identifier(): id,
ActionColumnResourceOwner.identifier(): orgID,
ActionColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
eq := sq.Eq{
ActionColumnID.identifier(): id,
ActionColumnResourceOwner.identifier(): orgID,
ActionColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[ActionColumnOwnerRemoved.identifier()] = false
}
query, args, err := stmt.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-Dgff3", "Errors.Query.SQLStatement")
}
+35 -24
View File
@@ -50,6 +50,10 @@ var (
name: projection.FlowActionIDCol,
table: flowsTriggersTable,
}
FlowsTriggersOwnerRemovedCol = Column{
name: projection.FlowOwnerRemovedCol,
table: flowsTriggersTable,
}
)
type Flow struct {
@@ -61,14 +65,17 @@ type Flow struct {
TriggerActions map[domain.TriggerType][]*Action
}
func (q *Queries) GetFlow(ctx context.Context, flowType domain.FlowType, orgID string) (*Flow, error) {
func (q *Queries) GetFlow(ctx context.Context, flowType domain.FlowType, orgID string, withOwnerRemoved bool) (*Flow, error) {
query, scan := prepareFlowQuery(flowType)
stmt, args, err := query.Where(
sq.Eq{
FlowsTriggersColumnFlowType.identifier(): flowType,
FlowsTriggersColumnResourceOwner.identifier(): orgID,
FlowsTriggersColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
eq := sq.Eq{
FlowsTriggersColumnFlowType.identifier(): flowType,
FlowsTriggersColumnResourceOwner.identifier(): orgID,
FlowsTriggersColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[FlowsTriggersOwnerRemovedCol.identifier()] = false
}
stmt, args, err := query.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-HBRh3", "Errors.Query.InvalidRequest")
}
@@ -80,17 +87,19 @@ func (q *Queries) GetFlow(ctx context.Context, flowType domain.FlowType, orgID s
return scan(rows)
}
func (q *Queries) GetActiveActionsByFlowAndTriggerType(ctx context.Context, flowType domain.FlowType, triggerType domain.TriggerType, orgID string) ([]*Action, error) {
func (q *Queries) GetActiveActionsByFlowAndTriggerType(ctx context.Context, flowType domain.FlowType, triggerType domain.TriggerType, orgID string, withOwnerRemoved bool) ([]*Action, error) {
stmt, scan := prepareTriggerActionsQuery()
query, args, err := stmt.Where(
sq.Eq{
FlowsTriggersColumnFlowType.identifier(): flowType,
FlowsTriggersColumnTriggerType.identifier(): triggerType,
FlowsTriggersColumnResourceOwner.identifier(): orgID,
FlowsTriggersColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
ActionColumnState.identifier(): domain.ActionStateActive,
},
).ToSql()
eq := sq.Eq{
FlowsTriggersColumnFlowType.identifier(): flowType,
FlowsTriggersColumnTriggerType.identifier(): triggerType,
FlowsTriggersColumnResourceOwner.identifier(): orgID,
FlowsTriggersColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
ActionColumnState.identifier(): domain.ActionStateActive,
}
if !withOwnerRemoved {
eq[FlowsTriggersOwnerRemovedCol.identifier()] = false
}
query, args, err := stmt.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-Dgff3", "Errors.Query.SQLStatement")
}
@@ -102,14 +111,16 @@ func (q *Queries) GetActiveActionsByFlowAndTriggerType(ctx context.Context, flow
return scan(rows)
}
func (q *Queries) GetFlowTypesOfActionID(ctx context.Context, actionID string) ([]domain.FlowType, error) {
func (q *Queries) GetFlowTypesOfActionID(ctx context.Context, actionID string, withOwnerRemoved bool) ([]domain.FlowType, error) {
stmt, scan := prepareFlowTypesQuery()
query, args, err := stmt.Where(
sq.Eq{
FlowsTriggersColumnActionID.identifier(): actionID,
FlowsTriggersColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
).ToSql()
eq := sq.Eq{
FlowsTriggersColumnActionID.identifier(): actionID,
FlowsTriggersColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[FlowsTriggersOwnerRemovedCol.identifier()] = false
}
query, args, err := stmt.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-Dh311", "Errors.Query.InvalidRequest")
}
+146 -146
View File
@@ -32,24 +32,24 @@ func Test_FlowPrepares(t *testing.T) {
},
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.actions2.id,`+
` projections.actions2.creation_date,`+
` projections.actions2.change_date,`+
` projections.actions2.resource_owner,`+
` projections.actions2.action_state,`+
` projections.actions2.sequence,`+
` projections.actions2.name,`+
` projections.actions2.script,`+
` projections.actions2.allowed_to_fail,`+
` projections.actions2.timeout,`+
` projections.flows_triggers.trigger_type,`+
` projections.flows_triggers.trigger_sequence,`+
` projections.flows_triggers.flow_type,`+
` projections.flows_triggers.change_date,`+
` projections.flows_triggers.sequence,`+
` projections.flows_triggers.resource_owner`+
` FROM projections.flows_triggers`+
` LEFT JOIN projections.actions2 ON projections.flows_triggers.action_id = projections.actions2.id`),
regexp.QuoteMeta(`SELECT projections.actions3.id,`+
` projections.actions3.creation_date,`+
` projections.actions3.change_date,`+
` projections.actions3.resource_owner,`+
` projections.actions3.action_state,`+
` projections.actions3.sequence,`+
` projections.actions3.name,`+
` projections.actions3.script,`+
` projections.actions3.allowed_to_fail,`+
` projections.actions3.timeout,`+
` projections.flow_triggers2.trigger_type,`+
` projections.flow_triggers2.trigger_sequence,`+
` projections.flow_triggers2.flow_type,`+
` projections.flow_triggers2.change_date,`+
` projections.flow_triggers2.sequence,`+
` projections.flow_triggers2.resource_owner`+
` FROM projections.flow_triggers2`+
` LEFT JOIN projections.actions3 ON projections.flow_triggers2.action_id = projections.actions3.id`),
nil,
nil,
),
@@ -66,24 +66,24 @@ func Test_FlowPrepares(t *testing.T) {
},
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.actions2.id,`+
` projections.actions2.creation_date,`+
` projections.actions2.change_date,`+
` projections.actions2.resource_owner,`+
` projections.actions2.action_state,`+
` projections.actions2.sequence,`+
` projections.actions2.name,`+
` projections.actions2.script,`+
` projections.actions2.allowed_to_fail,`+
` projections.actions2.timeout,`+
` projections.flows_triggers.trigger_type,`+
` projections.flows_triggers.trigger_sequence,`+
` projections.flows_triggers.flow_type,`+
` projections.flows_triggers.change_date,`+
` projections.flows_triggers.sequence,`+
` projections.flows_triggers.resource_owner`+
` FROM projections.flows_triggers`+
` LEFT JOIN projections.actions2 ON projections.flows_triggers.action_id = projections.actions2.id`),
regexp.QuoteMeta(`SELECT projections.actions3.id,`+
` projections.actions3.creation_date,`+
` projections.actions3.change_date,`+
` projections.actions3.resource_owner,`+
` projections.actions3.action_state,`+
` projections.actions3.sequence,`+
` projections.actions3.name,`+
` projections.actions3.script,`+
` projections.actions3.allowed_to_fail,`+
` projections.actions3.timeout,`+
` projections.flow_triggers2.trigger_type,`+
` projections.flow_triggers2.trigger_sequence,`+
` projections.flow_triggers2.flow_type,`+
` projections.flow_triggers2.change_date,`+
` projections.flow_triggers2.sequence,`+
` projections.flow_triggers2.resource_owner`+
` FROM projections.flow_triggers2`+
` LEFT JOIN projections.actions3 ON projections.flow_triggers2.action_id = projections.actions3.id`),
[]string{
"id",
"creation_date",
@@ -155,24 +155,24 @@ func Test_FlowPrepares(t *testing.T) {
},
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.actions2.id,`+
` projections.actions2.creation_date,`+
` projections.actions2.change_date,`+
` projections.actions2.resource_owner,`+
` projections.actions2.action_state,`+
` projections.actions2.sequence,`+
` projections.actions2.name,`+
` projections.actions2.script,`+
` projections.actions2.allowed_to_fail,`+
` projections.actions2.timeout,`+
` projections.flows_triggers.trigger_type,`+
` projections.flows_triggers.trigger_sequence,`+
` projections.flows_triggers.flow_type,`+
` projections.flows_triggers.change_date,`+
` projections.flows_triggers.sequence,`+
` projections.flows_triggers.resource_owner`+
` FROM projections.flows_triggers`+
` LEFT JOIN projections.actions2 ON projections.flows_triggers.action_id = projections.actions2.id`),
regexp.QuoteMeta(`SELECT projections.actions3.id,`+
` projections.actions3.creation_date,`+
` projections.actions3.change_date,`+
` projections.actions3.resource_owner,`+
` projections.actions3.action_state,`+
` projections.actions3.sequence,`+
` projections.actions3.name,`+
` projections.actions3.script,`+
` projections.actions3.allowed_to_fail,`+
` projections.actions3.timeout,`+
` projections.flow_triggers2.trigger_type,`+
` projections.flow_triggers2.trigger_sequence,`+
` projections.flow_triggers2.flow_type,`+
` projections.flow_triggers2.change_date,`+
` projections.flow_triggers2.sequence,`+
` projections.flow_triggers2.resource_owner`+
` FROM projections.flow_triggers2`+
` LEFT JOIN projections.actions3 ON projections.flow_triggers2.action_id = projections.actions3.id`),
[]string{
"id",
"creation_date",
@@ -276,24 +276,24 @@ func Test_FlowPrepares(t *testing.T) {
},
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.actions2.id,`+
` projections.actions2.creation_date,`+
` projections.actions2.change_date,`+
` projections.actions2.resource_owner,`+
` projections.actions2.action_state,`+
` projections.actions2.sequence,`+
` projections.actions2.name,`+
` projections.actions2.script,`+
` projections.actions2.allowed_to_fail,`+
` projections.actions2.timeout,`+
` projections.flows_triggers.trigger_type,`+
` projections.flows_triggers.trigger_sequence,`+
` projections.flows_triggers.flow_type,`+
` projections.flows_triggers.change_date,`+
` projections.flows_triggers.sequence,`+
` projections.flows_triggers.resource_owner`+
` FROM projections.flows_triggers`+
` LEFT JOIN projections.actions2 ON projections.flows_triggers.action_id = projections.actions2.id`),
regexp.QuoteMeta(`SELECT projections.actions3.id,`+
` projections.actions3.creation_date,`+
` projections.actions3.change_date,`+
` projections.actions3.resource_owner,`+
` projections.actions3.action_state,`+
` projections.actions3.sequence,`+
` projections.actions3.name,`+
` projections.actions3.script,`+
` projections.actions3.allowed_to_fail,`+
` projections.actions3.timeout,`+
` projections.flow_triggers2.trigger_type,`+
` projections.flow_triggers2.trigger_sequence,`+
` projections.flow_triggers2.flow_type,`+
` projections.flow_triggers2.change_date,`+
` projections.flow_triggers2.sequence,`+
` projections.flow_triggers2.resource_owner`+
` FROM projections.flow_triggers2`+
` LEFT JOIN projections.actions3 ON projections.flow_triggers2.action_id = projections.actions3.id`),
[]string{
"id",
"creation_date",
@@ -350,24 +350,24 @@ func Test_FlowPrepares(t *testing.T) {
},
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.actions2.id,`+
` projections.actions2.creation_date,`+
` projections.actions2.change_date,`+
` projections.actions2.resource_owner,`+
` projections.actions2.action_state,`+
` projections.actions2.sequence,`+
` projections.actions2.name,`+
` projections.actions2.script,`+
` projections.actions2.allowed_to_fail,`+
` projections.actions2.timeout,`+
` projections.flows_triggers.trigger_type,`+
` projections.flows_triggers.trigger_sequence,`+
` projections.flows_triggers.flow_type,`+
` projections.flows_triggers.change_date,`+
` projections.flows_triggers.sequence,`+
` projections.flows_triggers.resource_owner`+
` FROM projections.flows_triggers`+
` LEFT JOIN projections.actions2 ON projections.flows_triggers.action_id = projections.actions2.id`),
regexp.QuoteMeta(`SELECT projections.actions3.id,`+
` projections.actions3.creation_date,`+
` projections.actions3.change_date,`+
` projections.actions3.resource_owner,`+
` projections.actions3.action_state,`+
` projections.actions3.sequence,`+
` projections.actions3.name,`+
` projections.actions3.script,`+
` projections.actions3.allowed_to_fail,`+
` projections.actions3.timeout,`+
` projections.flow_triggers2.trigger_type,`+
` projections.flow_triggers2.trigger_sequence,`+
` projections.flow_triggers2.flow_type,`+
` projections.flow_triggers2.change_date,`+
` projections.flow_triggers2.sequence,`+
` projections.flow_triggers2.resource_owner`+
` FROM projections.flow_triggers2`+
` LEFT JOIN projections.actions3 ON projections.flow_triggers2.action_id = projections.actions3.id`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
@@ -384,18 +384,18 @@ func Test_FlowPrepares(t *testing.T) {
prepare: prepareTriggerActionsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.actions2.id,`+
` projections.actions2.creation_date,`+
` projections.actions2.change_date,`+
` projections.actions2.resource_owner,`+
` projections.actions2.action_state,`+
` projections.actions2.sequence,`+
` projections.actions2.name,`+
` projections.actions2.script,`+
` projections.actions2.allowed_to_fail,`+
` projections.actions2.timeout`+
` FROM projections.flows_triggers`+
` LEFT JOIN projections.actions2 ON projections.flows_triggers.action_id = projections.actions2.id`),
regexp.QuoteMeta(`SELECT projections.actions3.id,`+
` projections.actions3.creation_date,`+
` projections.actions3.change_date,`+
` projections.actions3.resource_owner,`+
` projections.actions3.action_state,`+
` projections.actions3.sequence,`+
` projections.actions3.name,`+
` projections.actions3.script,`+
` projections.actions3.allowed_to_fail,`+
` projections.actions3.timeout`+
` FROM projections.flow_triggers2`+
` LEFT JOIN projections.actions3 ON projections.flow_triggers2.action_id = projections.actions3.id`),
nil,
nil,
),
@@ -407,18 +407,18 @@ func Test_FlowPrepares(t *testing.T) {
prepare: prepareTriggerActionsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.actions2.id,`+
` projections.actions2.creation_date,`+
` projections.actions2.change_date,`+
` projections.actions2.resource_owner,`+
` projections.actions2.action_state,`+
` projections.actions2.sequence,`+
` projections.actions2.name,`+
` projections.actions2.script,`+
` projections.actions2.allowed_to_fail,`+
` projections.actions2.timeout`+
` FROM projections.flows_triggers`+
` LEFT JOIN projections.actions2 ON projections.flows_triggers.action_id = projections.actions2.id`),
regexp.QuoteMeta(`SELECT projections.actions3.id,`+
` projections.actions3.creation_date,`+
` projections.actions3.change_date,`+
` projections.actions3.resource_owner,`+
` projections.actions3.action_state,`+
` projections.actions3.sequence,`+
` projections.actions3.name,`+
` projections.actions3.script,`+
` projections.actions3.allowed_to_fail,`+
` projections.actions3.timeout`+
` FROM projections.flow_triggers2`+
` LEFT JOIN projections.actions3 ON projections.flow_triggers2.action_id = projections.actions3.id`),
[]string{
"id",
"creation_date",
@@ -467,18 +467,18 @@ func Test_FlowPrepares(t *testing.T) {
prepare: prepareTriggerActionsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.actions2.id,`+
` projections.actions2.creation_date,`+
` projections.actions2.change_date,`+
` projections.actions2.resource_owner,`+
` projections.actions2.action_state,`+
` projections.actions2.sequence,`+
` projections.actions2.name,`+
` projections.actions2.script,`+
` projections.actions2.allowed_to_fail,`+
` projections.actions2.timeout`+
` FROM projections.flows_triggers`+
` LEFT JOIN projections.actions2 ON projections.flows_triggers.action_id = projections.actions2.id`),
regexp.QuoteMeta(`SELECT projections.actions3.id,`+
` projections.actions3.creation_date,`+
` projections.actions3.change_date,`+
` projections.actions3.resource_owner,`+
` projections.actions3.action_state,`+
` projections.actions3.sequence,`+
` projections.actions3.name,`+
` projections.actions3.script,`+
` projections.actions3.allowed_to_fail,`+
` projections.actions3.timeout`+
` FROM projections.flow_triggers2`+
` LEFT JOIN projections.actions3 ON projections.flow_triggers2.action_id = projections.actions3.id`),
[]string{
"id",
"creation_date",
@@ -551,18 +551,18 @@ func Test_FlowPrepares(t *testing.T) {
prepare: prepareTriggerActionsQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.actions2.id,`+
` projections.actions2.creation_date,`+
` projections.actions2.change_date,`+
` projections.actions2.resource_owner,`+
` projections.actions2.action_state,`+
` projections.actions2.sequence,`+
` projections.actions2.name,`+
` projections.actions2.script,`+
` projections.actions2.allowed_to_fail,`+
` projections.actions2.timeout`+
` FROM projections.flows_triggers`+
` LEFT JOIN projections.actions2 ON projections.flows_triggers.action_id = projections.actions2.id`),
regexp.QuoteMeta(`SELECT projections.actions3.id,`+
` projections.actions3.creation_date,`+
` projections.actions3.change_date,`+
` projections.actions3.resource_owner,`+
` projections.actions3.action_state,`+
` projections.actions3.sequence,`+
` projections.actions3.name,`+
` projections.actions3.script,`+
` projections.actions3.allowed_to_fail,`+
` projections.actions3.timeout`+
` FROM projections.flow_triggers2`+
` LEFT JOIN projections.actions3 ON projections.flow_triggers2.action_id = projections.actions3.id`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
@@ -579,8 +579,8 @@ func Test_FlowPrepares(t *testing.T) {
prepare: prepareFlowTypesQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.flows_triggers.flow_type`+
` FROM projections.flows_triggers`),
regexp.QuoteMeta(`SELECT projections.flow_triggers2.flow_type`+
` FROM projections.flow_triggers2`),
nil,
nil,
),
@@ -592,8 +592,8 @@ func Test_FlowPrepares(t *testing.T) {
prepare: prepareFlowTypesQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.flows_triggers.flow_type`+
` FROM projections.flows_triggers`),
regexp.QuoteMeta(`SELECT projections.flow_triggers2.flow_type`+
` FROM projections.flow_triggers2`),
[]string{
"flow_type",
},
@@ -613,8 +613,8 @@ func Test_FlowPrepares(t *testing.T) {
prepare: prepareFlowTypesQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.flows_triggers.flow_type`+
` FROM projections.flows_triggers`),
regexp.QuoteMeta(`SELECT projections.flow_triggers2.flow_type`+
` FROM projections.flow_triggers2`),
[]string{
"flow_type",
},
@@ -638,8 +638,8 @@ func Test_FlowPrepares(t *testing.T) {
prepare: prepareFlowTypesQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.flows_triggers.flow_type`+
` FROM projections.flows_triggers`),
regexp.QuoteMeta(`SELECT projections.flow_triggers2.flow_type`+
` FROM projections.flow_triggers2`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
+77 -77
View File
@@ -29,18 +29,18 @@ func Test_ActionPrepares(t *testing.T) {
prepare: prepareActionsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.actions2.id,`+
` projections.actions2.creation_date,`+
` projections.actions2.change_date,`+
` projections.actions2.resource_owner,`+
` projections.actions2.sequence,`+
` projections.actions2.action_state,`+
` projections.actions2.name,`+
` projections.actions2.script,`+
` projections.actions2.timeout,`+
` projections.actions2.allowed_to_fail,`+
regexp.QuoteMeta(`SELECT projections.actions3.id,`+
` projections.actions3.creation_date,`+
` projections.actions3.change_date,`+
` projections.actions3.resource_owner,`+
` projections.actions3.sequence,`+
` projections.actions3.action_state,`+
` projections.actions3.name,`+
` projections.actions3.script,`+
` projections.actions3.timeout,`+
` projections.actions3.allowed_to_fail,`+
` COUNT(*) OVER ()`+
` FROM projections.actions2`),
` FROM projections.actions3`),
nil,
nil,
),
@@ -52,18 +52,18 @@ func Test_ActionPrepares(t *testing.T) {
prepare: prepareActionsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.actions2.id,`+
` projections.actions2.creation_date,`+
` projections.actions2.change_date,`+
` projections.actions2.resource_owner,`+
` projections.actions2.sequence,`+
` projections.actions2.action_state,`+
` projections.actions2.name,`+
` projections.actions2.script,`+
` projections.actions2.timeout,`+
` projections.actions2.allowed_to_fail,`+
regexp.QuoteMeta(`SELECT projections.actions3.id,`+
` projections.actions3.creation_date,`+
` projections.actions3.change_date,`+
` projections.actions3.resource_owner,`+
` projections.actions3.sequence,`+
` projections.actions3.action_state,`+
` projections.actions3.name,`+
` projections.actions3.script,`+
` projections.actions3.timeout,`+
` projections.actions3.allowed_to_fail,`+
` COUNT(*) OVER ()`+
` FROM projections.actions2`),
` FROM projections.actions3`),
[]string{
"id",
"creation_date",
@@ -118,18 +118,18 @@ func Test_ActionPrepares(t *testing.T) {
prepare: prepareActionsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.actions2.id,`+
` projections.actions2.creation_date,`+
` projections.actions2.change_date,`+
` projections.actions2.resource_owner,`+
` projections.actions2.sequence,`+
` projections.actions2.action_state,`+
` projections.actions2.name,`+
` projections.actions2.script,`+
` projections.actions2.timeout,`+
` projections.actions2.allowed_to_fail,`+
regexp.QuoteMeta(`SELECT projections.actions3.id,`+
` projections.actions3.creation_date,`+
` projections.actions3.change_date,`+
` projections.actions3.resource_owner,`+
` projections.actions3.sequence,`+
` projections.actions3.action_state,`+
` projections.actions3.name,`+
` projections.actions3.script,`+
` projections.actions3.timeout,`+
` projections.actions3.allowed_to_fail,`+
` COUNT(*) OVER ()`+
` FROM projections.actions2`),
` FROM projections.actions3`),
[]string{
"id",
"creation_date",
@@ -208,18 +208,18 @@ func Test_ActionPrepares(t *testing.T) {
prepare: prepareActionsQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.actions2.id,`+
` projections.actions2.creation_date,`+
` projections.actions2.change_date,`+
` projections.actions2.resource_owner,`+
` projections.actions2.sequence,`+
` projections.actions2.action_state,`+
` projections.actions2.name,`+
` projections.actions2.script,`+
` projections.actions2.timeout,`+
` projections.actions2.allowed_to_fail,`+
regexp.QuoteMeta(`SELECT projections.actions3.id,`+
` projections.actions3.creation_date,`+
` projections.actions3.change_date,`+
` projections.actions3.resource_owner,`+
` projections.actions3.sequence,`+
` projections.actions3.action_state,`+
` projections.actions3.name,`+
` projections.actions3.script,`+
` projections.actions3.timeout,`+
` projections.actions3.allowed_to_fail,`+
` COUNT(*) OVER ()`+
` FROM projections.actions2`),
` FROM projections.actions3`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
@@ -236,17 +236,17 @@ func Test_ActionPrepares(t *testing.T) {
prepare: prepareActionQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.actions2.id,`+
` projections.actions2.creation_date,`+
` projections.actions2.change_date,`+
` projections.actions2.resource_owner,`+
` projections.actions2.sequence,`+
` projections.actions2.action_state,`+
` projections.actions2.name,`+
` projections.actions2.script,`+
` projections.actions2.timeout,`+
` projections.actions2.allowed_to_fail`+
` FROM projections.actions2`),
regexp.QuoteMeta(`SELECT projections.actions3.id,`+
` projections.actions3.creation_date,`+
` projections.actions3.change_date,`+
` projections.actions3.resource_owner,`+
` projections.actions3.sequence,`+
` projections.actions3.action_state,`+
` projections.actions3.name,`+
` projections.actions3.script,`+
` projections.actions3.timeout,`+
` projections.actions3.allowed_to_fail`+
` FROM projections.actions3`),
nil,
nil,
),
@@ -264,17 +264,17 @@ func Test_ActionPrepares(t *testing.T) {
prepare: prepareActionQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.actions2.id,`+
` projections.actions2.creation_date,`+
` projections.actions2.change_date,`+
` projections.actions2.resource_owner,`+
` projections.actions2.sequence,`+
` projections.actions2.action_state,`+
` projections.actions2.name,`+
` projections.actions2.script,`+
` projections.actions2.timeout,`+
` projections.actions2.allowed_to_fail`+
` FROM projections.actions2`),
regexp.QuoteMeta(`SELECT projections.actions3.id,`+
` projections.actions3.creation_date,`+
` projections.actions3.change_date,`+
` projections.actions3.resource_owner,`+
` projections.actions3.sequence,`+
` projections.actions3.action_state,`+
` projections.actions3.name,`+
` projections.actions3.script,`+
` projections.actions3.timeout,`+
` projections.actions3.allowed_to_fail`+
` FROM projections.actions3`),
[]string{
"id",
"creation_date",
@@ -319,17 +319,17 @@ func Test_ActionPrepares(t *testing.T) {
prepare: prepareActionQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.actions2.id,`+
` projections.actions2.creation_date,`+
` projections.actions2.change_date,`+
` projections.actions2.resource_owner,`+
` projections.actions2.sequence,`+
` projections.actions2.action_state,`+
` projections.actions2.name,`+
` projections.actions2.script,`+
` projections.actions2.timeout,`+
` projections.actions2.allowed_to_fail`+
` FROM projections.actions2`),
regexp.QuoteMeta(`SELECT projections.actions3.id,`+
` projections.actions3.creation_date,`+
` projections.actions3.change_date,`+
` projections.actions3.resource_owner,`+
` projections.actions3.sequence,`+
` projections.actions3.action_state,`+
` projections.actions3.name,`+
` projections.actions3.script,`+
` projections.actions3.timeout,`+
` projections.actions3.allowed_to_fail`+
` FROM projections.actions3`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
+108 -82
View File
@@ -122,6 +122,10 @@ var (
name: projection.AppColumnSequence,
table: appsTable,
}
AppColumnOwnerRemoved = Column{
name: projection.AppColumnOwnerRemoved,
table: appsTable,
}
)
var (
@@ -237,19 +241,21 @@ var (
}
)
func (q *Queries) AppByProjectAndAppID(ctx context.Context, shouldTriggerBulk bool, projectID, appID string) (*App, error) {
func (q *Queries) AppByProjectAndAppID(ctx context.Context, shouldTriggerBulk bool, projectID, appID string, withOwnerRemoved bool) (*App, error) {
if shouldTriggerBulk {
projection.AppProjection.Trigger(ctx)
}
stmt, scan := prepareAppQuery()
query, args, err := stmt.Where(
sq.Eq{
AppColumnID.identifier(): appID,
AppColumnProjectID.identifier(): projectID,
AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
).ToSql()
eq := sq.Eq{
AppColumnID.identifier(): appID,
AppColumnProjectID.identifier(): projectID,
AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[AppColumnOwnerRemoved.identifier()] = false
}
query, args, err := stmt.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-AFDgg", "Errors.Query.SQLStatement")
}
@@ -258,14 +264,16 @@ func (q *Queries) AppByProjectAndAppID(ctx context.Context, shouldTriggerBulk bo
return scan(row)
}
func (q *Queries) AppByID(ctx context.Context, appID string) (*App, error) {
func (q *Queries) AppByID(ctx context.Context, appID string, withOwnerRemoved bool) (*App, error) {
stmt, scan := prepareAppQuery()
query, args, err := stmt.Where(
sq.Eq{
AppColumnID.identifier(): appID,
AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
).ToSql()
eq := sq.Eq{
AppColumnID.identifier(): appID,
AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[AppColumnOwnerRemoved.identifier()] = false
}
query, args, err := stmt.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-immt9", "Errors.Query.SQLStatement")
}
@@ -274,14 +282,16 @@ func (q *Queries) AppByID(ctx context.Context, appID string) (*App, error) {
return scan(row)
}
func (q *Queries) AppBySAMLEntityID(ctx context.Context, entityID string) (*App, error) {
func (q *Queries) AppBySAMLEntityID(ctx context.Context, entityID string, withOwnerRemoved bool) (*App, error) {
stmt, scan := prepareAppQuery()
query, args, err := stmt.Where(
sq.Eq{
AppSAMLConfigColumnEntityID.identifier(): entityID,
AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
).ToSql()
eq := sq.Eq{
AppSAMLConfigColumnEntityID.identifier(): entityID,
AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[AppColumnOwnerRemoved.identifier()] = false
}
query, args, err := stmt.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-JgUop", "Errors.Query.SQLStatement")
}
@@ -290,18 +300,20 @@ func (q *Queries) AppBySAMLEntityID(ctx context.Context, entityID string) (*App,
return scan(row)
}
func (q *Queries) ProjectByClientID(ctx context.Context, appID string) (*Project, error) {
func (q *Queries) ProjectByClientID(ctx context.Context, appID string, withOwnerRemoved bool) (*Project, error) {
stmt, scan := prepareProjectByAppQuery()
query, args, err := stmt.Where(
sq.And{
sq.Eq{AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()},
sq.Or{
sq.Eq{AppOIDCConfigColumnClientID.identifier(): appID},
sq.Eq{AppAPIConfigColumnClientID.identifier(): appID},
sq.Eq{AppSAMLConfigColumnAppID.identifier(): appID},
},
eq := sq.Eq{AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
eq[ProjectColumnOwnerRemoved.identifier()] = false
}
query, args, err := stmt.Where(sq.And{
eq,
sq.Or{
sq.Eq{AppOIDCConfigColumnClientID.identifier(): appID},
sq.Eq{AppAPIConfigColumnClientID.identifier(): appID},
sq.Eq{AppSAMLConfigColumnAppID.identifier(): appID},
},
).ToSql()
}).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-XhJi3", "Errors.Query.SQLStatement")
}
@@ -310,14 +322,16 @@ func (q *Queries) ProjectByClientID(ctx context.Context, appID string) (*Project
return scan(row)
}
func (q *Queries) ProjectIDFromOIDCClientID(ctx context.Context, appID string) (string, error) {
func (q *Queries) ProjectIDFromOIDCClientID(ctx context.Context, appID string, withOwnerRemoved bool) (string, error) {
stmt, scan := prepareProjectIDByAppQuery()
query, args, err := stmt.Where(
sq.Eq{
AppOIDCConfigColumnClientID.identifier(): appID,
AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
).ToSql()
eq := sq.Eq{
AppOIDCConfigColumnClientID.identifier(): appID,
AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[AppColumnOwnerRemoved.identifier()] = false
}
query, args, err := stmt.Where(eq).ToSql()
if err != nil {
return "", errors.ThrowInternal(err, "QUERY-7d92U", "Errors.Query.SQLStatement")
}
@@ -326,18 +340,21 @@ func (q *Queries) ProjectIDFromOIDCClientID(ctx context.Context, appID string) (
return scan(row)
}
func (q *Queries) ProjectIDFromClientID(ctx context.Context, appID string) (string, error) {
func (q *Queries) ProjectIDFromClientID(ctx context.Context, appID string, withOwnerRemoved bool) (string, error) {
stmt, scan := prepareProjectIDByAppQuery()
query, args, err := stmt.Where(
sq.And{
sq.Eq{AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()},
sq.Or{
sq.Eq{AppOIDCConfigColumnClientID.identifier(): appID},
sq.Eq{AppAPIConfigColumnClientID.identifier(): appID},
sq.Eq{AppSAMLConfigColumnAppID.identifier(): appID},
},
eq := sq.Eq{AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
eq[AppColumnOwnerRemoved.identifier()] = false
}
where := sq.And{
eq,
sq.Or{
sq.Eq{AppOIDCConfigColumnClientID.identifier(): appID},
sq.Eq{AppAPIConfigColumnClientID.identifier(): appID},
sq.Eq{AppSAMLConfigColumnAppID.identifier(): appID},
},
).ToSql()
}
query, args, err := stmt.Where(where).ToSql()
if err != nil {
return "", errors.ThrowInternal(err, "QUERY-SDfg3", "Errors.Query.SQLStatement")
}
@@ -346,14 +363,16 @@ func (q *Queries) ProjectIDFromClientID(ctx context.Context, appID string) (stri
return scan(row)
}
func (q *Queries) ProjectByOIDCClientID(ctx context.Context, id string) (*Project, error) {
func (q *Queries) ProjectByOIDCClientID(ctx context.Context, id string, withOwnerRemoved bool) (*Project, error) {
stmt, scan := prepareProjectByAppQuery()
query, args, err := stmt.Where(
sq.Eq{
AppOIDCConfigColumnClientID.identifier(): id,
AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
).ToSql()
eq := sq.Eq{
AppOIDCConfigColumnClientID.identifier(): id,
AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[AppColumnOwnerRemoved.identifier()] = false
}
query, args, err := stmt.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-XhJi4", "Errors.Query.SQLStatement")
}
@@ -362,14 +381,16 @@ func (q *Queries) ProjectByOIDCClientID(ctx context.Context, id string) (*Projec
return scan(row)
}
func (q *Queries) AppByOIDCClientID(ctx context.Context, clientID string) (*App, error) {
func (q *Queries) AppByOIDCClientID(ctx context.Context, clientID string, withOwnerRemoved bool) (*App, error) {
stmt, scan := prepareAppQuery()
query, args, err := stmt.Where(
sq.Eq{
AppOIDCConfigColumnClientID.identifier(): clientID,
AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
).ToSql()
eq := sq.Eq{
AppOIDCConfigColumnClientID.identifier(): clientID,
AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[AppColumnOwnerRemoved.identifier()] = false
}
query, args, err := stmt.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-JgVop", "Errors.Query.SQLStatement")
}
@@ -378,17 +399,20 @@ func (q *Queries) AppByOIDCClientID(ctx context.Context, clientID string) (*App,
return scan(row)
}
func (q *Queries) AppByClientID(ctx context.Context, clientID string) (*App, error) {
func (q *Queries) AppByClientID(ctx context.Context, clientID string, withOwnerRemoved bool) (*App, error) {
stmt, scan := prepareAppQuery()
query, args, err := stmt.Where(
sq.And{
sq.Eq{AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()},
sq.Or{
sq.Eq{AppOIDCConfigColumnClientID.identifier(): clientID},
sq.Eq{AppAPIConfigColumnClientID.identifier(): clientID},
},
var eq []sq.Sqlizer
eq = append(eq, sq.And{
sq.Eq{AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()},
sq.Or{
sq.Eq{AppOIDCConfigColumnClientID.identifier(): clientID},
sq.Eq{AppAPIConfigColumnClientID.identifier(): clientID},
},
).ToSql()
})
if !withOwnerRemoved {
eq = append(eq, sq.Eq{AppColumnOwnerRemoved.identifier(): false})
}
query, args, err := stmt.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-Dfge2", "Errors.Query.SQLStatement")
}
@@ -397,12 +421,13 @@ func (q *Queries) AppByClientID(ctx context.Context, clientID string) (*App, err
return scan(row)
}
func (q *Queries) SearchApps(ctx context.Context, queries *AppSearchQueries) (*Apps, error) {
func (q *Queries) SearchApps(ctx context.Context, queries *AppSearchQueries, withOwnerRemoved bool) (*Apps, error) {
query, scan := prepareAppsQuery()
stmt, args, err := queries.toQuery(query).
Where(
sq.Eq{AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()},
).ToSql()
eq := sq.Eq{AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
eq[AppColumnOwnerRemoved.identifier()] = false
}
stmt, args, err := queries.toQuery(query).Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-fajp8", "Errors.Query.InvalidRequest")
}
@@ -419,12 +444,13 @@ func (q *Queries) SearchApps(ctx context.Context, queries *AppSearchQueries) (*A
return apps, err
}
func (q *Queries) SearchClientIDs(ctx context.Context, queries *AppSearchQueries) ([]string, error) {
func (q *Queries) SearchClientIDs(ctx context.Context, queries *AppSearchQueries, withOwnerRemoved bool) ([]string, error) {
query, scan := prepareClientIDsQuery()
stmt, args, err := queries.toQuery(query).
Where(
sq.Eq{AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()},
).ToSql()
eq := sq.Eq{AppColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
eq[AppColumnOwnerRemoved.identifier()] = false
}
stmt, args, err := queries.toQuery(query).Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-fajp8", "Errors.Query.InvalidRequest")
}
+96 -96
View File
@@ -15,109 +15,109 @@ import (
)
var (
expectedAppQuery = regexp.QuoteMeta(`SELECT projections.apps3.id,` +
` projections.apps3.name,` +
` projections.apps3.project_id,` +
` projections.apps3.creation_date,` +
` projections.apps3.change_date,` +
` projections.apps3.resource_owner,` +
` projections.apps3.state,` +
` projections.apps3.sequence,` +
expectedAppQuery = regexp.QuoteMeta(`SELECT projections.apps4.id,` +
` projections.apps4.name,` +
` projections.apps4.project_id,` +
` projections.apps4.creation_date,` +
` projections.apps4.change_date,` +
` projections.apps4.resource_owner,` +
` projections.apps4.state,` +
` projections.apps4.sequence,` +
// api config
` projections.apps3_api_configs.app_id,` +
` projections.apps3_api_configs.client_id,` +
` projections.apps3_api_configs.auth_method,` +
` projections.apps4_api_configs.app_id,` +
` projections.apps4_api_configs.client_id,` +
` projections.apps4_api_configs.auth_method,` +
// oidc config
` projections.apps3_oidc_configs.app_id,` +
` projections.apps3_oidc_configs.version,` +
` projections.apps3_oidc_configs.client_id,` +
` projections.apps3_oidc_configs.redirect_uris,` +
` projections.apps3_oidc_configs.response_types,` +
` projections.apps3_oidc_configs.grant_types,` +
` projections.apps3_oidc_configs.application_type,` +
` projections.apps3_oidc_configs.auth_method_type,` +
` projections.apps3_oidc_configs.post_logout_redirect_uris,` +
` projections.apps3_oidc_configs.is_dev_mode,` +
` projections.apps3_oidc_configs.access_token_type,` +
` projections.apps3_oidc_configs.access_token_role_assertion,` +
` projections.apps3_oidc_configs.id_token_role_assertion,` +
` projections.apps3_oidc_configs.id_token_userinfo_assertion,` +
` projections.apps3_oidc_configs.clock_skew,` +
` projections.apps3_oidc_configs.additional_origins,` +
` projections.apps4_oidc_configs.app_id,` +
` projections.apps4_oidc_configs.version,` +
` projections.apps4_oidc_configs.client_id,` +
` projections.apps4_oidc_configs.redirect_uris,` +
` projections.apps4_oidc_configs.response_types,` +
` projections.apps4_oidc_configs.grant_types,` +
` projections.apps4_oidc_configs.application_type,` +
` projections.apps4_oidc_configs.auth_method_type,` +
` projections.apps4_oidc_configs.post_logout_redirect_uris,` +
` projections.apps4_oidc_configs.is_dev_mode,` +
` projections.apps4_oidc_configs.access_token_type,` +
` projections.apps4_oidc_configs.access_token_role_assertion,` +
` projections.apps4_oidc_configs.id_token_role_assertion,` +
` projections.apps4_oidc_configs.id_token_userinfo_assertion,` +
` projections.apps4_oidc_configs.clock_skew,` +
` projections.apps4_oidc_configs.additional_origins,` +
//saml config
` projections.apps3_saml_configs.app_id,` +
` projections.apps3_saml_configs.entity_id,` +
` projections.apps3_saml_configs.metadata,` +
` projections.apps3_saml_configs.metadata_url` +
` FROM projections.apps3` +
` LEFT JOIN projections.apps3_api_configs ON projections.apps3.id = projections.apps3_api_configs.app_id AND projections.apps3.instance_id = projections.apps3_api_configs.instance_id` +
` LEFT JOIN projections.apps3_oidc_configs ON projections.apps3.id = projections.apps3_oidc_configs.app_id AND projections.apps3.instance_id = projections.apps3_oidc_configs.instance_id` +
` LEFT JOIN projections.apps3_saml_configs ON projections.apps3.id = projections.apps3_saml_configs.app_id AND projections.apps3.instance_id = projections.apps3_saml_configs.instance_id`)
expectedAppsQuery = regexp.QuoteMeta(`SELECT projections.apps3.id,` +
` projections.apps3.name,` +
` projections.apps3.project_id,` +
` projections.apps3.creation_date,` +
` projections.apps3.change_date,` +
` projections.apps3.resource_owner,` +
` projections.apps3.state,` +
` projections.apps3.sequence,` +
` projections.apps4_saml_configs.app_id,` +
` projections.apps4_saml_configs.entity_id,` +
` projections.apps4_saml_configs.metadata,` +
` projections.apps4_saml_configs.metadata_url` +
` FROM projections.apps4` +
` LEFT JOIN projections.apps4_api_configs ON projections.apps4.id = projections.apps4_api_configs.app_id AND projections.apps4.instance_id = projections.apps4_api_configs.instance_id` +
` LEFT JOIN projections.apps4_oidc_configs ON projections.apps4.id = projections.apps4_oidc_configs.app_id AND projections.apps4.instance_id = projections.apps4_oidc_configs.instance_id` +
` LEFT JOIN projections.apps4_saml_configs ON projections.apps4.id = projections.apps4_saml_configs.app_id AND projections.apps4.instance_id = projections.apps4_saml_configs.instance_id`)
expectedAppsQuery = regexp.QuoteMeta(`SELECT projections.apps4.id,` +
` projections.apps4.name,` +
` projections.apps4.project_id,` +
` projections.apps4.creation_date,` +
` projections.apps4.change_date,` +
` projections.apps4.resource_owner,` +
` projections.apps4.state,` +
` projections.apps4.sequence,` +
// api config
` projections.apps3_api_configs.app_id,` +
` projections.apps3_api_configs.client_id,` +
` projections.apps3_api_configs.auth_method,` +
` projections.apps4_api_configs.app_id,` +
` projections.apps4_api_configs.client_id,` +
` projections.apps4_api_configs.auth_method,` +
// oidc config
` projections.apps3_oidc_configs.app_id,` +
` projections.apps3_oidc_configs.version,` +
` projections.apps3_oidc_configs.client_id,` +
` projections.apps3_oidc_configs.redirect_uris,` +
` projections.apps3_oidc_configs.response_types,` +
` projections.apps3_oidc_configs.grant_types,` +
` projections.apps3_oidc_configs.application_type,` +
` projections.apps3_oidc_configs.auth_method_type,` +
` projections.apps3_oidc_configs.post_logout_redirect_uris,` +
` projections.apps3_oidc_configs.is_dev_mode,` +
` projections.apps3_oidc_configs.access_token_type,` +
` projections.apps3_oidc_configs.access_token_role_assertion,` +
` projections.apps3_oidc_configs.id_token_role_assertion,` +
` projections.apps3_oidc_configs.id_token_userinfo_assertion,` +
` projections.apps3_oidc_configs.clock_skew,` +
` projections.apps3_oidc_configs.additional_origins,` +
` projections.apps4_oidc_configs.app_id,` +
` projections.apps4_oidc_configs.version,` +
` projections.apps4_oidc_configs.client_id,` +
` projections.apps4_oidc_configs.redirect_uris,` +
` projections.apps4_oidc_configs.response_types,` +
` projections.apps4_oidc_configs.grant_types,` +
` projections.apps4_oidc_configs.application_type,` +
` projections.apps4_oidc_configs.auth_method_type,` +
` projections.apps4_oidc_configs.post_logout_redirect_uris,` +
` projections.apps4_oidc_configs.is_dev_mode,` +
` projections.apps4_oidc_configs.access_token_type,` +
` projections.apps4_oidc_configs.access_token_role_assertion,` +
` projections.apps4_oidc_configs.id_token_role_assertion,` +
` projections.apps4_oidc_configs.id_token_userinfo_assertion,` +
` projections.apps4_oidc_configs.clock_skew,` +
` projections.apps4_oidc_configs.additional_origins,` +
//saml config
` projections.apps3_saml_configs.app_id,` +
` projections.apps3_saml_configs.entity_id,` +
` projections.apps3_saml_configs.metadata,` +
` projections.apps3_saml_configs.metadata_url,` +
` projections.apps4_saml_configs.app_id,` +
` projections.apps4_saml_configs.entity_id,` +
` projections.apps4_saml_configs.metadata,` +
` projections.apps4_saml_configs.metadata_url,` +
` COUNT(*) OVER ()` +
` FROM projections.apps3` +
` LEFT JOIN projections.apps3_api_configs ON projections.apps3.id = projections.apps3_api_configs.app_id AND projections.apps3.instance_id = projections.apps3_api_configs.instance_id` +
` LEFT JOIN projections.apps3_oidc_configs ON projections.apps3.id = projections.apps3_oidc_configs.app_id AND projections.apps3.instance_id = projections.apps3_oidc_configs.instance_id` +
` LEFT JOIN projections.apps3_saml_configs ON projections.apps3.id = projections.apps3_saml_configs.app_id AND projections.apps3.instance_id = projections.apps3_saml_configs.instance_id`)
expectedAppIDsQuery = regexp.QuoteMeta(`SELECT projections.apps3_api_configs.client_id,` +
` projections.apps3_oidc_configs.client_id` +
` FROM projections.apps3` +
` LEFT JOIN projections.apps3_api_configs ON projections.apps3.id = projections.apps3_api_configs.app_id AND projections.apps3.instance_id = projections.apps3_api_configs.instance_id` +
` LEFT JOIN projections.apps3_oidc_configs ON projections.apps3.id = projections.apps3_oidc_configs.app_id AND projections.apps3.instance_id = projections.apps3_oidc_configs.instance_id`)
expectedProjectIDByAppQuery = regexp.QuoteMeta(`SELECT projections.apps3.project_id` +
` FROM projections.apps3` +
` LEFT JOIN projections.apps3_api_configs ON projections.apps3.id = projections.apps3_api_configs.app_id AND projections.apps3.instance_id = projections.apps3_api_configs.instance_id` +
` LEFT JOIN projections.apps3_oidc_configs ON projections.apps3.id = projections.apps3_oidc_configs.app_id AND projections.apps3.instance_id = projections.apps3_oidc_configs.instance_id` +
` LEFT JOIN projections.apps3_saml_configs ON projections.apps3.id = projections.apps3_saml_configs.app_id AND projections.apps3.instance_id = projections.apps3_saml_configs.instance_id`)
expectedProjectByAppQuery = regexp.QuoteMeta(`SELECT projections.projects2.id,` +
` projections.projects2.creation_date,` +
` projections.projects2.change_date,` +
` projections.projects2.resource_owner,` +
` projections.projects2.state,` +
` projections.projects2.sequence,` +
` projections.projects2.name,` +
` projections.projects2.project_role_assertion,` +
` projections.projects2.project_role_check,` +
` projections.projects2.has_project_check,` +
` projections.projects2.private_labeling_setting` +
` FROM projections.projects2` +
` JOIN projections.apps3 ON projections.projects2.id = projections.apps3.project_id AND projections.projects2.instance_id = projections.apps3.instance_id` +
` LEFT JOIN projections.apps3_api_configs ON projections.apps3.id = projections.apps3_api_configs.app_id AND projections.apps3.instance_id = projections.apps3_api_configs.instance_id` +
` LEFT JOIN projections.apps3_oidc_configs ON projections.apps3.id = projections.apps3_oidc_configs.app_id AND projections.apps3.instance_id = projections.apps3_oidc_configs.instance_id` +
` LEFT JOIN projections.apps3_saml_configs ON projections.apps3.id = projections.apps3_saml_configs.app_id AND projections.apps3.instance_id = projections.apps3_saml_configs.instance_id`)
` FROM projections.apps4` +
` LEFT JOIN projections.apps4_api_configs ON projections.apps4.id = projections.apps4_api_configs.app_id AND projections.apps4.instance_id = projections.apps4_api_configs.instance_id` +
` LEFT JOIN projections.apps4_oidc_configs ON projections.apps4.id = projections.apps4_oidc_configs.app_id AND projections.apps4.instance_id = projections.apps4_oidc_configs.instance_id` +
` LEFT JOIN projections.apps4_saml_configs ON projections.apps4.id = projections.apps4_saml_configs.app_id AND projections.apps4.instance_id = projections.apps4_saml_configs.instance_id`)
expectedAppIDsQuery = regexp.QuoteMeta(`SELECT projections.apps4_api_configs.client_id,` +
` projections.apps4_oidc_configs.client_id` +
` FROM projections.apps4` +
` LEFT JOIN projections.apps4_api_configs ON projections.apps4.id = projections.apps4_api_configs.app_id AND projections.apps4.instance_id = projections.apps4_api_configs.instance_id` +
` LEFT JOIN projections.apps4_oidc_configs ON projections.apps4.id = projections.apps4_oidc_configs.app_id AND projections.apps4.instance_id = projections.apps4_oidc_configs.instance_id`)
expectedProjectIDByAppQuery = regexp.QuoteMeta(`SELECT projections.apps4.project_id` +
` FROM projections.apps4` +
` LEFT JOIN projections.apps4_api_configs ON projections.apps4.id = projections.apps4_api_configs.app_id AND projections.apps4.instance_id = projections.apps4_api_configs.instance_id` +
` LEFT JOIN projections.apps4_oidc_configs ON projections.apps4.id = projections.apps4_oidc_configs.app_id AND projections.apps4.instance_id = projections.apps4_oidc_configs.instance_id` +
` LEFT JOIN projections.apps4_saml_configs ON projections.apps4.id = projections.apps4_saml_configs.app_id AND projections.apps4.instance_id = projections.apps4_saml_configs.instance_id`)
expectedProjectByAppQuery = regexp.QuoteMeta(`SELECT projections.projects3.id,` +
` projections.projects3.creation_date,` +
` projections.projects3.change_date,` +
` projections.projects3.resource_owner,` +
` projections.projects3.state,` +
` projections.projects3.sequence,` +
` projections.projects3.name,` +
` projections.projects3.project_role_assertion,` +
` projections.projects3.project_role_check,` +
` projections.projects3.has_project_check,` +
` projections.projects3.private_labeling_setting` +
` FROM projections.projects3` +
` JOIN projections.apps4 ON projections.projects3.id = projections.apps4.project_id AND projections.projects3.instance_id = projections.apps4.instance_id` +
` LEFT JOIN projections.apps4_api_configs ON projections.apps4.id = projections.apps4_api_configs.app_id AND projections.apps4.instance_id = projections.apps4_api_configs.instance_id` +
` LEFT JOIN projections.apps4_oidc_configs ON projections.apps4.id = projections.apps4_oidc_configs.app_id AND projections.apps4.instance_id = projections.apps4_oidc_configs.instance_id` +
` LEFT JOIN projections.apps4_saml_configs ON projections.apps4.id = projections.apps4_saml_configs.app_id AND projections.apps4.instance_id = projections.apps4_saml_configs.instance_id`)
appCols = database.StringArray{
"id",
+62 -25
View File
@@ -28,6 +28,10 @@ var (
name: projection.AuthNKeyCreationDateCol,
table: authNKeyTable,
}
AuthNKeyColumnChangeDate = Column{
name: projection.AuthNKeyChangeDateCol,
table: authNKeyTable,
}
AuthNKeyColumnResourceOwner = Column{
name: projection.AuthNKeyResourceOwnerCol,
table: authNKeyTable,
@@ -68,6 +72,10 @@ var (
name: projection.AuthNKeyEnabledCol,
table: authNKeyTable,
}
AuthNKeyOwnerRemovedCol = Column{
name: projection.AuthNKeyOwnerRemovedCol,
table: authNKeyTable,
}
)
type AuthNKeys struct {
@@ -78,6 +86,7 @@ type AuthNKeys struct {
type AuthNKey struct {
ID string
CreationDate time.Time
ChangeDate time.Time
ResourceOwner string
Sequence uint64
@@ -93,6 +102,7 @@ type AuthNKeysData struct {
type AuthNKeyData struct {
ID string
CreationDate time.Time
ChangeDate time.Time
ResourceOwner string
Sequence uint64
@@ -115,15 +125,17 @@ func (q *AuthNKeySearchQueries) toQuery(query sq.SelectBuilder) sq.SelectBuilder
return query
}
func (q *Queries) SearchAuthNKeys(ctx context.Context, queries *AuthNKeySearchQueries) (authNKeys *AuthNKeys, err error) {
func (q *Queries) SearchAuthNKeys(ctx context.Context, queries *AuthNKeySearchQueries, withOwnerRemoved bool) (authNKeys *AuthNKeys, err error) {
query, scan := prepareAuthNKeysQuery()
query = queries.toQuery(query)
stmt, args, err := query.Where(
sq.Eq{
AuthNKeyColumnEnabled.identifier(): true,
AuthNKeyColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
).ToSql()
eq := sq.Eq{
AuthNKeyColumnEnabled.identifier(): true,
AuthNKeyColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[AuthNKeyOwnerRemovedCol.identifier()] = false
}
stmt, args, err := query.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-SAf3f", "Errors.Query.InvalidRequest")
}
@@ -140,14 +152,17 @@ func (q *Queries) SearchAuthNKeys(ctx context.Context, queries *AuthNKeySearchQu
return authNKeys, err
}
func (q *Queries) SearchAuthNKeysData(ctx context.Context, queries *AuthNKeySearchQueries) (authNKeys *AuthNKeysData, err error) {
func (q *Queries) SearchAuthNKeysData(ctx context.Context, queries *AuthNKeySearchQueries, withOwnerRemoved bool) (authNKeys *AuthNKeysData, err error) {
query, scan := prepareAuthNKeysDataQuery()
query = queries.toQuery(query)
stmt, args, err := query.Where(
sq.Eq{
AuthNKeyColumnEnabled.identifier(): true,
},
).ToSql()
eq := sq.Eq{
AuthNKeyColumnEnabled.identifier(): true,
AuthNKeyColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[AuthNKeyOwnerRemovedCol.identifier()] = false
}
stmt, args, err := query.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-SAg3f", "Errors.Query.InvalidRequest")
}
@@ -164,7 +179,7 @@ func (q *Queries) SearchAuthNKeysData(ctx context.Context, queries *AuthNKeySear
return authNKeys, err
}
func (q *Queries) GetAuthNKeyByID(ctx context.Context, shouldTriggerBulk bool, id string, queries ...SearchQuery) (*AuthNKey, error) {
func (q *Queries) GetAuthNKeyByID(ctx context.Context, shouldTriggerBulk bool, id string, withOwnerRemoved bool, queries ...SearchQuery) (*AuthNKey, error) {
if shouldTriggerBulk {
projection.AuthNKeyProjection.Trigger(ctx)
}
@@ -173,12 +188,15 @@ func (q *Queries) GetAuthNKeyByID(ctx context.Context, shouldTriggerBulk bool, i
for _, q := range queries {
query = q.toQuery(query)
}
stmt, args, err := query.Where(
sq.Eq{
AuthNKeyColumnID.identifier(): id,
AuthNKeyColumnEnabled.identifier(): true,
AuthNKeyColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
eq := sq.Eq{
AuthNKeyColumnID.identifier(): id,
AuthNKeyColumnEnabled.identifier(): true,
AuthNKeyColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[AuthNKeyOwnerRemovedCol.identifier()] = false
}
stmt, args, err := query.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-AGhg4", "Errors.Query.SQLStatement")
}
@@ -187,21 +205,34 @@ func (q *Queries) GetAuthNKeyByID(ctx context.Context, shouldTriggerBulk bool, i
return scan(row)
}
func (q *Queries) GetAuthNKeyPublicKeyByIDAndIdentifier(ctx context.Context, id string, identifier string) ([]byte, error) {
func (q *Queries) GetAuthNKeyPublicKeyByIDAndIdentifier(ctx context.Context, id string, identifier string, withOwnerRemoved bool) ([]byte, error) {
stmt, scan := prepareAuthNKeyPublicKeyQuery()
query, args, err := stmt.Where(
sq.And{
eq := sq.And{
sq.Eq{
AuthNKeyColumnID.identifier(): id,
AuthNKeyColumnIdentifier.identifier(): identifier,
AuthNKeyColumnEnabled.identifier(): true,
AuthNKeyColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
sq.Gt{
AuthNKeyColumnExpiration.identifier(): time.Now(),
},
}
if !withOwnerRemoved {
eq = sq.And{
sq.Eq{
AuthNKeyColumnID.identifier(): id,
AuthNKeyColumnIdentifier.identifier(): identifier,
AuthNKeyColumnEnabled.identifier(): true,
AuthNKeyColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
AuthNKeyOwnerRemovedCol.identifier(): false,
},
sq.Gt{
AuthNKeyColumnExpiration.identifier(): time.Now(),
},
},
).ToSql()
}
}
query, args, err := stmt.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-DAb32", "Errors.Query.SQLStatement")
}
@@ -226,6 +257,7 @@ func prepareAuthNKeysQuery() (sq.SelectBuilder, func(rows *sql.Rows) (*AuthNKeys
return sq.Select(
AuthNKeyColumnID.identifier(),
AuthNKeyColumnCreationDate.identifier(),
AuthNKeyColumnChangeDate.identifier(),
AuthNKeyColumnResourceOwner.identifier(),
AuthNKeyColumnSequence.identifier(),
AuthNKeyColumnExpiration.identifier(),
@@ -240,6 +272,7 @@ func prepareAuthNKeysQuery() (sq.SelectBuilder, func(rows *sql.Rows) (*AuthNKeys
err := rows.Scan(
&authNKey.ID,
&authNKey.CreationDate,
&authNKey.ChangeDate,
&authNKey.ResourceOwner,
&authNKey.Sequence,
&authNKey.Expiration,
@@ -269,6 +302,7 @@ func prepareAuthNKeyQuery() (sq.SelectBuilder, func(row *sql.Row) (*AuthNKey, er
return sq.Select(
AuthNKeyColumnID.identifier(),
AuthNKeyColumnCreationDate.identifier(),
AuthNKeyColumnChangeDate.identifier(),
AuthNKeyColumnResourceOwner.identifier(),
AuthNKeyColumnSequence.identifier(),
AuthNKeyColumnExpiration.identifier(),
@@ -279,6 +313,7 @@ func prepareAuthNKeyQuery() (sq.SelectBuilder, func(row *sql.Row) (*AuthNKey, er
err := row.Scan(
&authNKey.ID,
&authNKey.CreationDate,
&authNKey.ChangeDate,
&authNKey.ResourceOwner,
&authNKey.Sequence,
&authNKey.Expiration,
@@ -317,6 +352,7 @@ func prepareAuthNKeysDataQuery() (sq.SelectBuilder, func(rows *sql.Rows) (*AuthN
return sq.Select(
AuthNKeyColumnID.identifier(),
AuthNKeyColumnCreationDate.identifier(),
AuthNKeyColumnChangeDate.identifier(),
AuthNKeyColumnResourceOwner.identifier(),
AuthNKeyColumnSequence.identifier(),
AuthNKeyColumnExpiration.identifier(),
@@ -333,6 +369,7 @@ func prepareAuthNKeysDataQuery() (sq.SelectBuilder, func(rows *sql.Rows) (*AuthN
err := rows.Scan(
&authNKey.ID,
&authNKey.CreationDate,
&authNKey.ChangeDate,
&authNKey.ResourceOwner,
&authNKey.Sequence,
&authNKey.Expiration,
+121 -91
View File
@@ -28,14 +28,15 @@ func Test_AuthNKeyPrepares(t *testing.T) {
prepare: prepareAuthNKeysQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.authn_keys.id,`+
` projections.authn_keys.creation_date,`+
` projections.authn_keys.resource_owner,`+
` projections.authn_keys.sequence,`+
` projections.authn_keys.expiration,`+
` projections.authn_keys.type,`+
regexp.QuoteMeta(`SELECT projections.authn_keys2.id,`+
` projections.authn_keys2.creation_date,`+
` projections.authn_keys2.change_date,`+
` projections.authn_keys2.resource_owner,`+
` projections.authn_keys2.sequence,`+
` projections.authn_keys2.expiration,`+
` projections.authn_keys2.type,`+
` COUNT(*) OVER ()`+
` FROM projections.authn_keys`),
` FROM projections.authn_keys2`),
nil,
nil,
),
@@ -47,17 +48,19 @@ func Test_AuthNKeyPrepares(t *testing.T) {
prepare: prepareAuthNKeysQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.authn_keys.id,`+
` projections.authn_keys.creation_date,`+
` projections.authn_keys.resource_owner,`+
` projections.authn_keys.sequence,`+
` projections.authn_keys.expiration,`+
` projections.authn_keys.type,`+
regexp.QuoteMeta(`SELECT projections.authn_keys2.id,`+
` projections.authn_keys2.creation_date,`+
` projections.authn_keys2.change_date,`+
` projections.authn_keys2.resource_owner,`+
` projections.authn_keys2.sequence,`+
` projections.authn_keys2.expiration,`+
` projections.authn_keys2.type,`+
` COUNT(*) OVER ()`+
` FROM projections.authn_keys`),
` FROM projections.authn_keys2`),
[]string{
"id",
"creation_date",
"change_date",
"resource_owner",
"sequence",
"expiration",
@@ -68,6 +71,7 @@ func Test_AuthNKeyPrepares(t *testing.T) {
{
"id",
testNow,
testNow,
"ro",
uint64(20211109),
testNow,
@@ -84,6 +88,7 @@ func Test_AuthNKeyPrepares(t *testing.T) {
{
ID: "id",
CreationDate: testNow,
ChangeDate: testNow,
ResourceOwner: "ro",
Sequence: 20211109,
Expiration: testNow,
@@ -97,17 +102,19 @@ func Test_AuthNKeyPrepares(t *testing.T) {
prepare: prepareAuthNKeysQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.authn_keys.id,`+
` projections.authn_keys.creation_date,`+
` projections.authn_keys.resource_owner,`+
` projections.authn_keys.sequence,`+
` projections.authn_keys.expiration,`+
` projections.authn_keys.type,`+
regexp.QuoteMeta(`SELECT projections.authn_keys2.id,`+
` projections.authn_keys2.creation_date,`+
` projections.authn_keys2.change_date,`+
` projections.authn_keys2.resource_owner,`+
` projections.authn_keys2.sequence,`+
` projections.authn_keys2.expiration,`+
` projections.authn_keys2.type,`+
` COUNT(*) OVER ()`+
` FROM projections.authn_keys`),
` FROM projections.authn_keys2`),
[]string{
"id",
"creation_date",
"change_date",
"resource_owner",
"sequence",
"expiration",
@@ -118,6 +125,7 @@ func Test_AuthNKeyPrepares(t *testing.T) {
{
"id-1",
testNow,
testNow,
"ro",
uint64(20211109),
testNow,
@@ -126,6 +134,7 @@ func Test_AuthNKeyPrepares(t *testing.T) {
{
"id-2",
testNow,
testNow,
"ro",
uint64(20211109),
testNow,
@@ -142,6 +151,7 @@ func Test_AuthNKeyPrepares(t *testing.T) {
{
ID: "id-1",
CreationDate: testNow,
ChangeDate: testNow,
ResourceOwner: "ro",
Sequence: 20211109,
Expiration: testNow,
@@ -150,6 +160,7 @@ func Test_AuthNKeyPrepares(t *testing.T) {
{
ID: "id-2",
CreationDate: testNow,
ChangeDate: testNow,
ResourceOwner: "ro",
Sequence: 20211109,
Expiration: testNow,
@@ -163,14 +174,15 @@ func Test_AuthNKeyPrepares(t *testing.T) {
prepare: prepareAuthNKeysQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.authn_keys.id,`+
` projections.authn_keys.creation_date,`+
` projections.authn_keys.resource_owner,`+
` projections.authn_keys.sequence,`+
` projections.authn_keys.expiration,`+
` projections.authn_keys.type,`+
regexp.QuoteMeta(`SELECT projections.authn_keys2.id,`+
` projections.authn_keys2.creation_date,`+
` projections.authn_keys2.change_date,`+
` projections.authn_keys2.resource_owner,`+
` projections.authn_keys2.sequence,`+
` projections.authn_keys2.expiration,`+
` projections.authn_keys2.type,`+
` COUNT(*) OVER ()`+
` FROM projections.authn_keys`),
` FROM projections.authn_keys2`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
@@ -187,16 +199,17 @@ func Test_AuthNKeyPrepares(t *testing.T) {
prepare: prepareAuthNKeysDataQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.authn_keys.id,`+
` projections.authn_keys.creation_date,`+
` projections.authn_keys.resource_owner,`+
` projections.authn_keys.sequence,`+
` projections.authn_keys.expiration,`+
` projections.authn_keys.type,`+
` projections.authn_keys.identifier,`+
` projections.authn_keys.public_key,`+
regexp.QuoteMeta(`SELECT projections.authn_keys2.id,`+
` projections.authn_keys2.creation_date,`+
` projections.authn_keys2.change_date,`+
` projections.authn_keys2.resource_owner,`+
` projections.authn_keys2.sequence,`+
` projections.authn_keys2.expiration,`+
` projections.authn_keys2.type,`+
` projections.authn_keys2.identifier,`+
` projections.authn_keys2.public_key,`+
` COUNT(*) OVER ()`+
` FROM projections.authn_keys`),
` FROM projections.authn_keys2`),
nil,
nil,
),
@@ -208,19 +221,21 @@ func Test_AuthNKeyPrepares(t *testing.T) {
prepare: prepareAuthNKeysDataQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.authn_keys.id,`+
` projections.authn_keys.creation_date,`+
` projections.authn_keys.resource_owner,`+
` projections.authn_keys.sequence,`+
` projections.authn_keys.expiration,`+
` projections.authn_keys.type,`+
` projections.authn_keys.identifier,`+
` projections.authn_keys.public_key,`+
regexp.QuoteMeta(`SELECT projections.authn_keys2.id,`+
` projections.authn_keys2.creation_date,`+
` projections.authn_keys2.change_date,`+
` projections.authn_keys2.resource_owner,`+
` projections.authn_keys2.sequence,`+
` projections.authn_keys2.expiration,`+
` projections.authn_keys2.type,`+
` projections.authn_keys2.identifier,`+
` projections.authn_keys2.public_key,`+
` COUNT(*) OVER ()`+
` FROM projections.authn_keys`),
` FROM projections.authn_keys2`),
[]string{
"id",
"creation_date",
"change_date",
"resource_owner",
"sequence",
"expiration",
@@ -233,6 +248,7 @@ func Test_AuthNKeyPrepares(t *testing.T) {
{
"id",
testNow,
testNow,
"ro",
uint64(20211109),
testNow,
@@ -251,6 +267,7 @@ func Test_AuthNKeyPrepares(t *testing.T) {
{
ID: "id",
CreationDate: testNow,
ChangeDate: testNow,
ResourceOwner: "ro",
Sequence: 20211109,
Expiration: testNow,
@@ -266,19 +283,21 @@ func Test_AuthNKeyPrepares(t *testing.T) {
prepare: prepareAuthNKeysDataQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.authn_keys.id,`+
` projections.authn_keys.creation_date,`+
` projections.authn_keys.resource_owner,`+
` projections.authn_keys.sequence,`+
` projections.authn_keys.expiration,`+
` projections.authn_keys.type,`+
` projections.authn_keys.identifier,`+
` projections.authn_keys.public_key,`+
regexp.QuoteMeta(`SELECT projections.authn_keys2.id,`+
` projections.authn_keys2.creation_date,`+
` projections.authn_keys2.change_date,`+
` projections.authn_keys2.resource_owner,`+
` projections.authn_keys2.sequence,`+
` projections.authn_keys2.expiration,`+
` projections.authn_keys2.type,`+
` projections.authn_keys2.identifier,`+
` projections.authn_keys2.public_key,`+
` COUNT(*) OVER ()`+
` FROM projections.authn_keys`),
` FROM projections.authn_keys2`),
[]string{
"id",
"creation_date",
"change_date",
"resource_owner",
"sequence",
"expiration",
@@ -291,6 +310,7 @@ func Test_AuthNKeyPrepares(t *testing.T) {
{
"id-1",
testNow,
testNow,
"ro",
uint64(20211109),
testNow,
@@ -301,6 +321,7 @@ func Test_AuthNKeyPrepares(t *testing.T) {
{
"id-2",
testNow,
testNow,
"ro",
uint64(20211109),
testNow,
@@ -319,6 +340,7 @@ func Test_AuthNKeyPrepares(t *testing.T) {
{
ID: "id-1",
CreationDate: testNow,
ChangeDate: testNow,
ResourceOwner: "ro",
Sequence: 20211109,
Expiration: testNow,
@@ -329,6 +351,7 @@ func Test_AuthNKeyPrepares(t *testing.T) {
{
ID: "id-2",
CreationDate: testNow,
ChangeDate: testNow,
ResourceOwner: "ro",
Sequence: 20211109,
Expiration: testNow,
@@ -344,16 +367,17 @@ func Test_AuthNKeyPrepares(t *testing.T) {
prepare: prepareAuthNKeysDataQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.authn_keys.id,`+
` projections.authn_keys.creation_date,`+
` projections.authn_keys.resource_owner,`+
` projections.authn_keys.sequence,`+
` projections.authn_keys.expiration,`+
` projections.authn_keys.type,`+
` projections.authn_keys.identifier,`+
` projections.authn_keys.public_key,`+
regexp.QuoteMeta(`SELECT projections.authn_keys2.id,`+
` projections.authn_keys2.creation_date,`+
` projections.authn_keys2.change_date,`+
` projections.authn_keys2.resource_owner,`+
` projections.authn_keys2.sequence,`+
` projections.authn_keys2.expiration,`+
` projections.authn_keys2.type,`+
` projections.authn_keys2.identifier,`+
` projections.authn_keys2.public_key,`+
` COUNT(*) OVER ()`+
` FROM projections.authn_keys`),
` FROM projections.authn_keys2`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
@@ -370,13 +394,14 @@ func Test_AuthNKeyPrepares(t *testing.T) {
prepare: prepareAuthNKeyQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.authn_keys.id,`+
` projections.authn_keys.creation_date,`+
` projections.authn_keys.resource_owner,`+
` projections.authn_keys.sequence,`+
` projections.authn_keys.expiration,`+
` projections.authn_keys.type`+
` FROM projections.authn_keys`),
regexp.QuoteMeta(`SELECT projections.authn_keys2.id,`+
` projections.authn_keys2.creation_date,`+
` projections.authn_keys2.change_date,`+
` projections.authn_keys2.resource_owner,`+
` projections.authn_keys2.sequence,`+
` projections.authn_keys2.expiration,`+
` projections.authn_keys2.type`+
` FROM projections.authn_keys2`),
nil,
nil,
),
@@ -394,16 +419,18 @@ func Test_AuthNKeyPrepares(t *testing.T) {
prepare: prepareAuthNKeyQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.authn_keys.id,`+
` projections.authn_keys.creation_date,`+
` projections.authn_keys.resource_owner,`+
` projections.authn_keys.sequence,`+
` projections.authn_keys.expiration,`+
` projections.authn_keys.type`+
` FROM projections.authn_keys`),
regexp.QuoteMeta(`SELECT projections.authn_keys2.id,`+
` projections.authn_keys2.creation_date,`+
` projections.authn_keys2.change_date,`+
` projections.authn_keys2.resource_owner,`+
` projections.authn_keys2.sequence,`+
` projections.authn_keys2.expiration,`+
` projections.authn_keys2.type`+
` FROM projections.authn_keys2`),
[]string{
"id",
"creation_date",
"change_date",
"resource_owner",
"sequence",
"expiration",
@@ -412,6 +439,7 @@ func Test_AuthNKeyPrepares(t *testing.T) {
[]driver.Value{
"id",
testNow,
testNow,
"ro",
uint64(20211109),
testNow,
@@ -422,6 +450,7 @@ func Test_AuthNKeyPrepares(t *testing.T) {
object: &AuthNKey{
ID: "id",
CreationDate: testNow,
ChangeDate: testNow,
ResourceOwner: "ro",
Sequence: 20211109,
Expiration: testNow,
@@ -433,13 +462,14 @@ func Test_AuthNKeyPrepares(t *testing.T) {
prepare: prepareAuthNKeyQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.authn_keys.id,`+
` projections.authn_keys.creation_date,`+
` projections.authn_keys.resource_owner,`+
` projections.authn_keys.sequence,`+
` projections.authn_keys.expiration,`+
` projections.authn_keys.type`+
` FROM projections.authn_keys`),
regexp.QuoteMeta(`SELECT projections.authn_keys2.id,`+
` projections.authn_keys2.creation_date,`+
` projections.authn_keys2.change_date,`+
` projections.authn_keys2.resource_owner,`+
` projections.authn_keys2.sequence,`+
` projections.authn_keys2.expiration,`+
` projections.authn_keys2.type`+
` FROM projections.authn_keys2`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
@@ -456,8 +486,8 @@ func Test_AuthNKeyPrepares(t *testing.T) {
prepare: prepareAuthNKeyPublicKeyQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.authn_keys.public_key`+
` FROM projections.authn_keys`),
regexp.QuoteMeta(`SELECT projections.authn_keys2.public_key`+
` FROM projections.authn_keys2`),
nil,
nil,
),
@@ -475,8 +505,8 @@ func Test_AuthNKeyPrepares(t *testing.T) {
prepare: prepareAuthNKeyPublicKeyQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.authn_keys.public_key`+
` FROM projections.authn_keys`),
regexp.QuoteMeta(`SELECT projections.authn_keys2.public_key`+
` FROM projections.authn_keys2`),
[]string{
"public_key",
},
@@ -492,8 +522,8 @@ func Test_AuthNKeyPrepares(t *testing.T) {
prepare: prepareAuthNKeyPublicKeyQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.authn_keys.public_key`+
` FROM projections.authn_keys`),
regexp.QuoteMeta(`SELECT projections.authn_keys2.public_key`+
` FROM projections.authn_keys2`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
+4 -7
View File
@@ -75,13 +75,10 @@ func (q *Queries) ActiveCertificates(ctx context.Context, t time.Time, usage dom
KeyColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
KeyColUse.identifier(): usage,
},
sq.Gt{
CertificateColExpiry.identifier(): t,
},
sq.Gt{
KeyPrivateColExpiry.identifier(): t,
},
}).OrderBy(KeyPrivateColExpiry.identifier()).ToSql()
sq.Gt{CertificateColExpiry.identifier(): t},
sq.Gt{KeyPrivateColExpiry.identifier(): t},
},
).OrderBy(KeyPrivateColExpiry.identifier()).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-SDfkg", "Errors.Query.SQLStatement")
}
+39 -39
View File
@@ -29,20 +29,20 @@ func Test_CertificatePrepares(t *testing.T) {
prepare: prepareCertificateQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.keys3.id,`+
` projections.keys3.creation_date,`+
` projections.keys3.change_date,`+
` projections.keys3.sequence,`+
` projections.keys3.resource_owner,`+
` projections.keys3.algorithm,`+
` projections.keys3.use,`+
` projections.keys3_certificate.expiry,`+
` projections.keys3_certificate.certificate,`+
` projections.keys3_private.key,`+
regexp.QuoteMeta(`SELECT projections.keys4.id,`+
` projections.keys4.creation_date,`+
` projections.keys4.change_date,`+
` projections.keys4.sequence,`+
` projections.keys4.resource_owner,`+
` projections.keys4.algorithm,`+
` projections.keys4.use,`+
` projections.keys4_certificate.expiry,`+
` projections.keys4_certificate.certificate,`+
` projections.keys4_private.key,`+
` COUNT(*) OVER ()`+
` FROM projections.keys3`+
` LEFT JOIN projections.keys3_certificate ON projections.keys3.id = projections.keys3_certificate.id AND projections.keys3.instance_id = projections.keys3_certificate.instance_id`+
` LEFT JOIN projections.keys3_private ON projections.keys3.id = projections.keys3_private.id AND projections.keys3.instance_id = projections.keys3_private.instance_id`),
` FROM projections.keys4`+
` LEFT JOIN projections.keys4_certificate ON projections.keys4.id = projections.keys4_certificate.id AND projections.keys4.instance_id = projections.keys4_certificate.instance_id`+
` LEFT JOIN projections.keys4_private ON projections.keys4.id = projections.keys4_private.id AND projections.keys4.instance_id = projections.keys4_private.instance_id`),
nil,
nil,
),
@@ -60,20 +60,20 @@ func Test_CertificatePrepares(t *testing.T) {
prepare: prepareCertificateQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.keys3.id,`+
` projections.keys3.creation_date,`+
` projections.keys3.change_date,`+
` projections.keys3.sequence,`+
` projections.keys3.resource_owner,`+
` projections.keys3.algorithm,`+
` projections.keys3.use,`+
` projections.keys3_certificate.expiry,`+
` projections.keys3_certificate.certificate,`+
` projections.keys3_private.key,`+
regexp.QuoteMeta(`SELECT projections.keys4.id,`+
` projections.keys4.creation_date,`+
` projections.keys4.change_date,`+
` projections.keys4.sequence,`+
` projections.keys4.resource_owner,`+
` projections.keys4.algorithm,`+
` projections.keys4.use,`+
` projections.keys4_certificate.expiry,`+
` projections.keys4_certificate.certificate,`+
` projections.keys4_private.key,`+
` COUNT(*) OVER ()`+
` FROM projections.keys3`+
` LEFT JOIN projections.keys3_certificate ON projections.keys3.id = projections.keys3_certificate.id AND projections.keys3.instance_id = projections.keys3_certificate.instance_id`+
` LEFT JOIN projections.keys3_private ON projections.keys3.id = projections.keys3_private.id AND projections.keys3.instance_id = projections.keys3_private.instance_id`),
` FROM projections.keys4`+
` LEFT JOIN projections.keys4_certificate ON projections.keys4.id = projections.keys4_certificate.id AND projections.keys4.instance_id = projections.keys4_certificate.instance_id`+
` LEFT JOIN projections.keys4_private ON projections.keys4.id = projections.keys4_private.id AND projections.keys4.instance_id = projections.keys4_private.instance_id`),
[]string{
"id",
"creation_date",
@@ -135,20 +135,20 @@ func Test_CertificatePrepares(t *testing.T) {
prepare: prepareCertificateQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.keys3.id,`+
` projections.keys3.creation_date,`+
` projections.keys3.change_date,`+
` projections.keys3.sequence,`+
` projections.keys3.resource_owner,`+
` projections.keys3.algorithm,`+
` projections.keys3.use,`+
` projections.keys3_certificate.expiry,`+
` projections.keys3_certificate.certificate,`+
` projections.keys3_private.key,`+
regexp.QuoteMeta(`SELECT projections.keys4.id,`+
` projections.keys4.creation_date,`+
` projections.keys4.change_date,`+
` projections.keys4.sequence,`+
` projections.keys4.resource_owner,`+
` projections.keys4.algorithm,`+
` projections.keys4.use,`+
` projections.keys4_certificate.expiry,`+
` projections.keys4_certificate.certificate,`+
` projections.keys4_private.key,`+
` COUNT(*) OVER ()`+
` FROM projections.keys3`+
` LEFT JOIN projections.keys3_certificate ON projections.keys3.id = projections.keys3_certificate.id AND projections.keys3.instance_id = projections.keys3_certificate.instance_id`+
` LEFT JOIN projections.keys3_private ON projections.keys3.id = projections.keys3_private.id AND projections.keys3.instance_id = projections.keys3_private.instance_id`),
` FROM projections.keys4`+
` LEFT JOIN projections.keys4_certificate ON projections.keys4.id = projections.keys4_certificate.id AND projections.keys4.instance_id = projections.keys4_certificate.instance_id`+
` LEFT JOIN projections.keys4_private ON projections.keys4.id = projections.keys4_private.id AND projections.keys4.instance_id = projections.keys4_private.instance_id`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
+1 -1
View File
@@ -110,7 +110,7 @@ func (q *Queries) changes(ctx context.Context, query func(query *eventstore.Sear
ModifierName: event.EditorUser(),
ModifierLoginName: event.EditorUser(),
}
editor, _ := q.GetUserByID(ctx, false, change.ModifierId)
editor, _ := q.GetUserByID(ctx, false, change.ModifierId, false)
if editor != nil {
change.ModifierLoginName = editor.PreferredLoginName
change.ModifierResourceOwner = editor.ResourceOwner
+27 -19
View File
@@ -78,18 +78,24 @@ var (
name: projection.CustomTextTextCol,
table: customTextTable,
}
CustomTextOwnerRemoved = Column{
name: projection.CustomTextOwnerRemovedCol,
table: customTextTable,
}
)
func (q *Queries) CustomTextList(ctx context.Context, aggregateID, template, language string) (texts *CustomTexts, err error) {
func (q *Queries) CustomTextList(ctx context.Context, aggregateID, template, language string, withOwnerRemoved bool) (texts *CustomTexts, err error) {
stmt, scan := prepareCustomTextsQuery()
query, args, err := stmt.Where(
sq.Eq{
CustomTextColAggregateID.identifier(): aggregateID,
CustomTextColTemplate.identifier(): template,
CustomTextColLanguage.identifier(): language,
CustomTextColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
).ToSql()
eq := sq.Eq{
CustomTextColAggregateID.identifier(): aggregateID,
CustomTextColTemplate.identifier(): template,
CustomTextColLanguage.identifier(): language,
CustomTextColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[CustomTextOwnerRemoved.identifier()] = false
}
query, args, err := stmt.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-M9gse", "Errors.Query.SQLStatement")
}
@@ -106,15 +112,17 @@ func (q *Queries) CustomTextList(ctx context.Context, aggregateID, template, lan
return texts, err
}
func (q *Queries) CustomTextListByTemplate(ctx context.Context, aggregateID, template string) (texts *CustomTexts, err error) {
func (q *Queries) CustomTextListByTemplate(ctx context.Context, aggregateID, template string, withOwnerRemoved bool) (texts *CustomTexts, err error) {
stmt, scan := prepareCustomTextsQuery()
query, args, err := stmt.Where(
sq.Eq{
CustomTextColAggregateID.identifier(): aggregateID,
CustomTextColTemplate.identifier(): template,
CustomTextColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
).ToSql()
eq := sq.Eq{
CustomTextColAggregateID.identifier(): aggregateID,
CustomTextColTemplate.identifier(): template,
CustomTextColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[CustomTextOwnerRemoved.identifier()] = false
}
query, args, err := stmt.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-M49fs", "Errors.Query.SQLStatement")
}
@@ -146,7 +154,7 @@ func (q *Queries) GetDefaultLoginTexts(ctx context.Context, lang string) (*domai
}
func (q *Queries) GetCustomLoginTexts(ctx context.Context, aggregateID, lang string) (*domain.CustomLoginText, error) {
texts, err := q.CustomTextList(ctx, aggregateID, domain.LoginCustomText, lang)
texts, err := q.CustomTextList(ctx, aggregateID, domain.LoginCustomText, lang, false)
if err != nil {
return nil, err
}
@@ -162,7 +170,7 @@ func (q *Queries) IAMLoginTexts(ctx context.Context, lang string) (*domain.Custo
if err := yaml.Unmarshal(contents, &loginTextMap); err != nil {
return nil, errors.ThrowInternal(err, "QUERY-m0Jf3", "Errors.TranslationFile.ReadError")
}
texts, err := q.CustomTextList(ctx, authz.GetInstance(ctx).InstanceID(), domain.LoginCustomText, lang)
texts, err := q.CustomTextList(ctx, authz.GetInstance(ctx).InstanceID(), domain.LoginCustomText, lang, false)
if err != nil {
return nil, err
}
+36 -36
View File
@@ -29,16 +29,16 @@ func Test_CustomTextPrepares(t *testing.T) {
prepare: prepareCustomTextsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.custom_texts.aggregate_id,`+
` projections.custom_texts.sequence,`+
` projections.custom_texts.creation_date,`+
` projections.custom_texts.change_date,`+
` projections.custom_texts.language,`+
` projections.custom_texts.template,`+
` projections.custom_texts.key,`+
` projections.custom_texts.text,`+
regexp.QuoteMeta(`SELECT projections.custom_texts2.aggregate_id,`+
` projections.custom_texts2.sequence,`+
` projections.custom_texts2.creation_date,`+
` projections.custom_texts2.change_date,`+
` projections.custom_texts2.language,`+
` projections.custom_texts2.template,`+
` projections.custom_texts2.key,`+
` projections.custom_texts2.text,`+
` COUNT(*) OVER ()`+
` FROM projections.custom_texts`),
` FROM projections.custom_texts2`),
nil,
nil,
),
@@ -56,16 +56,16 @@ func Test_CustomTextPrepares(t *testing.T) {
prepare: prepareCustomTextsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.custom_texts.aggregate_id,`+
` projections.custom_texts.sequence,`+
` projections.custom_texts.creation_date,`+
` projections.custom_texts.change_date,`+
` projections.custom_texts.language,`+
` projections.custom_texts.template,`+
` projections.custom_texts.key,`+
` projections.custom_texts.text,`+
regexp.QuoteMeta(`SELECT projections.custom_texts2.aggregate_id,`+
` projections.custom_texts2.sequence,`+
` projections.custom_texts2.creation_date,`+
` projections.custom_texts2.change_date,`+
` projections.custom_texts2.language,`+
` projections.custom_texts2.template,`+
` projections.custom_texts2.key,`+
` projections.custom_texts2.text,`+
` COUNT(*) OVER ()`+
` FROM projections.custom_texts`),
` FROM projections.custom_texts2`),
[]string{
"aggregate_id",
"sequence",
@@ -114,16 +114,16 @@ func Test_CustomTextPrepares(t *testing.T) {
prepare: prepareCustomTextsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.custom_texts.aggregate_id,`+
` projections.custom_texts.sequence,`+
` projections.custom_texts.creation_date,`+
` projections.custom_texts.change_date,`+
` projections.custom_texts.language,`+
` projections.custom_texts.template,`+
` projections.custom_texts.key,`+
` projections.custom_texts.text,`+
regexp.QuoteMeta(`SELECT projections.custom_texts2.aggregate_id,`+
` projections.custom_texts2.sequence,`+
` projections.custom_texts2.creation_date,`+
` projections.custom_texts2.change_date,`+
` projections.custom_texts2.language,`+
` projections.custom_texts2.template,`+
` projections.custom_texts2.key,`+
` projections.custom_texts2.text,`+
` COUNT(*) OVER ()`+
` FROM projections.custom_texts`),
` FROM projections.custom_texts2`),
[]string{
"aggregate_id",
"sequence",
@@ -192,16 +192,16 @@ func Test_CustomTextPrepares(t *testing.T) {
prepare: prepareCustomTextsQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.custom_texts.aggregate_id,`+
` projections.custom_texts.sequence,`+
` projections.custom_texts.creation_date,`+
` projections.custom_texts.change_date,`+
` projections.custom_texts.language,`+
` projections.custom_texts.template,`+
` projections.custom_texts.key,`+
` projections.custom_texts.text,`+
regexp.QuoteMeta(`SELECT projections.custom_texts2.aggregate_id,`+
` projections.custom_texts2.sequence,`+
` projections.custom_texts2.creation_date,`+
` projections.custom_texts2.change_date,`+
` projections.custom_texts2.language,`+
` projections.custom_texts2.template,`+
` projections.custom_texts2.key,`+
` projections.custom_texts2.text,`+
` COUNT(*) OVER ()`+
` FROM projections.custom_texts`),
` FROM projections.custom_texts2`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
+23 -14
View File
@@ -79,29 +79,38 @@ var (
name: projection.DomainPolicyStateCol,
table: domainPolicyTable,
}
DomainPolicyColOwnerRemoved = Column{
name: projection.DomainPolicyOwnerRemovedCol,
table: domainPolicyTable,
}
)
func (q *Queries) DomainPolicyByOrg(ctx context.Context, shouldTriggerBulk bool, orgID string) (*DomainPolicy, error) {
func (q *Queries) DomainPolicyByOrg(ctx context.Context, shouldTriggerBulk bool, orgID string, withOwnerRemoved bool) (*DomainPolicy, error) {
if shouldTriggerBulk {
projection.DomainPolicyProjection.Trigger(ctx)
}
stmt, scan := prepareDomainPolicyQuery()
query, args, err := stmt.Where(
sq.And{
eq := sq.And{
sq.Eq{DomainPolicyColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()},
sq.Or{
sq.Eq{DomainPolicyColID.identifier(): orgID},
sq.Eq{DomainPolicyColID.identifier(): authz.GetInstance(ctx).InstanceID()},
},
}
if !withOwnerRemoved {
eq = sq.And{
sq.Eq{
DomainPolicyColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
DomainPolicyColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
DomainPolicyColOwnerRemoved.identifier(): false,
},
sq.Or{
sq.Eq{
DomainPolicyColID.identifier(): orgID,
},
sq.Eq{
DomainPolicyColID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
sq.Eq{DomainPolicyColID.identifier(): orgID},
sq.Eq{DomainPolicyColID.identifier(): authz.GetInstance(ctx).InstanceID()},
},
}).
OrderBy(DomainPolicyColIsDefault.identifier()).
}
}
stmt, scan := prepareDomainPolicyQuery()
query, args, err := stmt.Where(eq).OrderBy(DomainPolicyColIsDefault.identifier()).
Limit(1).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-D3CqT", "Errors.Query.SQLStatement")
+33 -33
View File
@@ -28,17 +28,17 @@ func Test_DomainPolicyPrepares(t *testing.T) {
prepare: prepareDomainPolicyQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.domain_policies.id,`+
` projections.domain_policies.sequence,`+
` projections.domain_policies.creation_date,`+
` projections.domain_policies.change_date,`+
` projections.domain_policies.resource_owner,`+
` projections.domain_policies.user_login_must_be_domain,`+
` projections.domain_policies.validate_org_domains,`+
` projections.domain_policies.smtp_sender_address_matches_instance_domain,`+
` projections.domain_policies.is_default,`+
` projections.domain_policies.state`+
` FROM projections.domain_policies`),
regexp.QuoteMeta(`SELECT projections.domain_policies2.id,`+
` projections.domain_policies2.sequence,`+
` projections.domain_policies2.creation_date,`+
` projections.domain_policies2.change_date,`+
` projections.domain_policies2.resource_owner,`+
` projections.domain_policies2.user_login_must_be_domain,`+
` projections.domain_policies2.validate_org_domains,`+
` projections.domain_policies2.smtp_sender_address_matches_instance_domain,`+
` projections.domain_policies2.is_default,`+
` projections.domain_policies2.state`+
` FROM projections.domain_policies2`),
nil,
nil,
),
@@ -56,17 +56,17 @@ func Test_DomainPolicyPrepares(t *testing.T) {
prepare: prepareDomainPolicyQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.domain_policies.id,`+
` projections.domain_policies.sequence,`+
` projections.domain_policies.creation_date,`+
` projections.domain_policies.change_date,`+
` projections.domain_policies.resource_owner,`+
` projections.domain_policies.user_login_must_be_domain,`+
` projections.domain_policies.validate_org_domains,`+
` projections.domain_policies.smtp_sender_address_matches_instance_domain,`+
` projections.domain_policies.is_default,`+
` projections.domain_policies.state`+
` FROM projections.domain_policies`),
regexp.QuoteMeta(`SELECT projections.domain_policies2.id,`+
` projections.domain_policies2.sequence,`+
` projections.domain_policies2.creation_date,`+
` projections.domain_policies2.change_date,`+
` projections.domain_policies2.resource_owner,`+
` projections.domain_policies2.user_login_must_be_domain,`+
` projections.domain_policies2.validate_org_domains,`+
` projections.domain_policies2.smtp_sender_address_matches_instance_domain,`+
` projections.domain_policies2.is_default,`+
` projections.domain_policies2.state`+
` FROM projections.domain_policies2`),
[]string{
"id",
"sequence",
@@ -111,17 +111,17 @@ func Test_DomainPolicyPrepares(t *testing.T) {
prepare: prepareDomainPolicyQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.domain_policies.id,`+
` projections.domain_policies.sequence,`+
` projections.domain_policies.creation_date,`+
` projections.domain_policies.change_date,`+
` projections.domain_policies.resource_owner,`+
` projections.domain_policies.user_login_must_be_domain,`+
` projections.domain_policies.validate_org_domains,`+
` projections.domain_policies.smtp_sender_address_matches_instance_domain,`+
` projections.domain_policies.is_default,`+
` projections.domain_policies.state`+
` FROM projections.domain_policies`),
regexp.QuoteMeta(`SELECT projections.domain_policies2.id,`+
` projections.domain_policies2.sequence,`+
` projections.domain_policies2.creation_date,`+
` projections.domain_policies2.change_date,`+
` projections.domain_policies2.resource_owner,`+
` projections.domain_policies2.user_login_must_be_domain,`+
` projections.domain_policies2.validate_org_domains,`+
` projections.domain_policies2.smtp_sender_address_matches_instance_domain,`+
` projections.domain_policies2.is_default,`+
` projections.domain_policies2.state`+
` FROM projections.domain_policies2`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
+20 -6
View File
@@ -7,7 +7,6 @@ import (
sq "github.com/Masterminds/squirrel"
"github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/errors"
"github.com/zitadel/zitadel/internal/query/projection"
)
@@ -50,6 +49,14 @@ var (
name: projection.InstanceMemberIAMIDCol,
table: instanceMemberTable,
}
InstanceMemberOwnerRemoved = Column{
name: projection.MemberOwnerRemoved,
table: instanceMemberTable,
}
InstanceMemberOwnerRemovedUser = Column{
name: projection.MemberUserOwnerRemoved,
table: instanceMemberTable,
}
)
type IAMMembersQuery struct {
@@ -61,12 +68,19 @@ func (q *IAMMembersQuery) toQuery(query sq.SelectBuilder) sq.SelectBuilder {
toQuery(query)
}
func (q *Queries) IAMMembers(ctx context.Context, queries *IAMMembersQuery) (*Members, error) {
func addIamMemberWithoutOwnerRemoved(eq map[string]interface{}) {
eq[InstanceMemberOwnerRemoved.identifier()] = false
eq[InstanceMemberOwnerRemovedUser.identifier()] = false
}
func (q *Queries) IAMMembers(ctx context.Context, queries *IAMMembersQuery, withOwnerRemoved bool) (*Members, error) {
query, scan := prepareInstanceMembersQuery()
stmt, args, err := queries.toQuery(query).
Where(sq.Eq{
InstanceMemberInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
eq := sq.Eq{InstanceMemberInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
addIamMemberWithoutOwnerRemoved(eq)
addLoginNameWithoutOwnerRemoved(eq)
}
stmt, args, err := queries.toQuery(query).Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-USNwM", "Errors.Query.InvalidRequest")
}
+15 -15
View File
@@ -19,22 +19,22 @@ var (
", members.resource_owner" +
", members.user_id" +
", members.roles" +
", projections.login_names.login_name" +
", projections.users5_humans.email" +
", projections.users5_humans.first_name" +
", projections.users5_humans.last_name" +
", projections.users5_humans.display_name" +
", projections.users5_machines.name" +
", projections.users5_humans.avatar_key" +
", projections.login_names2.login_name" +
", projections.users6_humans.email" +
", projections.users6_humans.first_name" +
", projections.users6_humans.last_name" +
", projections.users6_humans.display_name" +
", projections.users6_machines.name" +
", projections.users6_humans.avatar_key" +
", COUNT(*) OVER () " +
"FROM projections.instance_members2 AS members " +
"LEFT JOIN projections.users5_humans " +
"ON members.user_id = projections.users5_humans.user_id AND members.instance_id = projections.users5_humans.instance_id " +
"LEFT JOIN projections.users5_machines " +
"ON members.user_id = projections.users5_machines.user_id AND members.instance_id = projections.users5_machines.instance_id " +
"LEFT JOIN projections.login_names " +
"ON members.user_id = projections.login_names.user_id AND members.instance_id = projections.login_names.instance_id " +
"WHERE projections.login_names.is_primary = $1")
"FROM projections.instance_members3 AS members " +
"LEFT JOIN projections.users6_humans " +
"ON members.user_id = projections.users6_humans.user_id AND members.instance_id = projections.users6_humans.instance_id " +
"LEFT JOIN projections.users6_machines " +
"ON members.user_id = projections.users6_machines.user_id AND members.instance_id = projections.users6_machines.instance_id " +
"LEFT JOIN projections.login_names2 " +
"ON members.user_id = projections.login_names2.user_id AND members.instance_id = projections.login_names2.instance_id " +
"WHERE projections.login_names2.is_primary = $1")
instanceMembersColumns = []string{
"creation_date",
"change_date",
+30 -24
View File
@@ -110,6 +110,10 @@ var (
name: projection.IDPTypeCol,
table: idpTable,
}
IDPOwnerRemovedCol = Column{
name: projection.IDPOwnerRemovedCol,
table: idpTable,
}
)
var (
@@ -183,28 +187,27 @@ var (
)
// IDPByIDAndResourceOwner searches for the requested id in the context of the resource owner and IAM
func (q *Queries) IDPByIDAndResourceOwner(ctx context.Context, shouldTriggerBulk bool, id, resourceOwner string) (*IDP, error) {
func (q *Queries) IDPByIDAndResourceOwner(ctx context.Context, shouldTriggerBulk bool, id, resourceOwner string, withOwnerRemoved bool) (*IDP, error) {
if shouldTriggerBulk {
projection.IDPProjection.Trigger(ctx)
}
stmt, scan := prepareIDPByIDQuery()
query, args, err := stmt.Where(
sq.And{
sq.Eq{
IDPIDCol.identifier(): id,
IDPInstanceIDCol.identifier(): authz.GetInstance(ctx).InstanceID(),
},
sq.Or{
sq.Eq{
IDPResourceOwnerCol.identifier(): resourceOwner,
},
sq.Eq{
IDPResourceOwnerCol.identifier(): authz.GetInstance(ctx).InstanceID(),
},
},
eq := sq.Eq{
IDPIDCol.identifier(): id,
IDPInstanceIDCol.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[IDPOwnerRemovedCol.identifier()] = false
}
where := sq.And{
eq,
sq.Or{
sq.Eq{IDPResourceOwnerCol.identifier(): resourceOwner},
sq.Eq{IDPResourceOwnerCol.identifier(): authz.GetInstance(ctx).InstanceID()},
},
).ToSql()
}
stmt, scan := prepareIDPByIDQuery()
query, args, err := stmt.Where(where).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-0gocI", "Errors.Query.SQLStatement")
}
@@ -214,12 +217,15 @@ func (q *Queries) IDPByIDAndResourceOwner(ctx context.Context, shouldTriggerBulk
}
// IDPs searches idps matching the query
func (q *Queries) IDPs(ctx context.Context, queries *IDPSearchQueries) (idps *IDPs, err error) {
func (q *Queries) IDPs(ctx context.Context, queries *IDPSearchQueries, withOwnerRemoved bool) (idps *IDPs, err error) {
query, scan := prepareIDPsQuery()
stmt, args, err := queries.toQuery(query).
Where(sq.Eq{
IDPInstanceIDCol.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
eq := sq.Eq{
IDPInstanceIDCol.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[IDPOwnerRemovedCol.identifier()] = false
}
stmt, args, err := queries.toQuery(query).Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-X6X7y", "Errors.Query.InvalidRequest")
}
@@ -506,8 +512,8 @@ func prepareIDPsQuery() (sq.SelectBuilder, func(*sql.Rows) (*IDPs, error)) {
}
}
func (q *Queries) GetOIDCIDPClientSecret(ctx context.Context, shouldRealTime bool, resourceowner, idpID string) (string, error) {
idp, err := q.IDPByIDAndResourceOwner(ctx, shouldRealTime, idpID, resourceowner)
func (q *Queries) GetOIDCIDPClientSecret(ctx context.Context, shouldRealTime bool, resourceowner, idpID string, withOwnerRemoved bool) (string, error) {
idp, err := q.IDPByIDAndResourceOwner(ctx, shouldRealTime, idpID, resourceowner, withOwnerRemoved)
if err != nil {
return "", err
}
+13 -7
View File
@@ -73,16 +73,22 @@ var (
name: projection.IDPLoginPolicyLinkProviderTypeCol,
table: idpLoginPolicyLinkTable,
}
IDPLoginPolicyLinkOwnerRemovedCol = Column{
name: projection.IDPLoginPolicyLinkOwnerRemovedCol,
table: idpLoginPolicyLinkTable,
}
)
func (q *Queries) IDPLoginPolicyLinks(ctx context.Context, resourceOwner string, queries *IDPLoginPolicyLinksSearchQuery) (idps *IDPLoginPolicyLinks, err error) {
func (q *Queries) IDPLoginPolicyLinks(ctx context.Context, resourceOwner string, queries *IDPLoginPolicyLinksSearchQuery, withOwnerRemoved bool) (idps *IDPLoginPolicyLinks, err error) {
query, scan := prepareIDPLoginPolicyLinksQuery()
stmt, args, err := queries.toQuery(query).Where(
sq.Eq{
IDPLoginPolicyLinkResourceOwnerCol.identifier(): resourceOwner,
IDPLoginPolicyLinkInstanceIDCol.identifier(): authz.GetInstance(ctx).InstanceID(),
},
).ToSql()
eq := sq.Eq{
IDPLoginPolicyLinkResourceOwnerCol.identifier(): resourceOwner,
IDPLoginPolicyLinkInstanceIDCol.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[IDPLoginPolicyLinkOwnerRemovedCol.identifier()] = false
}
stmt, args, err := queries.toQuery(query).Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-FDbKW", "Errors.Query.InvalidRequest")
}
+5 -5
View File
@@ -12,12 +12,12 @@ import (
)
var (
loginPolicyIDPLinksQuery = regexp.QuoteMeta(`SELECT projections.idp_login_policy_links3.idp_id,` +
` projections.idps2.name,` +
` projections.idps2.type,` +
loginPolicyIDPLinksQuery = regexp.QuoteMeta(`SELECT projections.idp_login_policy_links4.idp_id,` +
` projections.idps3.name,` +
` projections.idps3.type,` +
` COUNT(*) OVER ()` +
` FROM projections.idp_login_policy_links3` +
` LEFT JOIN projections.idps2 ON projections.idp_login_policy_links3.idp_id = projections.idps2.id`)
` FROM projections.idp_login_policy_links4` +
` LEFT JOIN projections.idps3 ON projections.idp_login_policy_links4.idp_id = projections.idps3.id`)
loginPolicyIDPLinksCols = []string{
"idp_id",
"name",
+54 -54
View File
@@ -15,33 +15,33 @@ import (
)
var (
idpQuery = `SELECT projections.idps2.id,` +
` projections.idps2.resource_owner,` +
` projections.idps2.creation_date,` +
` projections.idps2.change_date,` +
` projections.idps2.sequence,` +
` projections.idps2.state,` +
` projections.idps2.name,` +
` projections.idps2.styling_type,` +
` projections.idps2.owner_type,` +
` projections.idps2.auto_register,` +
` projections.idps2_oidc_config.idp_id,` +
` projections.idps2_oidc_config.client_id,` +
` projections.idps2_oidc_config.client_secret,` +
` projections.idps2_oidc_config.issuer,` +
` projections.idps2_oidc_config.scopes,` +
` projections.idps2_oidc_config.display_name_mapping,` +
` projections.idps2_oidc_config.username_mapping,` +
` projections.idps2_oidc_config.authorization_endpoint,` +
` projections.idps2_oidc_config.token_endpoint,` +
` projections.idps2_jwt_config.idp_id,` +
` projections.idps2_jwt_config.issuer,` +
` projections.idps2_jwt_config.keys_endpoint,` +
` projections.idps2_jwt_config.header_name,` +
` projections.idps2_jwt_config.endpoint` +
` FROM projections.idps2` +
` LEFT JOIN projections.idps2_oidc_config ON projections.idps2.id = projections.idps2_oidc_config.idp_id AND projections.idps2.instance_id = projections.idps2_oidc_config.instance_id` +
` LEFT JOIN projections.idps2_jwt_config ON projections.idps2.id = projections.idps2_jwt_config.idp_id AND projections.idps2.instance_id = projections.idps2_jwt_config.instance_id`
idpQuery = `SELECT projections.idps3.id,` +
` projections.idps3.resource_owner,` +
` projections.idps3.creation_date,` +
` projections.idps3.change_date,` +
` projections.idps3.sequence,` +
` projections.idps3.state,` +
` projections.idps3.name,` +
` projections.idps3.styling_type,` +
` projections.idps3.owner_type,` +
` projections.idps3.auto_register,` +
` projections.idps3_oidc_config.idp_id,` +
` projections.idps3_oidc_config.client_id,` +
` projections.idps3_oidc_config.client_secret,` +
` projections.idps3_oidc_config.issuer,` +
` projections.idps3_oidc_config.scopes,` +
` projections.idps3_oidc_config.display_name_mapping,` +
` projections.idps3_oidc_config.username_mapping,` +
` projections.idps3_oidc_config.authorization_endpoint,` +
` projections.idps3_oidc_config.token_endpoint,` +
` projections.idps3_jwt_config.idp_id,` +
` projections.idps3_jwt_config.issuer,` +
` projections.idps3_jwt_config.keys_endpoint,` +
` projections.idps3_jwt_config.header_name,` +
` projections.idps3_jwt_config.endpoint` +
` FROM projections.idps3` +
` LEFT JOIN projections.idps3_oidc_config ON projections.idps3.id = projections.idps3_oidc_config.idp_id AND projections.idps3.instance_id = projections.idps3_oidc_config.instance_id` +
` LEFT JOIN projections.idps3_jwt_config ON projections.idps3.id = projections.idps3_jwt_config.idp_id AND projections.idps3.instance_id = projections.idps3_jwt_config.instance_id`
idpCols = []string{
"id",
"resource_owner",
@@ -70,34 +70,34 @@ var (
"header_name",
"endpoint",
}
idpsQuery = `SELECT projections.idps2.id,` +
` projections.idps2.resource_owner,` +
` projections.idps2.creation_date,` +
` projections.idps2.change_date,` +
` projections.idps2.sequence,` +
` projections.idps2.state,` +
` projections.idps2.name,` +
` projections.idps2.styling_type,` +
` projections.idps2.owner_type,` +
` projections.idps2.auto_register,` +
` projections.idps2_oidc_config.idp_id,` +
` projections.idps2_oidc_config.client_id,` +
` projections.idps2_oidc_config.client_secret,` +
` projections.idps2_oidc_config.issuer,` +
` projections.idps2_oidc_config.scopes,` +
` projections.idps2_oidc_config.display_name_mapping,` +
` projections.idps2_oidc_config.username_mapping,` +
` projections.idps2_oidc_config.authorization_endpoint,` +
` projections.idps2_oidc_config.token_endpoint,` +
` projections.idps2_jwt_config.idp_id,` +
` projections.idps2_jwt_config.issuer,` +
` projections.idps2_jwt_config.keys_endpoint,` +
` projections.idps2_jwt_config.header_name,` +
` projections.idps2_jwt_config.endpoint,` +
idpsQuery = `SELECT projections.idps3.id,` +
` projections.idps3.resource_owner,` +
` projections.idps3.creation_date,` +
` projections.idps3.change_date,` +
` projections.idps3.sequence,` +
` projections.idps3.state,` +
` projections.idps3.name,` +
` projections.idps3.styling_type,` +
` projections.idps3.owner_type,` +
` projections.idps3.auto_register,` +
` projections.idps3_oidc_config.idp_id,` +
` projections.idps3_oidc_config.client_id,` +
` projections.idps3_oidc_config.client_secret,` +
` projections.idps3_oidc_config.issuer,` +
` projections.idps3_oidc_config.scopes,` +
` projections.idps3_oidc_config.display_name_mapping,` +
` projections.idps3_oidc_config.username_mapping,` +
` projections.idps3_oidc_config.authorization_endpoint,` +
` projections.idps3_oidc_config.token_endpoint,` +
` projections.idps3_jwt_config.idp_id,` +
` projections.idps3_jwt_config.issuer,` +
` projections.idps3_jwt_config.keys_endpoint,` +
` projections.idps3_jwt_config.header_name,` +
` projections.idps3_jwt_config.endpoint,` +
` COUNT(*) OVER ()` +
` FROM projections.idps2` +
` LEFT JOIN projections.idps2_oidc_config ON projections.idps2.id = projections.idps2_oidc_config.idp_id AND projections.idps2.instance_id = projections.idps2_oidc_config.instance_id` +
` LEFT JOIN projections.idps2_jwt_config ON projections.idps2.id = projections.idps2_jwt_config.idp_id AND projections.idps2.instance_id = projections.idps2_jwt_config.instance_id`
` FROM projections.idps3` +
` LEFT JOIN projections.idps3_oidc_config ON projections.idps3.id = projections.idps3_oidc_config.idp_id AND projections.idps3.instance_id = projections.idps3_oidc_config.instance_id` +
` LEFT JOIN projections.idps3_jwt_config ON projections.idps3.id = projections.idps3_jwt_config.idp_id AND projections.idps3.instance_id = projections.idps3_jwt_config.instance_id`
idpsCols = []string{
"id",
"resource_owner",
+10 -5
View File
@@ -81,14 +81,19 @@ var (
name: projection.IDPUserLinkDisplayNameCol,
table: idpUserLinkTable,
}
IDPUserLinkOwnerRemovedCol = Column{
name: projection.IDPUserLinkOwnerRemovedCol,
table: idpUserLinkTable,
}
)
func (q *Queries) IDPUserLinks(ctx context.Context, queries *IDPUserLinksSearchQuery) (idps *IDPUserLinks, err error) {
func (q *Queries) IDPUserLinks(ctx context.Context, queries *IDPUserLinksSearchQuery, withOwnerRemoved bool) (idps *IDPUserLinks, err error) {
query, scan := prepareIDPUserLinksQuery()
stmt, args, err := queries.toQuery(query).
Where(sq.Eq{
IDPUserLinkInstanceIDCol.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
eq := sq.Eq{IDPUserLinkInstanceIDCol.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
eq[IDPUserLinkOwnerRemovedCol.identifier()] = false
}
stmt, args, err := queries.toQuery(query).Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-4zzFK", "Errors.Query.InvalidRequest")
}
+9 -9
View File
@@ -12,16 +12,16 @@ import (
)
var (
idpUserLinksQuery = regexp.QuoteMeta(`SELECT projections.idp_user_links2.idp_id,` +
` projections.idp_user_links2.user_id,` +
` projections.idps2.name,` +
` projections.idp_user_links2.external_user_id,` +
` projections.idp_user_links2.display_name,` +
` projections.idps2.type,` +
` projections.idp_user_links2.resource_owner,` +
idpUserLinksQuery = regexp.QuoteMeta(`SELECT projections.idp_user_links3.idp_id,` +
` projections.idp_user_links3.user_id,` +
` projections.idps3.name,` +
` projections.idp_user_links3.external_user_id,` +
` projections.idp_user_links3.display_name,` +
` projections.idps3.type,` +
` projections.idp_user_links3.resource_owner,` +
` COUNT(*) OVER ()` +
` FROM projections.idp_user_links2` +
` LEFT JOIN projections.idps2 ON projections.idp_user_links2.idp_id = projections.idps2.id`)
` FROM projections.idp_user_links3` +
` LEFT JOIN projections.idps3 ON projections.idp_user_links3.idp_id = projections.idps3.id`)
idpUserLinksCols = []string{
"idp_id",
"user_id",
+3 -9
View File
@@ -183,12 +183,8 @@ func (q *Queries) ActivePublicKeys(ctx context.Context, t time.Time) (*PublicKey
}
stmt, args, err := query.Where(
sq.And{
sq.Eq{
KeyColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
sq.Gt{
KeyPublicColExpiry.identifier(): t,
},
sq.Eq{KeyColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()},
sq.Gt{KeyPublicColExpiry.identifier(): t},
}).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-SDFfg", "Errors.Query.SQLStatement")
@@ -220,9 +216,7 @@ func (q *Queries) ActivePrivateSigningKey(ctx context.Context, t time.Time) (*Pr
KeyColUse.identifier(): domain.KeyUsageSigning,
KeyColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
sq.Gt{
KeyPrivateColExpiry.identifier(): t,
},
sq.Gt{KeyPrivateColExpiry.identifier(): t},
}).OrderBy(KeyPrivateColExpiry.identifier()).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-SDff2", "Errors.Query.SQLStatement")
+66 -66
View File
@@ -31,18 +31,18 @@ func Test_KeyPrepares(t *testing.T) {
prepare: preparePublicKeysQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.keys3.id,`+
` projections.keys3.creation_date,`+
` projections.keys3.change_date,`+
` projections.keys3.sequence,`+
` projections.keys3.resource_owner,`+
` projections.keys3.algorithm,`+
` projections.keys3.use,`+
` projections.keys3_public.expiry,`+
` projections.keys3_public.key,`+
regexp.QuoteMeta(`SELECT projections.keys4.id,`+
` projections.keys4.creation_date,`+
` projections.keys4.change_date,`+
` projections.keys4.sequence,`+
` projections.keys4.resource_owner,`+
` projections.keys4.algorithm,`+
` projections.keys4.use,`+
` projections.keys4_public.expiry,`+
` projections.keys4_public.key,`+
` COUNT(*) OVER ()`+
` FROM projections.keys3`+
` LEFT JOIN projections.keys3_public ON projections.keys3.id = projections.keys3_public.id`),
` FROM projections.keys4`+
` LEFT JOIN projections.keys4_public ON projections.keys4.id = projections.keys4_public.id`),
nil,
nil,
),
@@ -60,18 +60,18 @@ func Test_KeyPrepares(t *testing.T) {
prepare: preparePublicKeysQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.keys3.id,`+
` projections.keys3.creation_date,`+
` projections.keys3.change_date,`+
` projections.keys3.sequence,`+
` projections.keys3.resource_owner,`+
` projections.keys3.algorithm,`+
` projections.keys3.use,`+
` projections.keys3_public.expiry,`+
` projections.keys3_public.key,`+
regexp.QuoteMeta(`SELECT projections.keys4.id,`+
` projections.keys4.creation_date,`+
` projections.keys4.change_date,`+
` projections.keys4.sequence,`+
` projections.keys4.resource_owner,`+
` projections.keys4.algorithm,`+
` projections.keys4.use,`+
` projections.keys4_public.expiry,`+
` projections.keys4_public.key,`+
` COUNT(*) OVER ()`+
` FROM projections.keys3`+
` LEFT JOIN projections.keys3_public ON projections.keys3.id = projections.keys3_public.id`),
` FROM projections.keys4`+
` LEFT JOIN projections.keys4_public ON projections.keys4.id = projections.keys4_public.id`),
[]string{
"id",
"creation_date",
@@ -128,18 +128,18 @@ func Test_KeyPrepares(t *testing.T) {
prepare: preparePublicKeysQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.keys3.id,`+
` projections.keys3.creation_date,`+
` projections.keys3.change_date,`+
` projections.keys3.sequence,`+
` projections.keys3.resource_owner,`+
` projections.keys3.algorithm,`+
` projections.keys3.use,`+
` projections.keys3_public.expiry,`+
` projections.keys3_public.key,`+
regexp.QuoteMeta(`SELECT projections.keys4.id,`+
` projections.keys4.creation_date,`+
` projections.keys4.change_date,`+
` projections.keys4.sequence,`+
` projections.keys4.resource_owner,`+
` projections.keys4.algorithm,`+
` projections.keys4.use,`+
` projections.keys4_public.expiry,`+
` projections.keys4_public.key,`+
` COUNT(*) OVER ()`+
` FROM projections.keys3`+
` LEFT JOIN projections.keys3_public ON projections.keys3.id = projections.keys3_public.id`),
` FROM projections.keys4`+
` LEFT JOIN projections.keys4_public ON projections.keys4.id = projections.keys4_public.id`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
@@ -156,18 +156,18 @@ func Test_KeyPrepares(t *testing.T) {
prepare: preparePrivateKeysQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.keys3.id,`+
` projections.keys3.creation_date,`+
` projections.keys3.change_date,`+
` projections.keys3.sequence,`+
` projections.keys3.resource_owner,`+
` projections.keys3.algorithm,`+
` projections.keys3.use,`+
` projections.keys3_private.expiry,`+
` projections.keys3_private.key,`+
regexp.QuoteMeta(`SELECT projections.keys4.id,`+
` projections.keys4.creation_date,`+
` projections.keys4.change_date,`+
` projections.keys4.sequence,`+
` projections.keys4.resource_owner,`+
` projections.keys4.algorithm,`+
` projections.keys4.use,`+
` projections.keys4_private.expiry,`+
` projections.keys4_private.key,`+
` COUNT(*) OVER ()`+
` FROM projections.keys3`+
` LEFT JOIN projections.keys3_private ON projections.keys3.id = projections.keys3_private.id`),
` FROM projections.keys4`+
` LEFT JOIN projections.keys4_private ON projections.keys4.id = projections.keys4_private.id`),
nil,
nil,
),
@@ -185,18 +185,18 @@ func Test_KeyPrepares(t *testing.T) {
prepare: preparePrivateKeysQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.keys3.id,`+
` projections.keys3.creation_date,`+
` projections.keys3.change_date,`+
` projections.keys3.sequence,`+
` projections.keys3.resource_owner,`+
` projections.keys3.algorithm,`+
` projections.keys3.use,`+
` projections.keys3_private.expiry,`+
` projections.keys3_private.key,`+
regexp.QuoteMeta(`SELECT projections.keys4.id,`+
` projections.keys4.creation_date,`+
` projections.keys4.change_date,`+
` projections.keys4.sequence,`+
` projections.keys4.resource_owner,`+
` projections.keys4.algorithm,`+
` projections.keys4.use,`+
` projections.keys4_private.expiry,`+
` projections.keys4_private.key,`+
` COUNT(*) OVER ()`+
` FROM projections.keys3`+
` LEFT JOIN projections.keys3_private ON projections.keys3.id = projections.keys3_private.id`),
` FROM projections.keys4`+
` LEFT JOIN projections.keys4_private ON projections.keys4.id = projections.keys4_private.id`),
[]string{
"id",
"creation_date",
@@ -255,18 +255,18 @@ func Test_KeyPrepares(t *testing.T) {
prepare: preparePrivateKeysQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.keys3.id,`+
` projections.keys3.creation_date,`+
` projections.keys3.change_date,`+
` projections.keys3.sequence,`+
` projections.keys3.resource_owner,`+
` projections.keys3.algorithm,`+
` projections.keys3.use,`+
` projections.keys3_private.expiry,`+
` projections.keys3_private.key,`+
regexp.QuoteMeta(`SELECT projections.keys4.id,`+
` projections.keys4.creation_date,`+
` projections.keys4.change_date,`+
` projections.keys4.sequence,`+
` projections.keys4.resource_owner,`+
` projections.keys4.algorithm,`+
` projections.keys4.use,`+
` projections.keys4_private.expiry,`+
` projections.keys4_private.key,`+
` COUNT(*) OVER ()`+
` FROM projections.keys3`+
` LEFT JOIN projections.keys3_private ON projections.keys3.id = projections.keys3_private.id`),
` FROM projections.keys4`+
` LEFT JOIN projections.keys4_private ON projections.keys4.id = projections.keys4_private.id`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
+14 -11
View File
@@ -40,22 +40,22 @@ type Theme struct {
IconURL string
}
func (q *Queries) ActiveLabelPolicyByOrg(ctx context.Context, orgID string) (*LabelPolicy, error) {
func (q *Queries) ActiveLabelPolicyByOrg(ctx context.Context, orgID string, withOwnerRemoved bool) (*LabelPolicy, error) {
stmt, scan := prepareLabelPolicyQuery()
eq := sq.Eq{
LabelPolicyColState.identifier(): domain.LabelPolicyStateActive,
LabelPolicyColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[LabelPolicyOwnerRemoved.identifier()] = false
}
query, args, err := stmt.Where(
sq.And{
sq.Or{
sq.Eq{
LabelPolicyColID.identifier(): orgID,
},
sq.Eq{
LabelPolicyColID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
},
sq.Eq{
LabelPolicyColState.identifier(): domain.LabelPolicyStateActive,
LabelPolicyColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
sq.Eq{LabelPolicyColID.identifier(): orgID},
sq.Eq{LabelPolicyColID.identifier(): authz.GetInstance(ctx).InstanceID()},
},
eq,
}).
OrderBy(LabelPolicyColIsDefault.identifier()).
Limit(1).ToSql()
@@ -205,6 +205,9 @@ var (
LabelPolicyColDarkIconURL = Column{
name: projection.LabelPolicyDarkIconURLCol,
}
LabelPolicyOwnerRemoved = Column{
name: projection.LabelPolicyOwnerRemovedCol,
}
)
func prepareLabelPolicyQuery() (sq.SelectBuilder, func(*sql.Row) (*LabelPolicy, error)) {
+14 -10
View File
@@ -74,26 +74,30 @@ var (
name: projection.LockoutPolicyStateCol,
table: lockoutTable,
}
LockoutPolicyOwnerRemoved = Column{
name: projection.LockoutPolicyOwnerRemovedCol,
table: lockoutTable,
}
)
func (q *Queries) LockoutPolicyByOrg(ctx context.Context, shouldTriggerBulk bool, orgID string) (*LockoutPolicy, error) {
func (q *Queries) LockoutPolicyByOrg(ctx context.Context, shouldTriggerBulk bool, orgID string, withOwnerRemoved bool) (*LockoutPolicy, error) {
if shouldTriggerBulk {
projection.LockoutPolicyProjection.Trigger(ctx)
}
eq := sq.Eq{
LockoutColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[LockoutPolicyOwnerRemoved.identifier()] = false
}
stmt, scan := prepareLockoutPolicyQuery()
query, args, err := stmt.Where(
sq.And{
sq.Eq{
LockoutColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
eq,
sq.Or{
sq.Eq{
LockoutColID.identifier(): orgID,
},
sq.Eq{
LockoutColID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
sq.Eq{LockoutColID.identifier(): orgID},
sq.Eq{LockoutColID.identifier(): authz.GetInstance(ctx).InstanceID()},
},
}).
OrderBy(LockoutColIsDefault.identifier()).
+30 -30
View File
@@ -28,16 +28,16 @@ func Test_LockoutPolicyPrepares(t *testing.T) {
prepare: prepareLockoutPolicyQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.lockout_policies.id,`+
` projections.lockout_policies.sequence,`+
` projections.lockout_policies.creation_date,`+
` projections.lockout_policies.change_date,`+
` projections.lockout_policies.resource_owner,`+
` projections.lockout_policies.show_failure,`+
` projections.lockout_policies.max_password_attempts,`+
` projections.lockout_policies.is_default,`+
` projections.lockout_policies.state`+
` FROM projections.lockout_policies`),
regexp.QuoteMeta(`SELECT projections.lockout_policies2.id,`+
` projections.lockout_policies2.sequence,`+
` projections.lockout_policies2.creation_date,`+
` projections.lockout_policies2.change_date,`+
` projections.lockout_policies2.resource_owner,`+
` projections.lockout_policies2.show_failure,`+
` projections.lockout_policies2.max_password_attempts,`+
` projections.lockout_policies2.is_default,`+
` projections.lockout_policies2.state`+
` FROM projections.lockout_policies2`),
nil,
nil,
),
@@ -55,16 +55,16 @@ func Test_LockoutPolicyPrepares(t *testing.T) {
prepare: prepareLockoutPolicyQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.lockout_policies.id,`+
` projections.lockout_policies.sequence,`+
` projections.lockout_policies.creation_date,`+
` projections.lockout_policies.change_date,`+
` projections.lockout_policies.resource_owner,`+
` projections.lockout_policies.show_failure,`+
` projections.lockout_policies.max_password_attempts,`+
` projections.lockout_policies.is_default,`+
` projections.lockout_policies.state`+
` FROM projections.lockout_policies`),
regexp.QuoteMeta(`SELECT projections.lockout_policies2.id,`+
` projections.lockout_policies2.sequence,`+
` projections.lockout_policies2.creation_date,`+
` projections.lockout_policies2.change_date,`+
` projections.lockout_policies2.resource_owner,`+
` projections.lockout_policies2.show_failure,`+
` projections.lockout_policies2.max_password_attempts,`+
` projections.lockout_policies2.is_default,`+
` projections.lockout_policies2.state`+
` FROM projections.lockout_policies2`),
[]string{
"id",
"sequence",
@@ -106,16 +106,16 @@ func Test_LockoutPolicyPrepares(t *testing.T) {
prepare: prepareLockoutPolicyQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.lockout_policies.id,`+
` projections.lockout_policies.sequence,`+
` projections.lockout_policies.creation_date,`+
` projections.lockout_policies.change_date,`+
` projections.lockout_policies.resource_owner,`+
` projections.lockout_policies.show_failure,`+
` projections.lockout_policies.max_password_attempts,`+
` projections.lockout_policies.is_default,`+
` projections.lockout_policies.state`+
` FROM projections.lockout_policies`),
regexp.QuoteMeta(`SELECT projections.lockout_policies2.id,`+
` projections.lockout_policies2.sequence,`+
` projections.lockout_policies2.creation_date,`+
` projections.lockout_policies2.change_date,`+
` projections.lockout_policies2.resource_owner,`+
` projections.lockout_policies2.show_failure,`+
` projections.lockout_policies2.max_password_attempts,`+
` projections.lockout_policies2.is_default,`+
` projections.lockout_policies2.state`+
` FROM projections.lockout_policies2`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
+21 -3
View File
@@ -8,7 +8,7 @@ var (
instanceIDCol: projection.LoginNameUserInstanceIDCol,
}
LoginNameUserIDCol = Column{
name: "user_id",
name: projection.LoginNameUserCol,
table: loginNameTable,
}
LoginNameNameCol = Column{
@@ -16,11 +16,29 @@ var (
table: loginNameTable,
}
LoginNameIsPrimaryCol = Column{
name: projection.LoginNameDomainIsPrimaryCol,
name: projection.LoginNameIsPrimaryCol,
table: loginNameTable,
}
LoginNameInstanceIDCol = Column{
name: projection.LoginNameUserInstanceIDCol,
name: projection.LoginNameInstanceIDCol,
table: loginNameTable,
}
LoginNameOwnerRemovedDomainCol = Column{
name: projection.LoginNameOwnerRemovedDomainCol,
table: loginNameTable,
}
LoginNameOwnerRemovedUserCol = Column{
name: projection.LoginNameOwnerRemovedUserCol,
table: loginNameTable,
}
LoginNameOwnerRemovedPolicyCol = Column{
name: projection.LoginNameOwnerRemovedPolicyCol,
table: loginNameTable,
}
)
func addLoginNameWithoutOwnerRemoved(eq map[string]interface{}) {
eq[LoginNameOwnerRemovedDomainCol.identifier()] = false
eq[LoginNameOwnerRemovedUserCol.identifier()] = false
eq[LoginNameOwnerRemovedPolicyCol.identifier()] = false
}
+15 -13
View File
@@ -149,30 +149,32 @@ var (
name: projection.SecondFactorCheckLifetimeCol,
table: loginPolicyTable,
}
LoginPolicyColumnMultiFacotrCheckLifetime = Column{
LoginPolicyColumnMultiFactorCheckLifetime = Column{
name: projection.MultiFactorCheckLifetimeCol,
table: loginPolicyTable,
}
LoginPolicyColumnOwnerRemoved = Column{
name: projection.LoginPolicyOwnerRemovedCol,
table: loginPolicyTable,
}
)
func (q *Queries) LoginPolicyByID(ctx context.Context, shouldTriggerBulk bool, orgID string) (*LoginPolicy, error) {
func (q *Queries) LoginPolicyByID(ctx context.Context, shouldTriggerBulk bool, orgID string, withOwnerRemoved bool) (*LoginPolicy, error) {
if shouldTriggerBulk {
projection.LoginPolicyProjection.Trigger(ctx)
}
eq := sq.Eq{LoginPolicyColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
eq[LoginPolicyColumnOwnerRemoved.identifier()] = false
}
query, scan := prepareLoginPolicyQuery()
stmt, args, err := query.Where(
sq.And{
sq.Eq{
LoginPolicyColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
eq,
sq.Or{
sq.Eq{
LoginPolicyColumnOrgID.identifier(): orgID,
},
sq.Eq{
LoginPolicyColumnOrgID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
sq.Eq{LoginPolicyColumnOrgID.identifier(): orgID},
sq.Eq{LoginPolicyColumnOrgID.identifier(): authz.GetInstance(ctx).InstanceID()},
},
}).Limit(1).OrderBy(LoginPolicyColumnIsDefault.identifier()).ToSql()
if err != nil {
@@ -192,7 +194,7 @@ func (q *Queries) scanAndAddLinksToLoginPolicy(ctx context.Context, rows *sql.Ro
return nil, err
}
links, err := q.IDPLoginPolicyLinks(ctx, policy.OrgID, &IDPLoginPolicyLinksSearchQuery{})
links, err := q.IDPLoginPolicyLinks(ctx, policy.OrgID, &IDPLoginPolicyLinksSearchQuery{}, false)
if err != nil {
return nil, err
}
@@ -343,7 +345,7 @@ func prepareLoginPolicyQuery() (sq.SelectBuilder, func(*sql.Rows) (*LoginPolicy,
LoginPolicyColumnExternalLoginCheckLifetime.identifier(),
LoginPolicyColumnMFAInitSkipLifetime.identifier(),
LoginPolicyColumnSecondFactorCheckLifetime.identifier(),
LoginPolicyColumnMultiFacotrCheckLifetime.identifier(),
LoginPolicyColumnMultiFactorCheckLifetime.identifier(),
).From(loginPolicyTable.identifier()).
PlaceholderFormat(sq.Dollar),
func(rows *sql.Rows) (*LoginPolicy, error) {
+40 -40
View File
@@ -15,30 +15,30 @@ import (
)
var (
loginPolicyQuery = `SELECT projections.login_policies3.aggregate_id,` +
` projections.login_policies3.creation_date,` +
` projections.login_policies3.change_date,` +
` projections.login_policies3.sequence,` +
` projections.login_policies3.allow_register,` +
` projections.login_policies3.allow_username_password,` +
` projections.login_policies3.allow_external_idps,` +
` projections.login_policies3.force_mfa,` +
` projections.login_policies3.second_factors,` +
` projections.login_policies3.multi_factors,` +
` projections.login_policies3.passwordless_type,` +
` projections.login_policies3.is_default,` +
` projections.login_policies3.hide_password_reset,` +
` projections.login_policies3.ignore_unknown_usernames,` +
` projections.login_policies3.allow_domain_discovery,` +
` projections.login_policies3.disable_login_with_email,` +
` projections.login_policies3.disable_login_with_phone,` +
` projections.login_policies3.default_redirect_uri,` +
` projections.login_policies3.password_check_lifetime,` +
` projections.login_policies3.external_login_check_lifetime,` +
` projections.login_policies3.mfa_init_skip_lifetime,` +
` projections.login_policies3.second_factor_check_lifetime,` +
` projections.login_policies3.multi_factor_check_lifetime` +
` FROM projections.login_policies3`
loginPolicyQuery = `SELECT projections.login_policies4.aggregate_id,` +
` projections.login_policies4.creation_date,` +
` projections.login_policies4.change_date,` +
` projections.login_policies4.sequence,` +
` projections.login_policies4.allow_register,` +
` projections.login_policies4.allow_username_password,` +
` projections.login_policies4.allow_external_idps,` +
` projections.login_policies4.force_mfa,` +
` projections.login_policies4.second_factors,` +
` projections.login_policies4.multi_factors,` +
` projections.login_policies4.passwordless_type,` +
` projections.login_policies4.is_default,` +
` projections.login_policies4.hide_password_reset,` +
` projections.login_policies4.ignore_unknown_usernames,` +
` projections.login_policies4.allow_domain_discovery,` +
` projections.login_policies4.disable_login_with_email,` +
` projections.login_policies4.disable_login_with_phone,` +
` projections.login_policies4.default_redirect_uri,` +
` projections.login_policies4.password_check_lifetime,` +
` projections.login_policies4.external_login_check_lifetime,` +
` projections.login_policies4.mfa_init_skip_lifetime,` +
` projections.login_policies4.second_factor_check_lifetime,` +
` projections.login_policies4.multi_factor_check_lifetime` +
` FROM projections.login_policies4`
loginPolicyCols = []string{
"aggregate_id",
"creation_date",
@@ -177,8 +177,8 @@ func Test_LoginPolicyPrepares(t *testing.T) {
prepare: prepareLoginPolicy2FAsQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.login_policies3.second_factors`+
` FROM projections.login_policies3`),
regexp.QuoteMeta(`SELECT projections.login_policies4.second_factors`+
` FROM projections.login_policies4`),
[]string{
"second_factors",
},
@@ -198,8 +198,8 @@ func Test_LoginPolicyPrepares(t *testing.T) {
prepare: prepareLoginPolicy2FAsQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.login_policies3.second_factors`+
` FROM projections.login_policies3`),
regexp.QuoteMeta(`SELECT projections.login_policies4.second_factors`+
` FROM projections.login_policies4`),
[]string{
"second_factors",
},
@@ -220,8 +220,8 @@ func Test_LoginPolicyPrepares(t *testing.T) {
prepare: prepareLoginPolicy2FAsQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.login_policies3.second_factors`+
` FROM projections.login_policies3`),
regexp.QuoteMeta(`SELECT projections.login_policies4.second_factors`+
` FROM projections.login_policies4`),
[]string{
"second_factors",
},
@@ -237,8 +237,8 @@ func Test_LoginPolicyPrepares(t *testing.T) {
prepare: prepareLoginPolicy2FAsQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.login_policies3.second_factors`+
` FROM projections.login_policies3`),
regexp.QuoteMeta(`SELECT projections.login_policies4.second_factors`+
` FROM projections.login_policies4`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
@@ -255,8 +255,8 @@ func Test_LoginPolicyPrepares(t *testing.T) {
prepare: prepareLoginPolicyMFAsQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.login_policies3.multi_factors`+
` FROM projections.login_policies3`),
regexp.QuoteMeta(`SELECT projections.login_policies4.multi_factors`+
` FROM projections.login_policies4`),
[]string{
"multi_factors",
},
@@ -276,8 +276,8 @@ func Test_LoginPolicyPrepares(t *testing.T) {
prepare: prepareLoginPolicyMFAsQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.login_policies3.multi_factors`+
` FROM projections.login_policies3`),
regexp.QuoteMeta(`SELECT projections.login_policies4.multi_factors`+
` FROM projections.login_policies4`),
[]string{
"multi_factors",
},
@@ -298,8 +298,8 @@ func Test_LoginPolicyPrepares(t *testing.T) {
prepare: prepareLoginPolicyMFAsQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.login_policies3.multi_factors`+
` FROM projections.login_policies3`),
regexp.QuoteMeta(`SELECT projections.login_policies4.multi_factors`+
` FROM projections.login_policies4`),
[]string{
"multi_factors",
},
@@ -315,8 +315,8 @@ func Test_LoginPolicyPrepares(t *testing.T) {
prepare: prepareLoginPolicyMFAsQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.login_policies3.multi_factors`+
` FROM projections.login_policies3`),
regexp.QuoteMeta(`SELECT projections.login_policies4.multi_factors`+
` FROM projections.login_policies4`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
+12 -10
View File
@@ -62,22 +62,24 @@ var (
name: projection.MailTemplateStateCol,
table: mailTemplateTable,
}
MailTemplateColOwnerRemoved = Column{
name: projection.MailTemplateOwnerRemovedCol,
table: mailTemplateTable,
}
)
func (q *Queries) MailTemplateByOrg(ctx context.Context, orgID string) (*MailTemplate, error) {
func (q *Queries) MailTemplateByOrg(ctx context.Context, orgID string, withOwnerRemoved bool) (*MailTemplate, error) {
stmt, scan := prepareMailTemplateQuery()
eq := sq.Eq{MailTemplateColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
eq[MailTemplateColOwnerRemoved.identifier()] = false
}
query, args, err := stmt.Where(
sq.And{
sq.Eq{
MailTemplateColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
eq,
sq.Or{
sq.Eq{
MailTemplateColAggregateID.identifier(): orgID,
},
sq.Eq{
MailTemplateColAggregateID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
sq.Eq{MailTemplateColAggregateID.identifier(): orgID},
sq.Eq{MailTemplateColAggregateID.identifier(): authz.GetInstance(ctx).InstanceID()},
},
}).
OrderBy(MailTemplateColIsDefault.identifier()).
+17 -12
View File
@@ -116,6 +116,10 @@ var (
name: projection.MessageTextFooterCol,
table: messageTextTable,
}
MessageTextColOwnerRemoved = Column{
name: projection.MessageTextOwnerRemovedCol,
table: messageTextTable,
}
)
func (q *Queries) DefaultMessageText(ctx context.Context) (*MessageText, error) {
@@ -145,18 +149,19 @@ func (q *Queries) DefaultMessageTextByTypeAndLanguageFromFileSystem(ctx context.
return messageTexts.GetMessageTextByType(messageType), nil
}
func (q *Queries) CustomMessageTextByTypeAndLanguage(ctx context.Context, aggregateID, messageType, language string) (*MessageText, error) {
func (q *Queries) CustomMessageTextByTypeAndLanguage(ctx context.Context, aggregateID, messageType, language string, withOwnerRemoved bool) (*MessageText, error) {
stmt, scan := prepareMessageTextQuery()
query, args, err := stmt.Where(
sq.Eq{
MessageTextColLanguage.identifier(): language,
MessageTextColType.identifier(): messageType,
MessageTextColAggregateID.identifier(): aggregateID,
MessageTextColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
).
OrderBy(MessageTextColAggregateID.identifier()).
Limit(1).ToSql()
eq := sq.Eq{
MessageTextColLanguage.identifier(): language,
MessageTextColType.identifier(): messageType,
MessageTextColAggregateID.identifier(): aggregateID,
MessageTextColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[MessageTextColOwnerRemoved.identifier()] = false
}
query, args, err := stmt.Where(eq).OrderBy(MessageTextColAggregateID.identifier()).Limit(1).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-1b9mf", "Errors.Query.SQLStatement")
}
@@ -178,7 +183,7 @@ func (q *Queries) IAMMessageTextByTypeAndLanguage(ctx context.Context, messageTy
if err := yaml.Unmarshal(contents, &notificationTextMap); err != nil {
return nil, errors.ThrowInternal(err, "QUERY-ekjFF", "Errors.TranslationFile.ReadError")
}
texts, err := q.CustomTextList(ctx, authz.GetInstance(ctx).InstanceID(), messageType, language)
texts, err := q.CustomTextList(ctx, authz.GetInstance(ctx).InstanceID(), messageType, language, false)
if err != nil {
return nil, err
}
+45 -45
View File
@@ -30,21 +30,21 @@ func Test_MessageTextPrepares(t *testing.T) {
prepare: prepareMessageTextQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.message_texts.aggregate_id,`+
` projections.message_texts.sequence,`+
` projections.message_texts.creation_date,`+
` projections.message_texts.change_date,`+
` projections.message_texts.state,`+
` projections.message_texts.type,`+
` projections.message_texts.language,`+
` projections.message_texts.title,`+
` projections.message_texts.pre_header,`+
` projections.message_texts.subject,`+
` projections.message_texts.greeting,`+
` projections.message_texts.text,`+
` projections.message_texts.button_text,`+
` projections.message_texts.footer_text`+
` FROM projections.message_texts`),
regexp.QuoteMeta(`SELECT projections.message_texts2.aggregate_id,`+
` projections.message_texts2.sequence,`+
` projections.message_texts2.creation_date,`+
` projections.message_texts2.change_date,`+
` projections.message_texts2.state,`+
` projections.message_texts2.type,`+
` projections.message_texts2.language,`+
` projections.message_texts2.title,`+
` projections.message_texts2.pre_header,`+
` projections.message_texts2.subject,`+
` projections.message_texts2.greeting,`+
` projections.message_texts2.text,`+
` projections.message_texts2.button_text,`+
` projections.message_texts2.footer_text`+
` FROM projections.message_texts2`),
nil,
nil,
),
@@ -62,21 +62,21 @@ func Test_MessageTextPrepares(t *testing.T) {
prepare: prepareMessageTextQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.message_texts.aggregate_id,`+
` projections.message_texts.sequence,`+
` projections.message_texts.creation_date,`+
` projections.message_texts.change_date,`+
` projections.message_texts.state,`+
` projections.message_texts.type,`+
` projections.message_texts.language,`+
` projections.message_texts.title,`+
` projections.message_texts.pre_header,`+
` projections.message_texts.subject,`+
` projections.message_texts.greeting,`+
` projections.message_texts.text,`+
` projections.message_texts.button_text,`+
` projections.message_texts.footer_text`+
` FROM projections.message_texts`),
regexp.QuoteMeta(`SELECT projections.message_texts2.aggregate_id,`+
` projections.message_texts2.sequence,`+
` projections.message_texts2.creation_date,`+
` projections.message_texts2.change_date,`+
` projections.message_texts2.state,`+
` projections.message_texts2.type,`+
` projections.message_texts2.language,`+
` projections.message_texts2.title,`+
` projections.message_texts2.pre_header,`+
` projections.message_texts2.subject,`+
` projections.message_texts2.greeting,`+
` projections.message_texts2.text,`+
` projections.message_texts2.button_text,`+
` projections.message_texts2.footer_text`+
` FROM projections.message_texts2`),
[]string{
"aggregate_id",
"sequence",
@@ -133,21 +133,21 @@ func Test_MessageTextPrepares(t *testing.T) {
prepare: prepareMessageTextQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.message_texts.aggregate_id,`+
` projections.message_texts.sequence,`+
` projections.message_texts.creation_date,`+
` projections.message_texts.change_date,`+
` projections.message_texts.state,`+
` projections.message_texts.type,`+
` projections.message_texts.language,`+
` projections.message_texts.title,`+
` projections.message_texts.pre_header,`+
` projections.message_texts.subject,`+
` projections.message_texts.greeting,`+
` projections.message_texts.text,`+
` projections.message_texts.button_text,`+
` projections.message_texts.footer_text`+
` FROM projections.message_texts`),
regexp.QuoteMeta(`SELECT projections.message_texts2.aggregate_id,`+
` projections.message_texts2.sequence,`+
` projections.message_texts2.creation_date,`+
` projections.message_texts2.change_date,`+
` projections.message_texts2.state,`+
` projections.message_texts2.type,`+
` projections.message_texts2.language,`+
` projections.message_texts2.title,`+
` projections.message_texts2.pre_header,`+
` projections.message_texts2.subject,`+
` projections.message_texts2.greeting,`+
` projections.message_texts2.text,`+
` projections.message_texts2.button_text,`+
` projections.message_texts2.footer_text`+
` FROM projections.message_texts2`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
+1 -3
View File
@@ -73,9 +73,7 @@ func (q *Queries) NotificationProviderByIDAndType(ctx context.Context, aggID str
query, scan := prepareDebugNotificationProviderQuery()
stmt, args, err := query.Where(
sq.And{
sq.Eq{
NotificationProviderColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
sq.Eq{NotificationProviderColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()},
sq.Or{
sq.Eq{
NotificationProviderColumnAggID.identifier(): aggID,
+10 -5
View File
@@ -54,12 +54,13 @@ func NewOrgDomainVerifiedSearchQuery(verified bool) (SearchQuery, error) {
return NewBoolQuery(OrgDomainIsVerifiedCol, verified)
}
func (q *Queries) SearchOrgDomains(ctx context.Context, queries *OrgDomainSearchQueries) (domains *Domains, err error) {
func (q *Queries) SearchOrgDomains(ctx context.Context, queries *OrgDomainSearchQueries, withOwnerRemoved bool) (domains *Domains, err error) {
query, scan := prepareDomainsQuery()
stmt, args, err := queries.toQuery(query).
Where(sq.Eq{
OrgDomainInstanceIDCol.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
eq := sq.Eq{OrgDomainInstanceIDCol.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
eq[OrgDomainOwnerRemovedCol.identifier()] = false
}
stmt, args, err := queries.toQuery(query).Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-ZRfj1", "Errors.Query.SQLStatement")
}
@@ -165,4 +166,8 @@ var (
name: projection.OrgDomainValidationTypeCol,
table: orgDomainsTable,
}
OrgDomainOwnerRemovedCol = Column{
name: projection.OrgDomainOwnerRemovedCol,
table: orgDomainsTable,
}
)
+36 -36
View File
@@ -27,16 +27,16 @@ func Test_OrgDomainPrepares(t *testing.T) {
prepare: prepareDomainsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.org_domains.creation_date,`+
` projections.org_domains.change_date,`+
` projections.org_domains.sequence,`+
` projections.org_domains.domain,`+
` projections.org_domains.org_id,`+
` projections.org_domains.is_verified,`+
` projections.org_domains.is_primary,`+
` projections.org_domains.validation_type,`+
regexp.QuoteMeta(`SELECT projections.org_domains2.creation_date,`+
` projections.org_domains2.change_date,`+
` projections.org_domains2.sequence,`+
` projections.org_domains2.domain,`+
` projections.org_domains2.org_id,`+
` projections.org_domains2.is_verified,`+
` projections.org_domains2.is_primary,`+
` projections.org_domains2.validation_type,`+
` COUNT(*) OVER ()`+
` FROM projections.org_domains`),
` FROM projections.org_domains2`),
nil,
nil,
),
@@ -48,16 +48,16 @@ func Test_OrgDomainPrepares(t *testing.T) {
prepare: prepareDomainsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.org_domains.creation_date,`+
` projections.org_domains.change_date,`+
` projections.org_domains.sequence,`+
` projections.org_domains.domain,`+
` projections.org_domains.org_id,`+
` projections.org_domains.is_verified,`+
` projections.org_domains.is_primary,`+
` projections.org_domains.validation_type,`+
regexp.QuoteMeta(`SELECT projections.org_domains2.creation_date,`+
` projections.org_domains2.change_date,`+
` projections.org_domains2.sequence,`+
` projections.org_domains2.domain,`+
` projections.org_domains2.org_id,`+
` projections.org_domains2.is_verified,`+
` projections.org_domains2.is_primary,`+
` projections.org_domains2.validation_type,`+
` COUNT(*) OVER ()`+
` FROM projections.org_domains`),
` FROM projections.org_domains2`),
[]string{
"id",
"creation_date",
@@ -106,16 +106,16 @@ func Test_OrgDomainPrepares(t *testing.T) {
prepare: prepareDomainsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.org_domains.creation_date,`+
` projections.org_domains.change_date,`+
` projections.org_domains.sequence,`+
` projections.org_domains.domain,`+
` projections.org_domains.org_id,`+
` projections.org_domains.is_verified,`+
` projections.org_domains.is_primary,`+
` projections.org_domains.validation_type,`+
regexp.QuoteMeta(`SELECT projections.org_domains2.creation_date,`+
` projections.org_domains2.change_date,`+
` projections.org_domains2.sequence,`+
` projections.org_domains2.domain,`+
` projections.org_domains2.org_id,`+
` projections.org_domains2.is_verified,`+
` projections.org_domains2.is_primary,`+
` projections.org_domains2.validation_type,`+
` COUNT(*) OVER ()`+
` FROM projections.org_domains`),
` FROM projections.org_domains2`),
[]string{
"id",
"creation_date",
@@ -184,16 +184,16 @@ func Test_OrgDomainPrepares(t *testing.T) {
prepare: prepareDomainsQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.org_domains.creation_date,`+
` projections.org_domains.change_date,`+
` projections.org_domains.sequence,`+
` projections.org_domains.domain,`+
` projections.org_domains.org_id,`+
` projections.org_domains.is_verified,`+
` projections.org_domains.is_primary,`+
` projections.org_domains.validation_type,`+
regexp.QuoteMeta(`SELECT projections.org_domains2.creation_date,`+
` projections.org_domains2.change_date,`+
` projections.org_domains2.sequence,`+
` projections.org_domains2.domain,`+
` projections.org_domains2.org_id,`+
` projections.org_domains2.is_verified,`+
` projections.org_domains2.is_primary,`+
` projections.org_domains2.validation_type,`+
` COUNT(*) OVER ()`+
` FROM projections.org_domains`),
` FROM projections.org_domains2`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
+20 -5
View File
@@ -49,6 +49,14 @@ var (
name: projection.OrgMemberOrgIDCol,
table: orgMemberTable,
}
OrgMemberOwnerRemoved = Column{
name: projection.MemberOwnerRemoved,
table: orgMemberTable,
}
OrgMemberOwnerRemovedUser = Column{
name: projection.MemberUserOwnerRemoved,
table: orgMemberTable,
}
)
type OrgMembersQuery struct {
@@ -62,12 +70,19 @@ func (q *OrgMembersQuery) toQuery(query sq.SelectBuilder) sq.SelectBuilder {
Where(sq.Eq{OrgMemberOrgID.identifier(): q.OrgID})
}
func (q *Queries) OrgMembers(ctx context.Context, queries *OrgMembersQuery) (*Members, error) {
func addOrgMemberWithoutOwnerRemoved(eq map[string]interface{}) {
eq[OrgMemberOwnerRemoved.identifier()] = false
eq[OrgMemberOwnerRemovedUser.identifier()] = false
}
func (q *Queries) OrgMembers(ctx context.Context, queries *OrgMembersQuery, withOwnerRemoved bool) (*Members, error) {
query, scan := prepareOrgMembersQuery()
stmt, args, err := queries.toQuery(query).
Where(sq.Eq{
OrgMemberInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
eq := sq.Eq{OrgMemberInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
addOrgMemberWithoutOwnerRemoved(eq)
addLoginNameWithoutOwnerRemoved(eq)
}
stmt, args, err := queries.toQuery(query).Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-PDAVB", "Errors.Query.InvalidRequest")
}
+18 -18
View File
@@ -19,25 +19,25 @@ var (
", members.resource_owner" +
", members.user_id" +
", members.roles" +
", projections.login_names.login_name" +
", projections.users5_humans.email" +
", projections.users5_humans.first_name" +
", projections.users5_humans.last_name" +
", projections.users5_humans.display_name" +
", projections.users5_machines.name" +
", projections.users5_humans.avatar_key" +
", projections.login_names2.login_name" +
", projections.users6_humans.email" +
", projections.users6_humans.first_name" +
", projections.users6_humans.last_name" +
", projections.users6_humans.display_name" +
", projections.users6_machines.name" +
", projections.users6_humans.avatar_key" +
", COUNT(*) OVER () " +
"FROM projections.org_members2 AS members " +
"LEFT JOIN projections.users5_humans " +
"ON members.user_id = projections.users5_humans.user_id " +
"AND members.instance_id = projections.users5_humans.instance_id " +
"LEFT JOIN projections.users5_machines " +
"ON members.user_id = projections.users5_machines.user_id " +
"AND members.instance_id = projections.users5_machines.instance_id " +
"LEFT JOIN projections.login_names " +
"ON members.user_id = projections.login_names.user_id " +
"AND members.instance_id = projections.login_names.instance_id " +
"WHERE projections.login_names.is_primary = $1")
"FROM projections.org_members3 AS members " +
"LEFT JOIN projections.users6_humans " +
"ON members.user_id = projections.users6_humans.user_id " +
"AND members.instance_id = projections.users6_humans.instance_id " +
"LEFT JOIN projections.users6_machines " +
"ON members.user_id = projections.users6_machines.user_id " +
"AND members.instance_id = projections.users6_machines.instance_id " +
"LEFT JOIN projections.login_names2 " +
"ON members.user_id = projections.login_names2.user_id " +
"AND members.instance_id = projections.login_names2.instance_id " +
"WHERE projections.login_names2.is_primary = $1")
orgMembersColumns = []string{
"creation_date",
"change_date",
+23 -15
View File
@@ -69,9 +69,13 @@ var (
name: projection.OrgMetadataColumnValue,
table: orgMetadataTable,
}
OrgMetadataOwnerRemovedCol = Column{
name: projection.OrgMetadataColumnOwnerRemoved,
table: orgMetadataTable,
}
)
func (q *Queries) GetOrgMetadataByKey(ctx context.Context, shouldTriggerBulk bool, orgID string, key string, queries ...SearchQuery) (*OrgMetadata, error) {
func (q *Queries) GetOrgMetadataByKey(ctx context.Context, shouldTriggerBulk bool, orgID string, key string, withOwnerRemoved bool, queries ...SearchQuery) (*OrgMetadata, error) {
if shouldTriggerBulk {
projection.OrgMetadataProjection.Trigger(ctx)
}
@@ -80,12 +84,15 @@ func (q *Queries) GetOrgMetadataByKey(ctx context.Context, shouldTriggerBulk boo
for _, q := range queries {
query = q.toQuery(query)
}
stmt, args, err := query.Where(
sq.Eq{
OrgMetadataOrgIDCol.identifier(): orgID,
OrgMetadataKeyCol.identifier(): key,
OrgMetadataInstanceIDCol.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
eq := sq.Eq{
OrgMetadataOrgIDCol.identifier(): orgID,
OrgMetadataKeyCol.identifier(): key,
OrgMetadataInstanceIDCol.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[OrgMetadataOwnerRemovedCol.identifier()] = false
}
stmt, args, err := query.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-aDaG2", "Errors.Query.SQLStatment")
}
@@ -94,18 +101,19 @@ func (q *Queries) GetOrgMetadataByKey(ctx context.Context, shouldTriggerBulk boo
return scan(row)
}
func (q *Queries) SearchOrgMetadata(ctx context.Context, shouldTriggerBulk bool, orgID string, queries *OrgMetadataSearchQueries) (*OrgMetadataList, error) {
func (q *Queries) SearchOrgMetadata(ctx context.Context, shouldTriggerBulk bool, orgID string, queries *OrgMetadataSearchQueries, withOwnerRemoved bool) (*OrgMetadataList, error) {
if shouldTriggerBulk {
projection.OrgMetadataProjection.Trigger(ctx)
}
eq := sq.Eq{
OrgMetadataOrgIDCol.identifier(): orgID,
OrgMetadataInstanceIDCol.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[OrgMetadataOwnerRemovedCol.identifier()] = false
}
query, scan := prepareOrgMetadataListQuery()
stmt, args, err := queries.toQuery(query).Where(
sq.Eq{
OrgMetadataOrgIDCol.identifier(): orgID,
OrgMetadataInstanceIDCol.identifier(): authz.GetInstance(ctx).InstanceID(),
}).
ToSql()
stmt, args, err := queries.toQuery(query).Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-Egbld", "Errors.Query.SQLStatment")
}
+14 -14
View File
@@ -12,13 +12,13 @@ import (
)
var (
orgMetadataQuery = `SELECT projections.org_metadata.creation_date,` +
` projections.org_metadata.change_date,` +
` projections.org_metadata.resource_owner,` +
` projections.org_metadata.sequence,` +
` projections.org_metadata.key,` +
` projections.org_metadata.value` +
` FROM projections.org_metadata`
orgMetadataQuery = `SELECT projections.org_metadata2.creation_date,` +
` projections.org_metadata2.change_date,` +
` projections.org_metadata2.resource_owner,` +
` projections.org_metadata2.sequence,` +
` projections.org_metadata2.key,` +
` projections.org_metadata2.value` +
` FROM projections.org_metadata2`
orgMetadataCols = []string{
"creation_date",
"change_date",
@@ -27,14 +27,14 @@ var (
"key",
"value",
}
orgMetadataListQuery = `SELECT projections.org_metadata.creation_date,` +
` projections.org_metadata.change_date,` +
` projections.org_metadata.resource_owner,` +
` projections.org_metadata.sequence,` +
` projections.org_metadata.key,` +
` projections.org_metadata.value,` +
orgMetadataListQuery = `SELECT projections.org_metadata2.creation_date,` +
` projections.org_metadata2.change_date,` +
` projections.org_metadata2.resource_owner,` +
` projections.org_metadata2.sequence,` +
` projections.org_metadata2.key,` +
` projections.org_metadata2.value,` +
` COUNT(*) OVER ()` +
` FROM projections.org_metadata`
` FROM projections.org_metadata2`
orgMetadataListCols = []string{
"creation_date",
"change_date",
+12 -11
View File
@@ -73,26 +73,27 @@ var (
name: projection.AgePolicyStateCol,
table: passwordAgeTable,
}
PasswordAgeColOwnerRemoved = Column{
name: projection.AgePolicyOwnerRemovedCol,
table: passwordAgeTable,
}
)
func (q *Queries) PasswordAgePolicyByOrg(ctx context.Context, shouldTriggerBulk bool, orgID string) (*PasswordAgePolicy, error) {
func (q *Queries) PasswordAgePolicyByOrg(ctx context.Context, shouldTriggerBulk bool, orgID string, withOwnerRemoved bool) (*PasswordAgePolicy, error) {
if shouldTriggerBulk {
projection.PasswordAgeProjection.Trigger(ctx)
}
eq := sq.Eq{PasswordAgeColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
eq[PasswordAgeColOwnerRemoved.identifier()] = false
}
stmt, scan := preparePasswordAgePolicyQuery()
query, args, err := stmt.Where(
sq.And{
sq.Eq{
PasswordAgeColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
eq,
sq.Or{
sq.Eq{
PasswordAgeColID.identifier(): orgID,
},
sq.Eq{
PasswordAgeColID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
sq.Eq{PasswordAgeColID.identifier(): orgID},
sq.Eq{PasswordAgeColID.identifier(): authz.GetInstance(ctx).InstanceID()},
},
}).
OrderBy(PasswordAgeColIsDefault.identifier()).
+30 -30
View File
@@ -28,16 +28,16 @@ func Test_PasswordAgePolicyPrepares(t *testing.T) {
prepare: preparePasswordAgePolicyQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.password_age_policies.id,`+
` projections.password_age_policies.sequence,`+
` projections.password_age_policies.creation_date,`+
` projections.password_age_policies.change_date,`+
` projections.password_age_policies.resource_owner,`+
` projections.password_age_policies.expire_warn_days,`+
` projections.password_age_policies.max_age_days,`+
` projections.password_age_policies.is_default,`+
` projections.password_age_policies.state`+
` FROM projections.password_age_policies`),
regexp.QuoteMeta(`SELECT projections.password_age_policies2.id,`+
` projections.password_age_policies2.sequence,`+
` projections.password_age_policies2.creation_date,`+
` projections.password_age_policies2.change_date,`+
` projections.password_age_policies2.resource_owner,`+
` projections.password_age_policies2.expire_warn_days,`+
` projections.password_age_policies2.max_age_days,`+
` projections.password_age_policies2.is_default,`+
` projections.password_age_policies2.state`+
` FROM projections.password_age_policies2`),
nil,
nil,
),
@@ -55,16 +55,16 @@ func Test_PasswordAgePolicyPrepares(t *testing.T) {
prepare: preparePasswordAgePolicyQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.password_age_policies.id,`+
` projections.password_age_policies.sequence,`+
` projections.password_age_policies.creation_date,`+
` projections.password_age_policies.change_date,`+
` projections.password_age_policies.resource_owner,`+
` projections.password_age_policies.expire_warn_days,`+
` projections.password_age_policies.max_age_days,`+
` projections.password_age_policies.is_default,`+
` projections.password_age_policies.state`+
` FROM projections.password_age_policies`),
regexp.QuoteMeta(`SELECT projections.password_age_policies2.id,`+
` projections.password_age_policies2.sequence,`+
` projections.password_age_policies2.creation_date,`+
` projections.password_age_policies2.change_date,`+
` projections.password_age_policies2.resource_owner,`+
` projections.password_age_policies2.expire_warn_days,`+
` projections.password_age_policies2.max_age_days,`+
` projections.password_age_policies2.is_default,`+
` projections.password_age_policies2.state`+
` FROM projections.password_age_policies2`),
[]string{
"id",
"sequence",
@@ -106,16 +106,16 @@ func Test_PasswordAgePolicyPrepares(t *testing.T) {
prepare: preparePasswordAgePolicyQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.password_age_policies.id,`+
` projections.password_age_policies.sequence,`+
` projections.password_age_policies.creation_date,`+
` projections.password_age_policies.change_date,`+
` projections.password_age_policies.resource_owner,`+
` projections.password_age_policies.expire_warn_days,`+
` projections.password_age_policies.max_age_days,`+
` projections.password_age_policies.is_default,`+
` projections.password_age_policies.state`+
` FROM projections.password_age_policies`),
regexp.QuoteMeta(`SELECT projections.password_age_policies2.id,`+
` projections.password_age_policies2.sequence,`+
` projections.password_age_policies2.creation_date,`+
` projections.password_age_policies2.change_date,`+
` projections.password_age_policies2.resource_owner,`+
` projections.password_age_policies2.expire_warn_days,`+
` projections.password_age_policies2.max_age_days,`+
` projections.password_age_policies2.is_default,`+
` projections.password_age_policies2.state`+
` FROM projections.password_age_policies2`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
+12 -11
View File
@@ -31,24 +31,21 @@ type PasswordComplexityPolicy struct {
IsDefault bool
}
func (q *Queries) PasswordComplexityPolicyByOrg(ctx context.Context, shouldTriggerBulk bool, orgID string) (*PasswordComplexityPolicy, error) {
func (q *Queries) PasswordComplexityPolicyByOrg(ctx context.Context, shouldTriggerBulk bool, orgID string, withOwnerRemoved bool) (*PasswordComplexityPolicy, error) {
if shouldTriggerBulk {
projection.PasswordComplexityProjection.Trigger(ctx)
}
eq := sq.Eq{PasswordComplexityColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
eq[PasswordComplexityColOwnerRemoved.identifier()] = false
}
stmt, scan := preparePasswordComplexityPolicyQuery()
query, args, err := stmt.Where(
sq.And{
sq.Eq{
PasswordComplexityColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
eq,
sq.Or{
sq.Eq{
PasswordComplexityColID.identifier(): orgID,
},
sq.Eq{
PasswordComplexityColID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
sq.Eq{PasswordComplexityColID.identifier(): orgID},
sq.Eq{PasswordComplexityColID.identifier(): authz.GetInstance(ctx).InstanceID()},
},
}).
OrderBy(PasswordComplexityColIsDefault.identifier()).
@@ -138,6 +135,10 @@ var (
name: projection.ComplexityPolicyStateCol,
table: passwordComplexityTable,
}
PasswordComplexityColOwnerRemoved = Column{
name: projection.ComplexityPolicyOwnerRemovedCol,
table: passwordComplexityTable,
}
)
func preparePasswordComplexityPolicyQuery() (sq.SelectBuilder, func(*sql.Row) (*PasswordComplexityPolicy, error)) {
@@ -28,19 +28,19 @@ func Test_PasswordComplexityPolicyPrepares(t *testing.T) {
prepare: preparePasswordComplexityPolicyQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.password_complexity_policies.id,`+
` projections.password_complexity_policies.sequence,`+
` projections.password_complexity_policies.creation_date,`+
` projections.password_complexity_policies.change_date,`+
` projections.password_complexity_policies.resource_owner,`+
` projections.password_complexity_policies.min_length,`+
` projections.password_complexity_policies.has_lowercase,`+
` projections.password_complexity_policies.has_uppercase,`+
` projections.password_complexity_policies.has_number,`+
` projections.password_complexity_policies.has_symbol,`+
` projections.password_complexity_policies.is_default,`+
` projections.password_complexity_policies.state`+
` FROM projections.password_complexity_policies`),
regexp.QuoteMeta(`SELECT projections.password_complexity_policies2.id,`+
` projections.password_complexity_policies2.sequence,`+
` projections.password_complexity_policies2.creation_date,`+
` projections.password_complexity_policies2.change_date,`+
` projections.password_complexity_policies2.resource_owner,`+
` projections.password_complexity_policies2.min_length,`+
` projections.password_complexity_policies2.has_lowercase,`+
` projections.password_complexity_policies2.has_uppercase,`+
` projections.password_complexity_policies2.has_number,`+
` projections.password_complexity_policies2.has_symbol,`+
` projections.password_complexity_policies2.is_default,`+
` projections.password_complexity_policies2.state`+
` FROM projections.password_complexity_policies2`),
nil,
nil,
),
@@ -58,19 +58,19 @@ func Test_PasswordComplexityPolicyPrepares(t *testing.T) {
prepare: preparePasswordComplexityPolicyQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.password_complexity_policies.id,`+
` projections.password_complexity_policies.sequence,`+
` projections.password_complexity_policies.creation_date,`+
` projections.password_complexity_policies.change_date,`+
` projections.password_complexity_policies.resource_owner,`+
` projections.password_complexity_policies.min_length,`+
` projections.password_complexity_policies.has_lowercase,`+
` projections.password_complexity_policies.has_uppercase,`+
` projections.password_complexity_policies.has_number,`+
` projections.password_complexity_policies.has_symbol,`+
` projections.password_complexity_policies.is_default,`+
` projections.password_complexity_policies.state`+
` FROM projections.password_complexity_policies`),
regexp.QuoteMeta(`SELECT projections.password_complexity_policies2.id,`+
` projections.password_complexity_policies2.sequence,`+
` projections.password_complexity_policies2.creation_date,`+
` projections.password_complexity_policies2.change_date,`+
` projections.password_complexity_policies2.resource_owner,`+
` projections.password_complexity_policies2.min_length,`+
` projections.password_complexity_policies2.has_lowercase,`+
` projections.password_complexity_policies2.has_uppercase,`+
` projections.password_complexity_policies2.has_number,`+
` projections.password_complexity_policies2.has_symbol,`+
` projections.password_complexity_policies2.is_default,`+
` projections.password_complexity_policies2.state`+
` FROM projections.password_complexity_policies2`),
[]string{
"id",
"sequence",
@@ -121,19 +121,19 @@ func Test_PasswordComplexityPolicyPrepares(t *testing.T) {
prepare: preparePasswordComplexityPolicyQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.password_complexity_policies.id,`+
` projections.password_complexity_policies.sequence,`+
` projections.password_complexity_policies.creation_date,`+
` projections.password_complexity_policies.change_date,`+
` projections.password_complexity_policies.resource_owner,`+
` projections.password_complexity_policies.min_length,`+
` projections.password_complexity_policies.has_lowercase,`+
` projections.password_complexity_policies.has_uppercase,`+
` projections.password_complexity_policies.has_number,`+
` projections.password_complexity_policies.has_symbol,`+
` projections.password_complexity_policies.is_default,`+
` projections.password_complexity_policies.state`+
` FROM projections.password_complexity_policies`),
regexp.QuoteMeta(`SELECT projections.password_complexity_policies2.id,`+
` projections.password_complexity_policies2.sequence,`+
` projections.password_complexity_policies2.creation_date,`+
` projections.password_complexity_policies2.change_date,`+
` projections.password_complexity_policies2.resource_owner,`+
` projections.password_complexity_policies2.min_length,`+
` projections.password_complexity_policies2.has_lowercase,`+
` projections.password_complexity_policies2.has_uppercase,`+
` projections.password_complexity_policies2.has_number,`+
` projections.password_complexity_policies2.has_symbol,`+
` projections.password_complexity_policies2.is_default,`+
` projections.password_complexity_policies2.state`+
` FROM projections.password_complexity_policies2`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
+13 -13
View File
@@ -78,30 +78,30 @@ var (
name: projection.PrivacyPolicyStateCol,
table: privacyTable,
}
PrivacyColOwnerRemoved = Column{
name: projection.PrivacyPolicyOwnerRemovedCol,
table: privacyTable,
}
)
func (q *Queries) PrivacyPolicyByOrg(ctx context.Context, shouldTriggerBulk bool, orgID string) (*PrivacyPolicy, error) {
func (q *Queries) PrivacyPolicyByOrg(ctx context.Context, shouldTriggerBulk bool, orgID string, withOwnerRemoved bool) (*PrivacyPolicy, error) {
if shouldTriggerBulk {
projection.PrivacyPolicyProjection.Trigger(ctx)
}
eq := sq.Eq{PrivacyColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
eq[PrivacyColOwnerRemoved.identifier()] = false
}
stmt, scan := preparePrivacyPolicyQuery()
query, args, err := stmt.Where(
sq.And{
sq.Eq{
PrivacyColInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
eq,
sq.Or{
sq.Eq{
PrivacyColID.identifier(): orgID,
},
sq.Eq{
PrivacyColID.identifier(): authz.GetInstance(ctx).InstanceID(),
},
sq.Eq{PrivacyColID.identifier(): orgID},
sq.Eq{PrivacyColID.identifier(): authz.GetInstance(ctx).InstanceID()},
},
}).
OrderBy(PrivacyColIsDefault.identifier()).
Limit(1).ToSql()
OrderBy(PrivacyColIsDefault.identifier()).Limit(1).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-UXuPI", "Errors.Query.SQLStatement")
}
+33 -33
View File
@@ -28,17 +28,17 @@ func Test_PrivacyPolicyPrepares(t *testing.T) {
prepare: preparePrivacyPolicyQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.privacy_policies.id,`+
` projections.privacy_policies.sequence,`+
` projections.privacy_policies.creation_date,`+
` projections.privacy_policies.change_date,`+
` projections.privacy_policies.resource_owner,`+
` projections.privacy_policies.privacy_link,`+
` projections.privacy_policies.tos_link,`+
` projections.privacy_policies.help_link,`+
` projections.privacy_policies.is_default,`+
` projections.privacy_policies.state`+
` FROM projections.privacy_policies`),
regexp.QuoteMeta(`SELECT projections.privacy_policies2.id,`+
` projections.privacy_policies2.sequence,`+
` projections.privacy_policies2.creation_date,`+
` projections.privacy_policies2.change_date,`+
` projections.privacy_policies2.resource_owner,`+
` projections.privacy_policies2.privacy_link,`+
` projections.privacy_policies2.tos_link,`+
` projections.privacy_policies2.help_link,`+
` projections.privacy_policies2.is_default,`+
` projections.privacy_policies2.state`+
` FROM projections.privacy_policies2`),
nil,
nil,
),
@@ -56,17 +56,17 @@ func Test_PrivacyPolicyPrepares(t *testing.T) {
prepare: preparePrivacyPolicyQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.privacy_policies.id,`+
` projections.privacy_policies.sequence,`+
` projections.privacy_policies.creation_date,`+
` projections.privacy_policies.change_date,`+
` projections.privacy_policies.resource_owner,`+
` projections.privacy_policies.privacy_link,`+
` projections.privacy_policies.tos_link,`+
` projections.privacy_policies.help_link,`+
` projections.privacy_policies.is_default,`+
` projections.privacy_policies.state`+
` FROM projections.privacy_policies`),
regexp.QuoteMeta(`SELECT projections.privacy_policies2.id,`+
` projections.privacy_policies2.sequence,`+
` projections.privacy_policies2.creation_date,`+
` projections.privacy_policies2.change_date,`+
` projections.privacy_policies2.resource_owner,`+
` projections.privacy_policies2.privacy_link,`+
` projections.privacy_policies2.tos_link,`+
` projections.privacy_policies2.help_link,`+
` projections.privacy_policies2.is_default,`+
` projections.privacy_policies2.state`+
` FROM projections.privacy_policies2`),
[]string{
"id",
"sequence",
@@ -111,17 +111,17 @@ func Test_PrivacyPolicyPrepares(t *testing.T) {
prepare: preparePrivacyPolicyQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.privacy_policies.id,`+
` projections.privacy_policies.sequence,`+
` projections.privacy_policies.creation_date,`+
` projections.privacy_policies.change_date,`+
` projections.privacy_policies.resource_owner,`+
` projections.privacy_policies.privacy_link,`+
` projections.privacy_policies.tos_link,`+
` projections.privacy_policies.help_link,`+
` projections.privacy_policies.is_default,`+
` projections.privacy_policies.state`+
` FROM projections.privacy_policies`),
regexp.QuoteMeta(`SELECT projections.privacy_policies2.id,`+
` projections.privacy_policies2.sequence,`+
` projections.privacy_policies2.creation_date,`+
` projections.privacy_policies2.change_date,`+
` projections.privacy_policies2.resource_owner,`+
` projections.privacy_policies2.privacy_link,`+
` projections.privacy_policies2.tos_link,`+
` projections.privacy_policies2.help_link,`+
` projections.privacy_policies2.is_default,`+
` projections.privacy_policies2.state`+
` FROM projections.privacy_policies2`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
+17 -8
View File
@@ -68,6 +68,10 @@ var (
name: projection.ProjectColumnState,
table: projectsTable,
}
ProjectColumnOwnerRemoved = Column{
name: projection.ProjectColumnOwnerRemoved,
table: projectsTable,
}
)
type Projects struct {
@@ -95,16 +99,20 @@ type ProjectSearchQueries struct {
Queries []SearchQuery
}
func (q *Queries) ProjectByID(ctx context.Context, shouldTriggerBulk bool, id string) (*Project, error) {
func (q *Queries) ProjectByID(ctx context.Context, shouldTriggerBulk bool, id string, withOwnerRemoved bool) (*Project, error) {
if shouldTriggerBulk {
projection.ProjectProjection.Trigger(ctx)
}
stmt, scan := prepareProjectQuery()
query, args, err := stmt.Where(sq.Eq{
eq := sq.Eq{
ProjectColumnID.identifier(): id,
ProjectColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
}
if !withOwnerRemoved {
eq[ProjectColumnOwnerRemoved.identifier()] = false
}
query, args, err := stmt.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-2m00Q", "Errors.Query.SQLStatment")
}
@@ -113,12 +121,13 @@ func (q *Queries) ProjectByID(ctx context.Context, shouldTriggerBulk bool, id st
return scan(row)
}
func (q *Queries) SearchProjects(ctx context.Context, queries *ProjectSearchQueries) (projects *Projects, err error) {
func (q *Queries) SearchProjects(ctx context.Context, queries *ProjectSearchQueries, withOwnerRemoved bool) (projects *Projects, err error) {
query, scan := prepareProjectsQuery()
stmt, args, err := queries.toQuery(query).
Where(sq.Eq{
ProjectColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
eq := sq.Eq{ProjectColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
eq[ProjectColumnOwnerRemoved.identifier()] = false
}
stmt, args, err := queries.toQuery(query).Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-fn9ew", "Errors.Query.InvalidRequest")
}
+35 -13
View File
@@ -74,6 +74,14 @@ var (
name: projection.OrgColumnName,
table: orgsTable.setAlias(ProjectGrantResourceOwnerTableAlias),
}
ProjectGrantColumnOwnerRemoved = Column{
name: projection.ProjectGrantColumnOwnerRemoved,
table: projectGrantsTable,
}
ProjectGrantColumnGrantGrantedOrgRemoved = Column{
name: projection.ProjectGrantColumnGrantedOrgRemoved,
table: projectGrantsTable,
}
)
type ProjectGrants struct {
@@ -102,16 +110,21 @@ type ProjectGrantSearchQueries struct {
Queries []SearchQuery
}
func (q *Queries) ProjectGrantByID(ctx context.Context, shouldTriggerBulk bool, id string) (*ProjectGrant, error) {
func (q *Queries) ProjectGrantByID(ctx context.Context, shouldTriggerBulk bool, id string, withOwnerRemoved bool) (*ProjectGrant, error) {
if shouldTriggerBulk {
projection.ProjectGrantProjection.Trigger(ctx)
}
stmt, scan := prepareProjectGrantQuery()
query, args, err := stmt.Where(sq.Eq{
eq := sq.Eq{
ProjectGrantColumnGrantID.identifier(): id,
ProjectGrantColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
}
if !withOwnerRemoved {
eq[ProjectGrantColumnOwnerRemoved.identifier()] = false
eq[ProjectGrantColumnGrantGrantedOrgRemoved.identifier()] = false
}
query, args, err := stmt.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-Nf93d", "Errors.Query.SQLStatment")
}
@@ -120,13 +133,18 @@ func (q *Queries) ProjectGrantByID(ctx context.Context, shouldTriggerBulk bool,
return scan(row)
}
func (q *Queries) ProjectGrantByIDAndGrantedOrg(ctx context.Context, id, grantedOrg string) (*ProjectGrant, error) {
func (q *Queries) ProjectGrantByIDAndGrantedOrg(ctx context.Context, id, grantedOrg string, withOwnerRemoved bool) (*ProjectGrant, error) {
stmt, scan := prepareProjectGrantQuery()
query, args, err := stmt.Where(sq.Eq{
eq := sq.Eq{
ProjectGrantColumnGrantID.identifier(): id,
ProjectGrantColumnGrantedOrgID.identifier(): grantedOrg,
ProjectGrantColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
}
if !withOwnerRemoved {
eq[ProjectGrantColumnOwnerRemoved.identifier()] = false
eq[ProjectGrantColumnGrantGrantedOrgRemoved.identifier()] = false
}
query, args, err := stmt.Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInternal(err, "QUERY-MO9fs", "Errors.Query.SQLStatment")
}
@@ -135,12 +153,16 @@ func (q *Queries) ProjectGrantByIDAndGrantedOrg(ctx context.Context, id, granted
return scan(row)
}
func (q *Queries) SearchProjectGrants(ctx context.Context, queries *ProjectGrantSearchQueries) (projects *ProjectGrants, err error) {
func (q *Queries) SearchProjectGrants(ctx context.Context, queries *ProjectGrantSearchQueries, withOwnerRemoved bool) (projects *ProjectGrants, err error) {
query, scan := prepareProjectGrantsQuery()
stmt, args, err := queries.toQuery(query).
Where(sq.Eq{
ProjectGrantColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
eq := sq.Eq{
ProjectGrantColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}
if !withOwnerRemoved {
eq[ProjectGrantColumnOwnerRemoved.identifier()] = false
eq[ProjectGrantColumnGrantGrantedOrgRemoved.identifier()] = false
}
stmt, args, err := queries.toQuery(query).Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-N9fsg", "Errors.Query.InvalidRequest")
}
@@ -157,7 +179,7 @@ func (q *Queries) SearchProjectGrants(ctx context.Context, queries *ProjectGrant
return projects, err
}
func (q *Queries) SearchProjectGrantsByProjectIDAndRoleKey(ctx context.Context, projectID, roleKey string) (projects *ProjectGrants, err error) {
func (q *Queries) SearchProjectGrantsByProjectIDAndRoleKey(ctx context.Context, projectID, roleKey string, withOwnerRemoved bool) (projects *ProjectGrants, err error) {
searchQuery := &ProjectGrantSearchQueries{
SearchRequest: SearchRequest{},
Queries: make([]SearchQuery, 2),
@@ -170,7 +192,7 @@ func (q *Queries) SearchProjectGrantsByProjectIDAndRoleKey(ctx context.Context,
if err != nil {
return nil, err
}
return q.SearchProjectGrants(ctx, searchQuery)
return q.SearchProjectGrants(ctx, searchQuery, withOwnerRemoved)
}
func NewProjectGrantProjectIDSearchQuery(value string) (SearchQuery, error) {
+25 -5
View File
@@ -54,6 +54,18 @@ var (
name: projection.ProjectGrantMemberGrantIDCol,
table: projectGrantMemberTable,
}
ProjectGrantMemberOwnerRemoved = Column{
name: projection.MemberOwnerRemoved,
table: projectGrantMemberTable,
}
ProjectGrantMemberUserOwnerRemoved = Column{
name: projection.MemberUserOwnerRemoved,
table: projectGrantMemberTable,
}
ProjectGrantMemberGrantedOrgRemoved = Column{
name: projection.ProjectGrantMemberGrantedOrgRemoved,
table: projectGrantMemberTable,
}
)
type ProjectGrantMembersQuery struct {
@@ -76,12 +88,20 @@ func (q *ProjectGrantMembersQuery) toQuery(query sq.SelectBuilder) sq.SelectBuil
})
}
func (q *Queries) ProjectGrantMembers(ctx context.Context, queries *ProjectGrantMembersQuery) (*Members, error) {
func addProjectGrantMemberWithoutOwnerRemoved(eq map[string]interface{}) {
eq[ProjectGrantMemberOwnerRemoved.identifier()] = false
eq[ProjectGrantMemberUserOwnerRemoved.identifier()] = false
eq[ProjectGrantMemberGrantedOrgRemoved.identifier()] = false
}
func (q *Queries) ProjectGrantMembers(ctx context.Context, queries *ProjectGrantMembersQuery, withOwnerRemoved bool) (*Members, error) {
query, scan := prepareProjectGrantMembersQuery()
stmt, args, err := queries.toQuery(query).
Where(sq.Eq{
ProjectGrantMemberInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
eq := sq.Eq{ProjectGrantMemberInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
addProjectGrantMemberWithoutOwnerRemoved(eq)
addLoginNameWithoutOwnerRemoved(eq)
}
stmt, args, err := queries.toQuery(query).Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-USNwM", "Errors.Query.InvalidRequest")
}
+21 -21
View File
@@ -19,28 +19,28 @@ var (
", members.resource_owner" +
", members.user_id" +
", members.roles" +
", projections.login_names.login_name" +
", projections.users5_humans.email" +
", projections.users5_humans.first_name" +
", projections.users5_humans.last_name" +
", projections.users5_humans.display_name" +
", projections.users5_machines.name" +
", projections.users5_humans.avatar_key" +
", projections.login_names2.login_name" +
", projections.users6_humans.email" +
", projections.users6_humans.first_name" +
", projections.users6_humans.last_name" +
", projections.users6_humans.display_name" +
", projections.users6_machines.name" +
", projections.users6_humans.avatar_key" +
", COUNT(*) OVER () " +
"FROM projections.project_grant_members2 AS members " +
"LEFT JOIN projections.users5_humans " +
"ON members.user_id = projections.users5_humans.user_id " +
"AND members.instance_id = projections.users5_humans.instance_id " +
"LEFT JOIN projections.users5_machines " +
"ON members.user_id = projections.users5_machines.user_id " +
"AND members.instance_id = projections.users5_machines.instance_id " +
"LEFT JOIN projections.login_names " +
"ON members.user_id = projections.login_names.user_id " +
"AND members.instance_id = projections.login_names.instance_id " +
"LEFT JOIN projections.project_grants2 " +
"ON members.grant_id = projections.project_grants2.grant_id " +
"AND members.instance_id = projections.project_grants2.instance_id " +
"WHERE projections.login_names.is_primary = $1")
"FROM projections.project_grant_members3 AS members " +
"LEFT JOIN projections.users6_humans " +
"ON members.user_id = projections.users6_humans.user_id " +
"AND members.instance_id = projections.users6_humans.instance_id " +
"LEFT JOIN projections.users6_machines " +
"ON members.user_id = projections.users6_machines.user_id " +
"AND members.instance_id = projections.users6_machines.instance_id " +
"LEFT JOIN projections.login_names2 " +
"ON members.user_id = projections.login_names2.user_id " +
"AND members.instance_id = projections.login_names2.instance_id " +
"LEFT JOIN projections.project_grants3 " +
"ON members.grant_id = projections.project_grants3.grant_id " +
"AND members.instance_id = projections.project_grants3.instance_id " +
"WHERE projections.login_names2.is_primary = $1")
projectGrantMembersColumns = []string{
"creation_date",
"change_date",
+28 -28
View File
@@ -14,23 +14,23 @@ import (
)
var (
projectGrantsQuery = `SELECT projections.project_grants2.project_id,` +
` projections.project_grants2.grant_id,` +
` projections.project_grants2.creation_date,` +
` projections.project_grants2.change_date,` +
` projections.project_grants2.resource_owner,` +
` projections.project_grants2.state,` +
` projections.project_grants2.sequence,` +
` projections.projects2.name,` +
` projections.project_grants2.granted_org_id,` +
projectGrantsQuery = `SELECT projections.project_grants3.project_id,` +
` projections.project_grants3.grant_id,` +
` projections.project_grants3.creation_date,` +
` projections.project_grants3.change_date,` +
` projections.project_grants3.resource_owner,` +
` projections.project_grants3.state,` +
` projections.project_grants3.sequence,` +
` projections.projects3.name,` +
` projections.project_grants3.granted_org_id,` +
` o.name,` +
` projections.project_grants2.granted_role_keys,` +
` projections.project_grants3.granted_role_keys,` +
` r.name,` +
` COUNT(*) OVER () ` +
` FROM projections.project_grants2 ` +
` LEFT JOIN projections.projects2 ON projections.project_grants2.project_id = projections.projects2.id AND projections.project_grants2.instance_id = projections.projects2.instance_id ` +
` LEFT JOIN projections.orgs AS r ON projections.project_grants2.resource_owner = r.id AND projections.project_grants2.instance_id = r.instance_id` +
` LEFT JOIN projections.orgs AS o ON projections.project_grants2.granted_org_id = o.id AND projections.project_grants2.instance_id = o.instance_id`
` FROM projections.project_grants3 ` +
` LEFT JOIN projections.projects3 ON projections.project_grants3.project_id = projections.projects3.id AND projections.project_grants3.instance_id = projections.projects3.instance_id ` +
` LEFT JOIN projections.orgs AS r ON projections.project_grants3.resource_owner = r.id AND projections.project_grants3.instance_id = r.instance_id` +
` LEFT JOIN projections.orgs AS o ON projections.project_grants3.granted_org_id = o.id AND projections.project_grants3.instance_id = o.instance_id`
projectGrantsCols = []string{
"project_id",
"grant_id",
@@ -46,22 +46,22 @@ var (
"name",
"count",
}
projectGrantQuery = `SELECT projections.project_grants2.project_id,` +
` projections.project_grants2.grant_id,` +
` projections.project_grants2.creation_date,` +
` projections.project_grants2.change_date,` +
` projections.project_grants2.resource_owner,` +
` projections.project_grants2.state,` +
` projections.project_grants2.sequence,` +
` projections.projects2.name,` +
` projections.project_grants2.granted_org_id,` +
projectGrantQuery = `SELECT projections.project_grants3.project_id,` +
` projections.project_grants3.grant_id,` +
` projections.project_grants3.creation_date,` +
` projections.project_grants3.change_date,` +
` projections.project_grants3.resource_owner,` +
` projections.project_grants3.state,` +
` projections.project_grants3.sequence,` +
` projections.projects3.name,` +
` projections.project_grants3.granted_org_id,` +
` o.name,` +
` projections.project_grants2.granted_role_keys,` +
` projections.project_grants3.granted_role_keys,` +
` r.name` +
` FROM projections.project_grants2 ` +
` LEFT JOIN projections.projects2 ON projections.project_grants2.project_id = projections.projects2.id AND projections.project_grants2.instance_id = projections.projects2.instance_id ` +
` LEFT JOIN projections.orgs AS r ON projections.project_grants2.resource_owner = r.id AND projections.project_grants2.instance_id = r.instance_id` +
` LEFT JOIN projections.orgs AS o ON projections.project_grants2.granted_org_id = o.id AND projections.project_grants2.instance_id = o.instance_id`
` FROM projections.project_grants3 ` +
` LEFT JOIN projections.projects3 ON projections.project_grants3.project_id = projections.projects3.id AND projections.project_grants3.instance_id = projections.projects3.instance_id ` +
` LEFT JOIN projections.orgs AS r ON projections.project_grants3.resource_owner = r.id AND projections.project_grants3.instance_id = r.instance_id` +
` LEFT JOIN projections.orgs AS o ON projections.project_grants3.granted_org_id = o.id AND projections.project_grants3.instance_id = o.instance_id`
projectGrantCols = []string{
"project_id",
"grant_id",
+20 -5
View File
@@ -50,6 +50,14 @@ var (
name: projection.ProjectMemberProjectIDCol,
table: projectMemberTable,
}
ProjectMemberOwnerRemoved = Column{
name: projection.MemberOwnerRemoved,
table: orgMemberTable,
}
ProjectMemberOwnerRemovedUser = Column{
name: projection.MemberUserOwnerRemoved,
table: orgMemberTable,
}
)
type ProjectMembersQuery struct {
@@ -63,12 +71,19 @@ func (q *ProjectMembersQuery) toQuery(query sq.SelectBuilder) sq.SelectBuilder {
Where(sq.Eq{ProjectMemberProjectID.identifier(): q.ProjectID})
}
func (q *Queries) ProjectMembers(ctx context.Context, queries *ProjectMembersQuery) (*Members, error) {
func addProjectMemberWithoutOwnerRemoved(eq map[string]interface{}) {
eq[ProjectMemberOwnerRemoved.identifier()] = false
eq[ProjectMemberOwnerRemovedUser.identifier()] = false
}
func (q *Queries) ProjectMembers(ctx context.Context, queries *ProjectMembersQuery, withOwnerRemoved bool) (*Members, error) {
query, scan := prepareProjectMembersQuery()
stmt, args, err := queries.toQuery(query).
Where(sq.Eq{
ProjectMemberInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
eq := sq.Eq{ProjectMemberInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
addProjectMemberWithoutOwnerRemoved(eq)
addLoginNameWithoutOwnerRemoved(eq)
}
stmt, args, err := queries.toQuery(query).Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-T8CuT", "Errors.Query.InvalidRequest")
}
+18 -18
View File
@@ -19,25 +19,25 @@ var (
", members.resource_owner" +
", members.user_id" +
", members.roles" +
", projections.login_names.login_name" +
", projections.users5_humans.email" +
", projections.users5_humans.first_name" +
", projections.users5_humans.last_name" +
", projections.users5_humans.display_name" +
", projections.users5_machines.name" +
", projections.users5_humans.avatar_key" +
", projections.login_names2.login_name" +
", projections.users6_humans.email" +
", projections.users6_humans.first_name" +
", projections.users6_humans.last_name" +
", projections.users6_humans.display_name" +
", projections.users6_machines.name" +
", projections.users6_humans.avatar_key" +
", COUNT(*) OVER () " +
"FROM projections.project_members2 AS members " +
"LEFT JOIN projections.users5_humans " +
"ON members.user_id = projections.users5_humans.user_id " +
"AND members.instance_id = projections.users5_humans.instance_id " +
"LEFT JOIN projections.users5_machines " +
"ON members.user_id = projections.users5_machines.user_id " +
"AND members.instance_id = projections.users5_machines.instance_id " +
"LEFT JOIN projections.login_names " +
"ON members.user_id = projections.login_names.user_id " +
"AND members.instance_id = projections.login_names.instance_id " +
"WHERE projections.login_names.is_primary = $1")
"FROM projections.project_members3 AS members " +
"LEFT JOIN projections.users6_humans " +
"ON members.user_id = projections.users6_humans.user_id " +
"AND members.instance_id = projections.users6_humans.instance_id " +
"LEFT JOIN projections.users6_machines " +
"ON members.user_id = projections.users6_machines.user_id " +
"AND members.instance_id = projections.users6_machines.instance_id " +
"LEFT JOIN projections.login_names2 " +
"ON members.user_id = projections.login_names2.user_id " +
"AND members.instance_id = projections.login_names2.instance_id " +
"WHERE projections.login_names2.is_primary = $1")
projectMembersColumns = []string{
"creation_date",
"change_date",
+20 -11
View File
@@ -53,6 +53,10 @@ var (
name: projection.ProjectRoleColumnGroupName,
table: projectRolesTable,
}
ProjectRoleColumnOwnerRemoved = Column{
name: projection.ProjectRoleColumnOwnerRemoved,
table: projectRolesTable,
}
)
type ProjectRoles struct {
@@ -77,16 +81,18 @@ type ProjectRoleSearchQueries struct {
Queries []SearchQuery
}
func (q *Queries) SearchProjectRoles(ctx context.Context, shouldTriggerBulk bool, queries *ProjectRoleSearchQueries) (projects *ProjectRoles, err error) {
func (q *Queries) SearchProjectRoles(ctx context.Context, shouldTriggerBulk bool, queries *ProjectRoleSearchQueries, withOwnerRemoved bool) (projects *ProjectRoles, err error) {
if shouldTriggerBulk {
projection.ProjectRoleProjection.Trigger(ctx)
}
eq := sq.Eq{ProjectRoleColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
eq[ProjectRoleColumnOwnerRemoved.identifier()] = false
}
query, scan := prepareProjectRolesQuery()
stmt, args, err := queries.toQuery(query).
Where(sq.Eq{
ProjectRoleColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
stmt, args, err := queries.toQuery(query).Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-3N9ff", "Errors.Query.InvalidRequest")
}
@@ -103,8 +109,8 @@ func (q *Queries) SearchProjectRoles(ctx context.Context, shouldTriggerBulk bool
return projects, err
}
func (q *Queries) SearchGrantedProjectRoles(ctx context.Context, grantID, grantedOrg string, queries *ProjectRoleSearchQueries) (projects *ProjectRoles, err error) {
grant, err := q.ProjectGrantByIDAndGrantedOrg(ctx, grantID, grantedOrg)
func (q *Queries) SearchGrantedProjectRoles(ctx context.Context, grantID, grantedOrg string, queries *ProjectRoleSearchQueries, withOwnerRemoved bool) (projects *ProjectRoles, err error) {
grant, err := q.ProjectGrantByIDAndGrantedOrg(ctx, grantID, grantedOrg, withOwnerRemoved)
if err != nil {
return nil, err
}
@@ -112,11 +118,14 @@ func (q *Queries) SearchGrantedProjectRoles(ctx context.Context, grantID, grante
if err != nil {
return nil, err
}
eq := sq.Eq{ProjectRoleColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID()}
if !withOwnerRemoved {
eq[ProjectRoleColumnOwnerRemoved.identifier()] = false
}
query, scan := prepareProjectRolesQuery()
stmt, args, err := queries.toQuery(query).
Where(sq.Eq{
ProjectRoleColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
}).ToSql()
stmt, args, err := queries.toQuery(query).Where(eq).ToSql()
if err != nil {
return nil, errors.ThrowInvalidArgument(err, "QUERY-3N9ff", "Errors.Query.InvalidRequest")
}
+36 -36
View File
@@ -25,16 +25,16 @@ func Test_ProjectRolePrepares(t *testing.T) {
prepare: prepareProjectRolesQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.project_roles.project_id,`+
` projections.project_roles.creation_date,`+
` projections.project_roles.change_date,`+
` projections.project_roles.resource_owner,`+
` projections.project_roles.sequence,`+
` projections.project_roles.role_key,`+
` projections.project_roles.display_name,`+
` projections.project_roles.group_name,`+
regexp.QuoteMeta(`SELECT projections.project_roles3.project_id,`+
` projections.project_roles3.creation_date,`+
` projections.project_roles3.change_date,`+
` projections.project_roles3.resource_owner,`+
` projections.project_roles3.sequence,`+
` projections.project_roles3.role_key,`+
` projections.project_roles3.display_name,`+
` projections.project_roles3.group_name,`+
` COUNT(*) OVER ()`+
` FROM projections.project_roles`),
` FROM projections.project_roles3`),
nil,
nil,
),
@@ -46,16 +46,16 @@ func Test_ProjectRolePrepares(t *testing.T) {
prepare: prepareProjectRolesQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.project_roles.project_id,`+
` projections.project_roles.creation_date,`+
` projections.project_roles.change_date,`+
` projections.project_roles.resource_owner,`+
` projections.project_roles.sequence,`+
` projections.project_roles.role_key,`+
` projections.project_roles.display_name,`+
` projections.project_roles.group_name,`+
regexp.QuoteMeta(`SELECT projections.project_roles3.project_id,`+
` projections.project_roles3.creation_date,`+
` projections.project_roles3.change_date,`+
` projections.project_roles3.resource_owner,`+
` projections.project_roles3.sequence,`+
` projections.project_roles3.role_key,`+
` projections.project_roles3.display_name,`+
` projections.project_roles3.group_name,`+
` COUNT(*) OVER ()`+
` FROM projections.project_roles`),
` FROM projections.project_roles3`),
[]string{
"project_id",
"creation_date",
@@ -104,16 +104,16 @@ func Test_ProjectRolePrepares(t *testing.T) {
prepare: prepareProjectRolesQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.project_roles.project_id,`+
` projections.project_roles.creation_date,`+
` projections.project_roles.change_date,`+
` projections.project_roles.resource_owner,`+
` projections.project_roles.sequence,`+
` projections.project_roles.role_key,`+
` projections.project_roles.display_name,`+
` projections.project_roles.group_name,`+
regexp.QuoteMeta(`SELECT projections.project_roles3.project_id,`+
` projections.project_roles3.creation_date,`+
` projections.project_roles3.change_date,`+
` projections.project_roles3.resource_owner,`+
` projections.project_roles3.sequence,`+
` projections.project_roles3.role_key,`+
` projections.project_roles3.display_name,`+
` projections.project_roles3.group_name,`+
` COUNT(*) OVER ()`+
` FROM projections.project_roles`),
` FROM projections.project_roles3`),
[]string{
"project_id",
"creation_date",
@@ -182,16 +182,16 @@ func Test_ProjectRolePrepares(t *testing.T) {
prepare: prepareProjectRolesQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.project_roles.project_id,`+
` projections.project_roles.creation_date,`+
` projections.project_roles.change_date,`+
` projections.project_roles.resource_owner,`+
` projections.project_roles.sequence,`+
` projections.project_roles.role_key,`+
` projections.project_roles.display_name,`+
` projections.project_roles.group_name,`+
regexp.QuoteMeta(`SELECT projections.project_roles3.project_id,`+
` projections.project_roles3.creation_date,`+
` projections.project_roles3.change_date,`+
` projections.project_roles3.resource_owner,`+
` projections.project_roles3.sequence,`+
` projections.project_roles3.role_key,`+
` projections.project_roles3.display_name,`+
` projections.project_roles3.group_name,`+
` COUNT(*) OVER ()`+
` FROM projections.project_roles`),
` FROM projections.project_roles3`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
+84 -84
View File
@@ -44,19 +44,19 @@ func Test_ProjectPrepares(t *testing.T) {
prepare: prepareProjectsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.projects2.id,`+
` projections.projects2.creation_date,`+
` projections.projects2.change_date,`+
` projections.projects2.resource_owner,`+
` projections.projects2.state,`+
` projections.projects2.sequence,`+
` projections.projects2.name,`+
` projections.projects2.project_role_assertion,`+
` projections.projects2.project_role_check,`+
` projections.projects2.has_project_check,`+
` projections.projects2.private_labeling_setting,`+
regexp.QuoteMeta(`SELECT projections.projects3.id,`+
` projections.projects3.creation_date,`+
` projections.projects3.change_date,`+
` projections.projects3.resource_owner,`+
` projections.projects3.state,`+
` projections.projects3.sequence,`+
` projections.projects3.name,`+
` projections.projects3.project_role_assertion,`+
` projections.projects3.project_role_check,`+
` projections.projects3.has_project_check,`+
` projections.projects3.private_labeling_setting,`+
` COUNT(*) OVER ()`+
` FROM projections.projects2`),
` FROM projections.projects3`),
nil,
nil,
),
@@ -68,19 +68,19 @@ func Test_ProjectPrepares(t *testing.T) {
prepare: prepareProjectsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.projects2.id,`+
` projections.projects2.creation_date,`+
` projections.projects2.change_date,`+
` projections.projects2.resource_owner,`+
` projections.projects2.state,`+
` projections.projects2.sequence,`+
` projections.projects2.name,`+
` projections.projects2.project_role_assertion,`+
` projections.projects2.project_role_check,`+
` projections.projects2.has_project_check,`+
` projections.projects2.private_labeling_setting,`+
regexp.QuoteMeta(`SELECT projections.projects3.id,`+
` projections.projects3.creation_date,`+
` projections.projects3.change_date,`+
` projections.projects3.resource_owner,`+
` projections.projects3.state,`+
` projections.projects3.sequence,`+
` projections.projects3.name,`+
` projections.projects3.project_role_assertion,`+
` projections.projects3.project_role_check,`+
` projections.projects3.has_project_check,`+
` projections.projects3.private_labeling_setting,`+
` COUNT(*) OVER ()`+
` FROM projections.projects2`),
` FROM projections.projects3`),
[]string{
"id",
"creation_date",
@@ -138,19 +138,19 @@ func Test_ProjectPrepares(t *testing.T) {
prepare: prepareProjectsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.projects2.id,`+
` projections.projects2.creation_date,`+
` projections.projects2.change_date,`+
` projections.projects2.resource_owner,`+
` projections.projects2.state,`+
` projections.projects2.sequence,`+
` projections.projects2.name,`+
` projections.projects2.project_role_assertion,`+
` projections.projects2.project_role_check,`+
` projections.projects2.has_project_check,`+
` projections.projects2.private_labeling_setting,`+
regexp.QuoteMeta(`SELECT projections.projects3.id,`+
` projections.projects3.creation_date,`+
` projections.projects3.change_date,`+
` projections.projects3.resource_owner,`+
` projections.projects3.state,`+
` projections.projects3.sequence,`+
` projections.projects3.name,`+
` projections.projects3.project_role_assertion,`+
` projections.projects3.project_role_check,`+
` projections.projects3.has_project_check,`+
` projections.projects3.private_labeling_setting,`+
` COUNT(*) OVER ()`+
` FROM projections.projects2`),
` FROM projections.projects3`),
[]string{
"id",
"creation_date",
@@ -234,19 +234,19 @@ func Test_ProjectPrepares(t *testing.T) {
prepare: prepareProjectsQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.projects2.id,`+
` projections.projects2.creation_date,`+
` projections.projects2.change_date,`+
` projections.projects2.resource_owner,`+
` projections.projects2.state,`+
` projections.projects2.sequence,`+
` projections.projects2.name,`+
` projections.projects2.project_role_assertion,`+
` projections.projects2.project_role_check,`+
` projections.projects2.has_project_check,`+
` projections.projects2.private_labeling_setting,`+
regexp.QuoteMeta(`SELECT projections.projects3.id,`+
` projections.projects3.creation_date,`+
` projections.projects3.change_date,`+
` projections.projects3.resource_owner,`+
` projections.projects3.state,`+
` projections.projects3.sequence,`+
` projections.projects3.name,`+
` projections.projects3.project_role_assertion,`+
` projections.projects3.project_role_check,`+
` projections.projects3.has_project_check,`+
` projections.projects3.private_labeling_setting,`+
` COUNT(*) OVER ()`+
` FROM projections.projects2`),
` FROM projections.projects3`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
@@ -263,18 +263,18 @@ func Test_ProjectPrepares(t *testing.T) {
prepare: prepareProjectQuery,
want: want{
sqlExpectations: mockQueries(
`SELECT projections.projects2.id,`+
` projections.projects2.creation_date,`+
` projections.projects2.change_date,`+
` projections.projects2.resource_owner,`+
` projections.projects2.state,`+
` projections.projects2.sequence,`+
` projections.projects2.name,`+
` projections.projects2.project_role_assertion,`+
` projections.projects2.project_role_check,`+
` projections.projects2.has_project_check,`+
` projections.projects2.private_labeling_setting`+
` FROM projections.projects2`,
`SELECT projections.projects3.id,`+
` projections.projects3.creation_date,`+
` projections.projects3.change_date,`+
` projections.projects3.resource_owner,`+
` projections.projects3.state,`+
` projections.projects3.sequence,`+
` projections.projects3.name,`+
` projections.projects3.project_role_assertion,`+
` projections.projects3.project_role_check,`+
` projections.projects3.has_project_check,`+
` projections.projects3.private_labeling_setting`+
` FROM projections.projects3`,
nil,
nil,
),
@@ -292,18 +292,18 @@ func Test_ProjectPrepares(t *testing.T) {
prepare: prepareProjectQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.projects2.id,`+
` projections.projects2.creation_date,`+
` projections.projects2.change_date,`+
` projections.projects2.resource_owner,`+
` projections.projects2.state,`+
` projections.projects2.sequence,`+
` projections.projects2.name,`+
` projections.projects2.project_role_assertion,`+
` projections.projects2.project_role_check,`+
` projections.projects2.has_project_check,`+
` projections.projects2.private_labeling_setting`+
` FROM projections.projects2`),
regexp.QuoteMeta(`SELECT projections.projects3.id,`+
` projections.projects3.creation_date,`+
` projections.projects3.change_date,`+
` projections.projects3.resource_owner,`+
` projections.projects3.state,`+
` projections.projects3.sequence,`+
` projections.projects3.name,`+
` projections.projects3.project_role_assertion,`+
` projections.projects3.project_role_check,`+
` projections.projects3.has_project_check,`+
` projections.projects3.private_labeling_setting`+
` FROM projections.projects3`),
[]string{
"id",
"creation_date",
@@ -351,18 +351,18 @@ func Test_ProjectPrepares(t *testing.T) {
prepare: prepareProjectQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.projects2.id,`+
` projections.projects2.creation_date,`+
` projections.projects2.change_date,`+
` projections.projects2.resource_owner,`+
` projections.projects2.state,`+
` projections.projects2.sequence,`+
` projections.projects2.name,`+
` projections.projects2.project_role_assertion,`+
` projections.projects2.project_role_check,`+
` projections.projects2.has_project_check,`+
` projections.projects2.private_labeling_setting`+
` FROM projections.projects2`),
regexp.QuoteMeta(`SELECT projections.projects3.id,`+
` projections.projects3.creation_date,`+
` projections.projects3.change_date,`+
` projections.projects3.resource_owner,`+
` projections.projects3.state,`+
` projections.projects3.sequence,`+
` projections.projects3.name,`+
` projections.projects3.project_role_assertion,`+
` projections.projects3.project_role_check,`+
` projections.projects3.has_project_check,`+
` projections.projects3.private_labeling_setting`+
` FROM projections.projects3`),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
+35 -3
View File
@@ -10,10 +10,11 @@ import (
"github.com/zitadel/zitadel/internal/eventstore/handler/crdb"
"github.com/zitadel/zitadel/internal/repository/action"
"github.com/zitadel/zitadel/internal/repository/instance"
"github.com/zitadel/zitadel/internal/repository/org"
)
const (
ActionTable = "projections.actions2"
ActionTable = "projections.actions3"
ActionIDCol = "id"
ActionCreationDateCol = "creation_date"
ActionChangeDateCol = "change_date"
@@ -25,6 +26,7 @@ const (
ActionScriptCol = "script"
ActionTimeoutCol = "timeout"
ActionAllowedToFailCol = "allowed_to_fail"
ActionOwnerRemovedCol = "owner_removed"
)
type actionProjection struct {
@@ -48,9 +50,11 @@ func newActionProjection(ctx context.Context, config crdb.StatementHandlerConfig
crdb.NewColumn(ActionScriptCol, crdb.ColumnTypeText, crdb.Default("")),
crdb.NewColumn(ActionTimeoutCol, crdb.ColumnTypeInt64, crdb.Default(0)),
crdb.NewColumn(ActionAllowedToFailCol, crdb.ColumnTypeBool, crdb.Default(false)),
crdb.NewColumn(ActionOwnerRemovedCol, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(ActionInstanceIDCol, ActionIDCol),
crdb.WithIndex(crdb.NewIndex("actions_ro_idx", []string{ActionResourceOwnerCol})),
crdb.WithIndex(crdb.NewIndex("resource_owner", []string{ActionResourceOwnerCol})),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{ActionOwnerRemovedCol})),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -84,6 +88,15 @@ func (p *actionProjection) reducers() []handler.AggregateReducer {
},
},
},
{
Aggregate: org.AggregateType,
EventRedusers: []handler.EventReducer{
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOwnerRemoved,
},
},
},
{
Aggregate: instance.AggregateType,
EventRedusers: []handler.EventReducer{
@@ -172,7 +185,7 @@ func (p *actionProjection) reduceActionDeactivated(event eventstore.Event) (*han
func (p *actionProjection) reduceActionReactivated(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*action.ReactivatedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "HANDL-hwdqa", "reduce.wrong.event.type% s", action.ReactivatedEventType)
return nil, errors.ThrowInvalidArgumentf(nil, "HANDL-hwdqa", "reduce.wrong.event.type %s", action.ReactivatedEventType)
}
return crdb.NewUpdateStatement(
e,
@@ -201,3 +214,22 @@ func (p *actionProjection) reduceActionRemoved(event eventstore.Event) (*handler
},
), nil
}
func (p *actionProjection) reduceOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-mSmWM", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(ActionChangeDateCol, e.CreationDate()),
handler.NewCol(ActionSequenceCol, e.Sequence()),
handler.NewCol(ActionOwnerRemovedCol, true),
},
[]handler.Condition{
handler.NewCond(ActionInstanceIDCol, e.Aggregate().InstanceID),
handler.NewCond(ActionResourceOwnerCol, e.Aggregate().ID),
},
), nil
}
+37 -6
View File
@@ -11,6 +11,7 @@ import (
"github.com/zitadel/zitadel/internal/eventstore/repository"
"github.com/zitadel/zitadel/internal/repository/action"
"github.com/zitadel/zitadel/internal/repository/instance"
"github.com/zitadel/zitadel/internal/repository/org"
)
func TestActionProjection_reduces(t *testing.T) {
@@ -40,7 +41,7 @@ func TestActionProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.actions2 (id, creation_date, change_date, resource_owner, instance_id, sequence, name, script, timeout, allowed_to_fail, action_state) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)",
expectedStmt: "INSERT INTO projections.actions3 (id, creation_date, change_date, resource_owner, instance_id, sequence, name, script, timeout, allowed_to_fail, action_state) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)",
expectedArgs: []interface{}{
"agg-id",
anyArg{},
@@ -76,7 +77,7 @@ func TestActionProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.actions2 SET (change_date, sequence, name, script) = ($1, $2, $3, $4) WHERE (id = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.actions3 SET (change_date, sequence, name, script) = ($1, $2, $3, $4) WHERE (id = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -107,7 +108,7 @@ func TestActionProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.actions2 SET (change_date, sequence, action_state) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.actions3 SET (change_date, sequence, action_state) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -137,7 +138,7 @@ func TestActionProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.actions2 SET (change_date, sequence, action_state) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.actions3 SET (change_date, sequence, action_state) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -167,7 +168,7 @@ func TestActionProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.actions2 WHERE (id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.actions3 WHERE (id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -177,6 +178,36 @@ func TestActionProjection_reduces(t *testing.T) {
},
},
},
{
name: "reduceOwnerRemoved",
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
org.AggregateType,
nil,
), org.OrgRemovedEventMapper),
},
reduce: (&actionProjection{}).reduceOwnerRemoved,
want: wantReduce{
aggregateType: eventstore.AggregateType("org"),
sequence: 15,
previousSequence: 10,
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.actions3 SET (change_date, sequence, owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (resource_owner = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
},
},
},
},
},
{
name: "reduceInstanceRemoved",
args: args{
@@ -194,7 +225,7 @@ func TestActionProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.actions2 WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.actions3 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
+41 -9
View File
@@ -10,11 +10,12 @@ import (
"github.com/zitadel/zitadel/internal/eventstore/handler"
"github.com/zitadel/zitadel/internal/eventstore/handler/crdb"
"github.com/zitadel/zitadel/internal/repository/instance"
"github.com/zitadel/zitadel/internal/repository/org"
"github.com/zitadel/zitadel/internal/repository/project"
)
const (
AppProjectionTable = "projections.apps3"
AppProjectionTable = "projections.apps4"
AppAPITable = AppProjectionTable + "_" + appAPITableSuffix
AppOIDCTable = AppProjectionTable + "_" + appOIDCTableSuffix
AppSAMLTable = AppProjectionTable + "_" + appSAMLTableSuffix
@@ -28,6 +29,7 @@ const (
AppColumnInstanceID = "instance_id"
AppColumnState = "state"
AppColumnSequence = "sequence"
AppColumnOwnerRemoved = "owner_removed"
appAPITableSuffix = "api_configs"
AppAPIConfigColumnAppID = "app_id"
@@ -83,10 +85,11 @@ func newAppProjection(ctx context.Context, config crdb.StatementHandlerConfig) *
crdb.NewColumn(AppColumnInstanceID, crdb.ColumnTypeText),
crdb.NewColumn(AppColumnState, crdb.ColumnTypeEnum),
crdb.NewColumn(AppColumnSequence, crdb.ColumnTypeInt64),
crdb.NewColumn(AppColumnOwnerRemoved, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(AppColumnInstanceID, AppColumnID),
crdb.WithIndex(crdb.NewIndex("app3_project_id_idx", []string{AppColumnProjectID})),
crdb.WithConstraint(crdb.NewConstraint("app3_id_unique", []string{AppColumnID})),
crdb.WithIndex(crdb.NewIndex("project_id", []string{AppColumnProjectID})),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{AppColumnOwnerRemoved})),
),
crdb.NewSuffixedTable([]*crdb.Column{
crdb.NewColumn(AppAPIConfigColumnAppID, crdb.ColumnTypeText),
@@ -97,8 +100,8 @@ func newAppProjection(ctx context.Context, config crdb.StatementHandlerConfig) *
},
crdb.NewPrimaryKey(AppAPIConfigColumnInstanceID, AppAPIConfigColumnAppID),
appAPITableSuffix,
crdb.WithForeignKey(crdb.NewForeignKeyOfPublicKeys("fk_api_ref_apps3")),
crdb.WithIndex(crdb.NewIndex("api_client_id3_idx", []string{AppAPIConfigColumnClientID})),
crdb.WithForeignKey(crdb.NewForeignKeyOfPublicKeys()),
crdb.WithIndex(crdb.NewIndex("client_id", []string{AppAPIConfigColumnClientID})),
),
crdb.NewSuffixedTable([]*crdb.Column{
crdb.NewColumn(AppOIDCConfigColumnAppID, crdb.ColumnTypeText),
@@ -122,8 +125,8 @@ func newAppProjection(ctx context.Context, config crdb.StatementHandlerConfig) *
},
crdb.NewPrimaryKey(AppOIDCConfigColumnInstanceID, AppOIDCConfigColumnAppID),
appOIDCTableSuffix,
crdb.WithForeignKey(crdb.NewForeignKeyOfPublicKeys("fk_oidc_ref_apps3")),
crdb.WithIndex(crdb.NewIndex("oidc_client_id_idx3", []string{AppOIDCConfigColumnClientID})),
crdb.WithForeignKey(crdb.NewForeignKeyOfPublicKeys()),
crdb.WithIndex(crdb.NewIndex("client_id", []string{AppOIDCConfigColumnClientID})),
),
crdb.NewSuffixedTable([]*crdb.Column{
crdb.NewColumn(AppSAMLConfigColumnAppID, crdb.ColumnTypeText),
@@ -134,8 +137,8 @@ func newAppProjection(ctx context.Context, config crdb.StatementHandlerConfig) *
},
crdb.NewPrimaryKey(AppSAMLConfigColumnInstanceID, AppSAMLConfigColumnAppID),
appSAMLTableSuffix,
crdb.WithForeignKey(crdb.NewForeignKeyOfPublicKeys("fk_saml_ref_apps3")),
crdb.WithIndex(crdb.NewIndex("saml_entity_id_idx3", []string{AppSAMLConfigColumnEntityID})),
crdb.WithForeignKey(crdb.NewForeignKeyOfPublicKeys()),
crdb.WithIndex(crdb.NewIndex("entity_id", []string{AppSAMLConfigColumnEntityID})),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -205,6 +208,15 @@ func (p *appProjection) reducers() []handler.AggregateReducer {
},
},
},
{
Aggregate: org.AggregateType,
EventRedusers: []handler.EventReducer{
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOwnerRemoved,
},
},
},
{
Aggregate: instance.AggregateType,
EventRedusers: []handler.EventReducer{
@@ -574,6 +586,26 @@ func (p *appProjection) reduceOIDCConfigSecretChanged(event eventstore.Event) (*
), nil
}
func (p *appProjection) reduceOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-Hyd1f", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(AppColumnChangeDate, e.CreationDate()),
handler.NewCol(AppColumnSequence, e.Sequence()),
handler.NewCol(AppColumnOwnerRemoved, true),
},
[]handler.Condition{
handler.NewCond(AppColumnInstanceID, e.Aggregate().InstanceID),
handler.NewCond(AppColumnResourceOwner, e.Aggregate().ID),
},
), nil
}
func (p *appProjection) reduceSAMLConfigAdded(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*project.SAMLConfigAddedEvent)
if !ok {
+50 -19
View File
@@ -11,6 +11,7 @@ import (
"github.com/zitadel/zitadel/internal/eventstore/handler"
"github.com/zitadel/zitadel/internal/eventstore/repository"
"github.com/zitadel/zitadel/internal/repository/instance"
"github.com/zitadel/zitadel/internal/repository/org"
"github.com/zitadel/zitadel/internal/repository/project"
)
@@ -44,7 +45,7 @@ func TestAppProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.apps3 (id, name, project_id, creation_date, change_date, resource_owner, instance_id, state, sequence) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)",
expectedStmt: "INSERT INTO projections.apps4 (id, name, project_id, creation_date, change_date, resource_owner, instance_id, state, sequence) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)",
expectedArgs: []interface{}{
"app-id",
"my-app",
@@ -81,7 +82,7 @@ func TestAppProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.apps3 SET (name, change_date, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.apps4 SET (name, change_date, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
"my-app",
anyArg{},
@@ -113,7 +114,7 @@ func TestAppProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.apps3 SET (state, change_date, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.apps4 SET (state, change_date, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
domain.AppStateInactive,
anyArg{},
@@ -145,7 +146,7 @@ func TestAppProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.apps3 SET (state, change_date, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.apps4 SET (state, change_date, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
domain.AppStateActive,
anyArg{},
@@ -177,7 +178,7 @@ func TestAppProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.apps3 WHERE (id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.apps4 WHERE (id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"app-id",
"instance-id",
@@ -204,7 +205,7 @@ func TestAppProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.apps3 WHERE (project_id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.apps4 WHERE (project_id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -231,7 +232,7 @@ func TestAppProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.apps3 WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.apps4 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
@@ -262,7 +263,7 @@ func TestAppProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.apps3_api_configs (app_id, instance_id, client_id, client_secret, auth_method) VALUES ($1, $2, $3, $4, $5)",
expectedStmt: "INSERT INTO projections.apps4_api_configs (app_id, instance_id, client_id, client_secret, auth_method) VALUES ($1, $2, $3, $4, $5)",
expectedArgs: []interface{}{
"app-id",
"instance-id",
@@ -272,7 +273,7 @@ func TestAppProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "UPDATE projections.apps3 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedStmt: "UPDATE projections.apps4 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -306,7 +307,7 @@ func TestAppProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.apps3_api_configs SET (client_secret, auth_method) = ($1, $2) WHERE (app_id = $3) AND (instance_id = $4)",
expectedStmt: "UPDATE projections.apps4_api_configs SET (client_secret, auth_method) = ($1, $2) WHERE (app_id = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
anyArg{},
domain.APIAuthMethodTypePrivateKeyJWT,
@@ -315,7 +316,7 @@ func TestAppProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "UPDATE projections.apps3 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedStmt: "UPDATE projections.apps4 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -368,7 +369,7 @@ func TestAppProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.apps3_api_configs SET client_secret = $1 WHERE (app_id = $2) AND (instance_id = $3)",
expectedStmt: "UPDATE projections.apps4_api_configs SET client_secret = $1 WHERE (app_id = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
anyArg{},
"app-id",
@@ -376,7 +377,7 @@ func TestAppProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "UPDATE projections.apps3 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedStmt: "UPDATE projections.apps4 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -423,7 +424,7 @@ func TestAppProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.apps3_oidc_configs (app_id, instance_id, version, client_id, client_secret, redirect_uris, response_types, grant_types, application_type, auth_method_type, post_logout_redirect_uris, is_dev_mode, access_token_type, access_token_role_assertion, id_token_role_assertion, id_token_userinfo_assertion, clock_skew, additional_origins) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18)",
expectedStmt: "INSERT INTO projections.apps4_oidc_configs (app_id, instance_id, version, client_id, client_secret, redirect_uris, response_types, grant_types, application_type, auth_method_type, post_logout_redirect_uris, is_dev_mode, access_token_type, access_token_role_assertion, id_token_role_assertion, id_token_userinfo_assertion, clock_skew, additional_origins) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18)",
expectedArgs: []interface{}{
"app-id",
"instance-id",
@@ -446,7 +447,7 @@ func TestAppProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "UPDATE projections.apps3 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedStmt: "UPDATE projections.apps4 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -491,7 +492,7 @@ func TestAppProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.apps3_oidc_configs SET (version, redirect_uris, response_types, grant_types, application_type, auth_method_type, post_logout_redirect_uris, is_dev_mode, access_token_type, access_token_role_assertion, id_token_role_assertion, id_token_userinfo_assertion, clock_skew, additional_origins) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14) WHERE (app_id = $15) AND (instance_id = $16)",
expectedStmt: "UPDATE projections.apps4_oidc_configs SET (version, redirect_uris, response_types, grant_types, application_type, auth_method_type, post_logout_redirect_uris, is_dev_mode, access_token_type, access_token_role_assertion, id_token_role_assertion, id_token_userinfo_assertion, clock_skew, additional_origins) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14) WHERE (app_id = $15) AND (instance_id = $16)",
expectedArgs: []interface{}{
domain.OIDCVersionV1,
database.StringArray{"redirect.one.ch", "redirect.two.ch"},
@@ -512,7 +513,7 @@ func TestAppProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "UPDATE projections.apps3 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedStmt: "UPDATE projections.apps4 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -565,7 +566,7 @@ func TestAppProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.apps3_oidc_configs SET client_secret = $1 WHERE (app_id = $2) AND (instance_id = $3)",
expectedStmt: "UPDATE projections.apps4_oidc_configs SET client_secret = $1 WHERE (app_id = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
anyArg{},
"app-id",
@@ -573,7 +574,7 @@ func TestAppProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "UPDATE projections.apps3 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedStmt: "UPDATE projections.apps4 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -585,6 +586,36 @@ func TestAppProjection_reduces(t *testing.T) {
},
},
},
{
name: "project.reduceOwnerRemoved",
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
org.AggregateType,
nil,
), org.OrgRemovedEventMapper),
},
reduce: (&appProjection{}).reduceOwnerRemoved,
want: wantReduce{
aggregateType: eventstore.AggregateType("org"),
sequence: 15,
previousSequence: 10,
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.apps4 SET (change_date, sequence, owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (resource_owner = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
},
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
+64 -20
View File
@@ -10,14 +10,16 @@ import (
"github.com/zitadel/zitadel/internal/eventstore/handler"
"github.com/zitadel/zitadel/internal/eventstore/handler/crdb"
"github.com/zitadel/zitadel/internal/repository/instance"
"github.com/zitadel/zitadel/internal/repository/org"
"github.com/zitadel/zitadel/internal/repository/project"
"github.com/zitadel/zitadel/internal/repository/user"
)
const (
AuthNKeyTable = "projections.authn_keys"
AuthNKeyTable = "projections.authn_keys2"
AuthNKeyIDCol = "id"
AuthNKeyCreationDateCol = "creation_date"
AuthNKeyChangeDateCol = "change_date"
AuthNKeyResourceOwnerCol = "resource_owner"
AuthNKeyInstanceIDCol = "instance_id"
AuthNKeyAggregateIDCol = "aggregate_id"
@@ -28,6 +30,7 @@ const (
AuthNKeyPublicKeyCol = "public_key"
AuthNKeyTypeCol = "type"
AuthNKeyEnabledCol = "enabled"
AuthNKeyOwnerRemovedCol = "owner_removed"
)
type authNKeyProjection struct {
@@ -42,6 +45,7 @@ func newAuthNKeyProjection(ctx context.Context, config crdb.StatementHandlerConf
crdb.NewTable([]*crdb.Column{
crdb.NewColumn(AuthNKeyIDCol, crdb.ColumnTypeText),
crdb.NewColumn(AuthNKeyCreationDateCol, crdb.ColumnTypeTimestamp),
crdb.NewColumn(AuthNKeyChangeDateCol, crdb.ColumnTypeTimestamp),
crdb.NewColumn(AuthNKeyResourceOwnerCol, crdb.ColumnTypeText),
crdb.NewColumn(AuthNKeyInstanceIDCol, crdb.ColumnTypeText),
crdb.NewColumn(AuthNKeyAggregateIDCol, crdb.ColumnTypeText),
@@ -52,10 +56,12 @@ func newAuthNKeyProjection(ctx context.Context, config crdb.StatementHandlerConf
crdb.NewColumn(AuthNKeyPublicKeyCol, crdb.ColumnTypeBytes),
crdb.NewColumn(AuthNKeyEnabledCol, crdb.ColumnTypeBool, crdb.Default(true)),
crdb.NewColumn(AuthNKeyTypeCol, crdb.ColumnTypeEnum, crdb.Default(0)),
crdb.NewColumn(AuthNKeyOwnerRemovedCol, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(AuthNKeyInstanceIDCol, AuthNKeyIDCol),
crdb.WithIndex(crdb.NewIndex("enabled_idx", []string{AuthNKeyEnabledCol})),
crdb.WithIndex(crdb.NewIndex("identifier_idx", []string{AuthNKeyIdentifierCol})),
crdb.WithIndex(crdb.NewIndex("enabled", []string{AuthNKeyEnabledCol})),
crdb.WithIndex(crdb.NewIndex("identifier", []string{AuthNKeyIdentifierCol})),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{AuthNKeyOwnerRemovedCol})),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -110,6 +116,15 @@ func (p *authNKeyProjection) reducers() []handler.AggregateReducer {
},
},
},
{
Aggregate: org.AggregateType,
EventRedusers: []handler.EventReducer{
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOwnerRemoved,
},
},
},
{
Aggregate: instance.AggregateType,
EventRedusers: []handler.EventReducer{
@@ -152,29 +167,30 @@ func (p *authNKeyProjection) reduceAuthNKeyAdded(event eventstore.Event) (*handl
default:
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-Dgb32", "reduce.wrong.event.type %v", []eventstore.EventType{project.ApplicationKeyAddedEventType, user.MachineKeyAddedEventType})
}
return crdb.NewMultiStatement(
return crdb.NewCreateStatement(
&authNKeyEvent,
crdb.AddCreateStatement(
[]handler.Column{
handler.NewCol(AuthNKeyIDCol, authNKeyEvent.keyID),
handler.NewCol(AuthNKeyCreationDateCol, authNKeyEvent.CreationDate()),
handler.NewCol(AuthNKeyResourceOwnerCol, authNKeyEvent.Aggregate().ResourceOwner),
handler.NewCol(AuthNKeyInstanceIDCol, authNKeyEvent.Aggregate().InstanceID),
handler.NewCol(AuthNKeyAggregateIDCol, authNKeyEvent.Aggregate().ID),
handler.NewCol(AuthNKeySequenceCol, authNKeyEvent.Sequence()),
handler.NewCol(AuthNKeyObjectIDCol, authNKeyEvent.objectID),
handler.NewCol(AuthNKeyExpirationCol, authNKeyEvent.expiration),
handler.NewCol(AuthNKeyIdentifierCol, authNKeyEvent.identifier),
handler.NewCol(AuthNKeyPublicKeyCol, authNKeyEvent.publicKey),
handler.NewCol(AuthNKeyTypeCol, authNKeyEvent.keyType),
},
),
[]handler.Column{
handler.NewCol(AuthNKeyIDCol, authNKeyEvent.keyID),
handler.NewCol(AuthNKeyCreationDateCol, authNKeyEvent.CreationDate()),
handler.NewCol(AuthNKeyChangeDateCol, authNKeyEvent.CreationDate()),
handler.NewCol(AuthNKeyResourceOwnerCol, authNKeyEvent.Aggregate().ResourceOwner),
handler.NewCol(AuthNKeyInstanceIDCol, authNKeyEvent.Aggregate().InstanceID),
handler.NewCol(AuthNKeyAggregateIDCol, authNKeyEvent.Aggregate().ID),
handler.NewCol(AuthNKeySequenceCol, authNKeyEvent.Sequence()),
handler.NewCol(AuthNKeyObjectIDCol, authNKeyEvent.objectID),
handler.NewCol(AuthNKeyExpirationCol, authNKeyEvent.expiration),
handler.NewCol(AuthNKeyIdentifierCol, authNKeyEvent.identifier),
handler.NewCol(AuthNKeyPublicKeyCol, authNKeyEvent.publicKey),
handler.NewCol(AuthNKeyTypeCol, authNKeyEvent.keyType),
},
), nil
}
func (p *authNKeyProjection) reduceAuthNKeyEnabledChanged(event eventstore.Event) (*handler.Statement, error) {
var appID string
var enabled bool
var changeDate time.Time
var sequence uint64
switch e := event.(type) {
case *project.APIConfigChangedEvent:
if e.AuthMethodType == nil {
@@ -182,18 +198,26 @@ func (p *authNKeyProjection) reduceAuthNKeyEnabledChanged(event eventstore.Event
}
appID = e.AppID
enabled = *e.AuthMethodType == domain.APIAuthMethodTypePrivateKeyJWT
changeDate = e.CreationDate()
sequence = e.Sequence()
case *project.OIDCConfigChangedEvent:
if e.AuthMethodType == nil {
return crdb.NewNoOpStatement(event), nil
}
appID = e.AppID
enabled = *e.AuthMethodType == domain.OIDCAuthMethodTypePrivateKeyJWT
changeDate = e.CreationDate()
sequence = e.Sequence()
default:
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-Dbrt1", "reduce.wrong.event.type %v", []eventstore.EventType{project.APIConfigChangedType, project.OIDCConfigChangedType})
}
return crdb.NewUpdateStatement(
event,
[]handler.Column{handler.NewCol(AuthNKeyEnabledCol, enabled)},
[]handler.Column{
handler.NewCol(AuthNKeyChangeDateCol, changeDate),
handler.NewCol(AuthNKeySequenceCol, sequence),
handler.NewCol(AuthNKeyEnabledCol, enabled),
},
[]handler.Condition{
handler.NewCond(AuthNKeyObjectIDCol, appID),
handler.NewCond(AuthNKeyInstanceIDCol, event.Aggregate().InstanceID),
@@ -225,3 +249,23 @@ func (p *authNKeyProjection) reduceAuthNKeyRemoved(event eventstore.Event) (*han
},
), nil
}
func (p *authNKeyProjection) reduceOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-Hyd1f", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(AuthNKeyChangeDateCol, e.CreationDate()),
handler.NewCol(AuthNKeySequenceCol, e.Sequence()),
handler.NewCol(AuthNKeyOwnerRemovedCol, true),
},
[]handler.Condition{
handler.NewCond(AuthNKeyInstanceIDCol, e.Aggregate().InstanceID),
handler.NewCond(AuthNKeyResourceOwnerCol, e.Aggregate().ID),
},
), nil
}
+55 -14
View File
@@ -9,6 +9,7 @@ import (
"github.com/zitadel/zitadel/internal/eventstore/handler"
"github.com/zitadel/zitadel/internal/eventstore/repository"
"github.com/zitadel/zitadel/internal/repository/instance"
"github.com/zitadel/zitadel/internal/repository/org"
"github.com/zitadel/zitadel/internal/repository/project"
"github.com/zitadel/zitadel/internal/repository/user"
)
@@ -40,10 +41,11 @@ func TestAuthNKeyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.authn_keys (id, creation_date, resource_owner, instance_id, aggregate_id, sequence, object_id, expiration, identifier, public_key, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)",
expectedStmt: "INSERT INTO projections.authn_keys2 (id, creation_date, change_date, resource_owner, instance_id, aggregate_id, sequence, object_id, expiration, identifier, public_key, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)",
expectedArgs: []interface{}{
"keyId",
anyArg{},
anyArg{},
"ro-id",
"instance-id",
"agg-id",
@@ -76,10 +78,11 @@ func TestAuthNKeyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.authn_keys (id, creation_date, resource_owner, instance_id, aggregate_id, sequence, object_id, expiration, identifier, public_key, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)",
expectedStmt: "INSERT INTO projections.authn_keys2 (id, creation_date, change_date, resource_owner, instance_id, aggregate_id, sequence, object_id, expiration, identifier, public_key, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)",
expectedArgs: []interface{}{
"keyId",
anyArg{},
anyArg{},
"ro-id",
"instance-id",
"agg-id",
@@ -112,7 +115,7 @@ func TestAuthNKeyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.authn_keys WHERE (id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.authn_keys2 WHERE (id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"keyId",
"instance-id",
@@ -158,8 +161,10 @@ func TestAuthNKeyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.authn_keys SET enabled = $1 WHERE (object_id = $2) AND (instance_id = $3)",
expectedStmt: "UPDATE projections.authn_keys2 SET (change_date, sequence, enabled) = ($1, $2, $3) WHERE (object_id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
false,
"appId",
"instance-id",
@@ -186,8 +191,10 @@ func TestAuthNKeyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.authn_keys SET enabled = $1 WHERE (object_id = $2) AND (instance_id = $3)",
expectedStmt: "UPDATE projections.authn_keys2 SET (change_date, sequence, enabled) = ($1, $2, $3) WHERE (object_id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"appId",
"instance-id",
@@ -214,7 +221,7 @@ func TestAuthNKeyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.authn_keys WHERE (id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.authn_keys2 WHERE (id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"keyId",
"instance-id",
@@ -241,7 +248,7 @@ func TestAuthNKeyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.authn_keys WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.authn_keys2 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
@@ -286,8 +293,10 @@ func TestAuthNKeyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.authn_keys SET enabled = $1 WHERE (object_id = $2) AND (instance_id = $3)",
expectedStmt: "UPDATE projections.authn_keys2 SET (change_date, sequence, enabled) = ($1, $2, $3) WHERE (object_id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
false,
"appId",
"instance-id",
@@ -314,8 +323,10 @@ func TestAuthNKeyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.authn_keys SET enabled = $1 WHERE (object_id = $2) AND (instance_id = $3)",
expectedStmt: "UPDATE projections.authn_keys2 SET (change_date, sequence, enabled) = ($1, $2, $3) WHERE (object_id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"appId",
"instance-id",
@@ -342,7 +353,7 @@ func TestAuthNKeyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.authn_keys WHERE (id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.authn_keys2 WHERE (id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"keyId",
"instance-id",
@@ -369,7 +380,7 @@ func TestAuthNKeyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.authn_keys WHERE (object_id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.authn_keys2 WHERE (object_id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"appId",
"instance-id",
@@ -396,7 +407,7 @@ func TestAuthNKeyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.authn_keys WHERE (aggregate_id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.authn_keys2 WHERE (aggregate_id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -423,7 +434,7 @@ func TestAuthNKeyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.authn_keys WHERE (id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.authn_keys2 WHERE (id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"keyId",
"instance-id",
@@ -450,7 +461,7 @@ func TestAuthNKeyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.authn_keys WHERE (aggregate_id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.authn_keys2 WHERE (aggregate_id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -460,6 +471,36 @@ func TestAuthNKeyProjection_reduces(t *testing.T) {
},
},
},
{
name: "reduceOwnerRemoved",
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
org.AggregateType,
nil,
), org.OrgRemovedEventMapper),
},
reduce: (&authNKeyProjection{}).reduceOwnerRemoved,
want: wantReduce{
aggregateType: eventstore.AggregateType("org"),
sequence: 15,
previousSequence: 10,
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.authn_keys2 SET (change_date, sequence, owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (resource_owner = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
},
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
+28 -1
View File
@@ -13,7 +13,7 @@ import (
)
const (
CustomTextTable = "projections.custom_texts"
CustomTextTable = "projections.custom_texts2"
CustomTextAggregateIDCol = "aggregate_id"
CustomTextInstanceIDCol = "instance_id"
@@ -25,6 +25,7 @@ const (
CustomTextLanguageCol = "language"
CustomTextKeyCol = "key"
CustomTextTextCol = "text"
CustomTextOwnerRemovedCol = "owner_removed"
)
type customTextProjection struct {
@@ -47,8 +48,10 @@ func newCustomTextProjection(ctx context.Context, config crdb.StatementHandlerCo
crdb.NewColumn(CustomTextLanguageCol, crdb.ColumnTypeText),
crdb.NewColumn(CustomTextKeyCol, crdb.ColumnTypeText),
crdb.NewColumn(CustomTextTextCol, crdb.ColumnTypeText),
crdb.NewColumn(CustomTextOwnerRemovedCol, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(CustomTextInstanceIDCol, CustomTextAggregateIDCol, CustomTextTemplateCol, CustomTextKeyCol, CustomTextLanguageCol),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{CustomTextOwnerRemovedCol})),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -72,6 +75,10 @@ func (p *customTextProjection) reducers() []handler.AggregateReducer {
Event: org.CustomTextTemplateRemovedEventType,
Reduce: p.reduceTemplateRemoved,
},
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOwnerRemoved,
},
},
},
{
@@ -174,3 +181,23 @@ func (p *customTextProjection) reduceTemplateRemoved(event eventstore.Event) (*h
handler.NewCond(CustomTextInstanceIDCol, customTextEvent.Aggregate().InstanceID),
}), nil
}
func (p *customTextProjection) reduceOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-V2T3z", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(CustomTextChangeDateCol, e.CreationDate()),
handler.NewCol(CustomTextSequenceCol, e.Sequence()),
handler.NewCol(CustomTextOwnerRemovedCol, true),
},
[]handler.Condition{
handler.NewCond(CustomTextInstanceIDCol, e.Aggregate().InstanceID),
handler.NewCond(CustomTextAggregateIDCol, e.Aggregate().ID),
},
), nil
}
+37 -7
View File
@@ -43,7 +43,7 @@ func TestCustomTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.custom_texts (aggregate_id, instance_id, creation_date, change_date, sequence, is_default, template, language, key, text) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) ON CONFLICT (instance_id, aggregate_id, template, key, language) DO UPDATE SET (creation_date, change_date, sequence, is_default, text) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.is_default, EXCLUDED.text)",
expectedStmt: "INSERT INTO projections.custom_texts2 (aggregate_id, instance_id, creation_date, change_date, sequence, is_default, template, language, key, text) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) ON CONFLICT (instance_id, aggregate_id, template, key, language) DO UPDATE SET (creation_date, change_date, sequence, is_default, text) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.is_default, EXCLUDED.text)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -82,7 +82,7 @@ func TestCustomTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.custom_texts WHERE (aggregate_id = $1) AND (template = $2) AND (key = $3) AND (language = $4) AND (instance_id = $5)",
expectedStmt: "DELETE FROM projections.custom_texts2 WHERE (aggregate_id = $1) AND (template = $2) AND (key = $3) AND (language = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
"agg-id",
"InitCode",
@@ -116,7 +116,7 @@ func TestCustomTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.custom_texts WHERE (aggregate_id = $1) AND (template = $2) AND (language = $3) AND (instance_id = $4)",
expectedStmt: "DELETE FROM projections.custom_texts2 WHERE (aggregate_id = $1) AND (template = $2) AND (language = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
"agg-id",
"InitCode",
@@ -145,7 +145,7 @@ func TestCustomTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.custom_texts WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.custom_texts2 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
@@ -176,7 +176,7 @@ func TestCustomTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.custom_texts (aggregate_id, instance_id, creation_date, change_date, sequence, is_default, template, language, key, text) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) ON CONFLICT (instance_id, aggregate_id, template, key, language) DO UPDATE SET (creation_date, change_date, sequence, is_default, text) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.is_default, EXCLUDED.text)",
expectedStmt: "INSERT INTO projections.custom_texts2 (aggregate_id, instance_id, creation_date, change_date, sequence, is_default, template, language, key, text) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) ON CONFLICT (instance_id, aggregate_id, template, key, language) DO UPDATE SET (creation_date, change_date, sequence, is_default, text) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.is_default, EXCLUDED.text)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -215,7 +215,7 @@ func TestCustomTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.custom_texts WHERE (aggregate_id = $1) AND (template = $2) AND (key = $3) AND (language = $4) AND (instance_id = $5)",
expectedStmt: "DELETE FROM projections.custom_texts2 WHERE (aggregate_id = $1) AND (template = $2) AND (key = $3) AND (language = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
"agg-id",
"InitCode",
@@ -249,7 +249,7 @@ func TestCustomTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.custom_texts WHERE (aggregate_id = $1) AND (template = $2) AND (language = $3) AND (instance_id = $4)",
expectedStmt: "DELETE FROM projections.custom_texts2 WHERE (aggregate_id = $1) AND (template = $2) AND (language = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
"agg-id",
"InitCode",
@@ -261,6 +261,36 @@ func TestCustomTextProjection_reduces(t *testing.T) {
},
},
},
{
name: "org.reduceOwnerRemoved",
reduce: (&customTextProjection{}).reduceOwnerRemoved,
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
org.AggregateType,
nil,
), org.OrgRemovedEventMapper),
},
want: wantReduce{
aggregateType: eventstore.AggregateType("org"),
sequence: 15,
previousSequence: 10,
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.custom_texts2 SET (change_date, sequence, owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (aggregate_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
},
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
+28 -1
View File
@@ -14,7 +14,7 @@ import (
)
const (
DomainPolicyTable = "projections.domain_policies"
DomainPolicyTable = "projections.domain_policies2"
DomainPolicyIDCol = "id"
DomainPolicyCreationDateCol = "creation_date"
@@ -27,6 +27,7 @@ const (
DomainPolicyIsDefaultCol = "is_default"
DomainPolicyResourceOwnerCol = "resource_owner"
DomainPolicyInstanceIDCol = "instance_id"
DomainPolicyOwnerRemovedCol = "owner_removed"
)
type domainPolicyProjection struct {
@@ -50,8 +51,10 @@ func newDomainPolicyProjection(ctx context.Context, config crdb.StatementHandler
crdb.NewColumn(DomainPolicyIsDefaultCol, crdb.ColumnTypeBool, crdb.Default(false)),
crdb.NewColumn(DomainPolicyResourceOwnerCol, crdb.ColumnTypeText),
crdb.NewColumn(DomainPolicyInstanceIDCol, crdb.ColumnTypeText),
crdb.NewColumn(DomainPolicyOwnerRemovedCol, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(DomainPolicyInstanceIDCol, DomainPolicyIDCol),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{DomainPolicyOwnerRemovedCol})),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -75,6 +78,10 @@ func (p *domainPolicyProjection) reducers() []handler.AggregateReducer {
Event: org.DomainPolicyRemovedEventType,
Reduce: p.reduceRemoved,
},
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOwnerRemoved,
},
},
},
{
@@ -171,3 +178,23 @@ func (p *domainPolicyProjection) reduceRemoved(event eventstore.Event) (*handler
handler.NewCond(DomainPolicyInstanceIDCol, policyEvent.Aggregate().InstanceID),
}), nil
}
func (p *domainPolicyProjection) reduceOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-JYD2K", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(DomainPolicyChangeDateCol, e.CreationDate()),
handler.NewCol(DomainPolicySequenceCol, e.Sequence()),
handler.NewCol(DomainPolicyOwnerRemovedCol, true),
},
[]handler.Condition{
handler.NewCond(DomainPolicyInstanceIDCol, e.Aggregate().InstanceID),
handler.NewCond(DomainPolicyResourceOwnerCol, e.Aggregate().ID),
},
), nil
}
@@ -43,7 +43,7 @@ func TestDomainPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.domain_policies (creation_date, change_date, sequence, id, state, user_login_must_be_domain, validate_org_domains, smtp_sender_address_matches_instance_domain, is_default, resource_owner, instance_id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)",
expectedStmt: "INSERT INTO projections.domain_policies2 (creation_date, change_date, sequence, id, state, user_login_must_be_domain, validate_org_domains, smtp_sender_address_matches_instance_domain, is_default, resource_owner, instance_id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)",
expectedArgs: []interface{}{
anyArg{},
anyArg{},
@@ -83,7 +83,7 @@ func TestDomainPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.domain_policies SET (change_date, sequence, user_login_must_be_domain, validate_org_domains, smtp_sender_address_matches_instance_domain) = ($1, $2, $3, $4, $5) WHERE (id = $6) AND (instance_id = $7)",
expectedStmt: "UPDATE projections.domain_policies2 SET (change_date, sequence, user_login_must_be_domain, validate_org_domains, smtp_sender_address_matches_instance_domain) = ($1, $2, $3, $4, $5) WHERE (id = $6) AND (instance_id = $7)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -115,7 +115,7 @@ func TestDomainPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.domain_policies WHERE (id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.domain_policies2 WHERE (id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -142,7 +142,7 @@ func TestDomainPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.domain_policies WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.domain_policies2 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
@@ -172,7 +172,7 @@ func TestDomainPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.domain_policies (creation_date, change_date, sequence, id, state, user_login_must_be_domain, validate_org_domains, smtp_sender_address_matches_instance_domain, is_default, resource_owner, instance_id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)",
expectedStmt: "INSERT INTO projections.domain_policies2 (creation_date, change_date, sequence, id, state, user_login_must_be_domain, validate_org_domains, smtp_sender_address_matches_instance_domain, is_default, resource_owner, instance_id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)",
expectedArgs: []interface{}{
anyArg{},
anyArg{},
@@ -212,7 +212,7 @@ func TestDomainPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.domain_policies SET (change_date, sequence, user_login_must_be_domain, validate_org_domains, smtp_sender_address_matches_instance_domain) = ($1, $2, $3, $4, $5) WHERE (id = $6) AND (instance_id = $7)",
expectedStmt: "UPDATE projections.domain_policies2 SET (change_date, sequence, user_login_must_be_domain, validate_org_domains, smtp_sender_address_matches_instance_domain) = ($1, $2, $3, $4, $5) WHERE (id = $6) AND (instance_id = $7)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -227,6 +227,36 @@ func TestDomainPolicyProjection_reduces(t *testing.T) {
},
},
},
{
name: "org.reduceOwnerRemoved",
reduce: (&domainPolicyProjection{}).reduceOwnerRemoved,
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
org.AggregateType,
nil,
), org.OrgRemovedEventMapper),
},
want: wantReduce{
aggregateType: eventstore.AggregateType("org"),
sequence: 15,
previousSequence: 10,
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.domain_policies2 SET (change_date, sequence, owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (resource_owner = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
},
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
+28 -1
View File
@@ -12,7 +12,7 @@ import (
)
const (
FlowTriggerTable = "projections.flows_triggers"
FlowTriggerTable = "projections.flow_triggers2"
FlowTypeCol = "flow_type"
FlowChangeDateCol = "change_date"
FlowSequenceCol = "sequence"
@@ -21,6 +21,7 @@ const (
FlowInstanceIDCol = "instance_id"
FlowActionTriggerSequenceCol = "trigger_sequence"
FlowActionIDCol = "action_id"
FlowOwnerRemovedCol = "owner_removed"
)
type flowProjection struct {
@@ -41,8 +42,10 @@ func newFlowProjection(ctx context.Context, config crdb.StatementHandlerConfig)
crdb.NewColumn(FlowInstanceIDCol, crdb.ColumnTypeText),
crdb.NewColumn(FlowActionTriggerSequenceCol, crdb.ColumnTypeInt64),
crdb.NewColumn(FlowActionIDCol, crdb.ColumnTypeText),
crdb.NewColumn(FlowOwnerRemovedCol, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(FlowInstanceIDCol, FlowTypeCol, FlowTriggerTypeCol, FlowResourceOwnerCol, FlowActionIDCol),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{FlowOwnerRemovedCol})),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -62,6 +65,10 @@ func (p *flowProjection) reducers() []handler.AggregateReducer {
Event: org.FlowClearedEventType,
Reduce: p.reduceFlowClearedEventType,
},
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOwnerRemoved,
},
},
},
{
@@ -121,3 +128,23 @@ func (p *flowProjection) reduceFlowClearedEventType(event eventstore.Event) (*ha
},
), nil
}
func (p *flowProjection) reduceOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-Yd7WC", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(FlowChangeDateCol, e.CreationDate()),
handler.NewCol(FlowSequenceCol, e.Sequence()),
handler.NewCol(FlowOwnerRemovedCol, true),
},
[]handler.Condition{
handler.NewCond(FlowInstanceIDCol, e.Aggregate().InstanceID),
handler.NewCond(FlowResourceOwnerCol, e.Aggregate().ID),
},
), nil
}
+35 -5
View File
@@ -39,7 +39,7 @@ func TestFlowProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.flows_triggers WHERE (flow_type = $1) AND (trigger_type = $2) AND (resource_owner = $3) AND (instance_id = $4)",
expectedStmt: "DELETE FROM projections.flow_triggers2 WHERE (flow_type = $1) AND (trigger_type = $2) AND (resource_owner = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
domain.FlowTypeExternalAuthentication,
domain.TriggerTypePostAuthentication,
@@ -48,7 +48,7 @@ func TestFlowProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "INSERT INTO projections.flows_triggers (resource_owner, instance_id, flow_type, change_date, sequence, trigger_type, action_id, trigger_sequence) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
expectedStmt: "INSERT INTO projections.flow_triggers2 (resource_owner, instance_id, flow_type, change_date, sequence, trigger_type, action_id, trigger_sequence) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
expectedArgs: []interface{}{
"ro-id",
"instance-id",
@@ -61,7 +61,7 @@ func TestFlowProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "INSERT INTO projections.flows_triggers (resource_owner, instance_id, flow_type, change_date, sequence, trigger_type, action_id, trigger_sequence) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
expectedStmt: "INSERT INTO projections.flow_triggers2 (resource_owner, instance_id, flow_type, change_date, sequence, trigger_type, action_id, trigger_sequence) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
expectedArgs: []interface{}{
"ro-id",
"instance-id",
@@ -94,7 +94,7 @@ func TestFlowProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.flows_triggers WHERE (flow_type = $1) AND (resource_owner = $2) AND (instance_id = $3)",
expectedStmt: "DELETE FROM projections.flow_triggers2 WHERE (flow_type = $1) AND (resource_owner = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
domain.FlowTypeExternalAuthentication,
"ro-id",
@@ -105,6 +105,36 @@ func TestFlowProjection_reduces(t *testing.T) {
},
},
},
{
name: "org.reduceOwnerRemoved",
reduce: (&flowProjection{}).reduceOwnerRemoved,
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
org.AggregateType,
nil,
), org.OrgRemovedEventMapper),
},
want: wantReduce{
aggregateType: eventstore.AggregateType("org"),
sequence: 15,
previousSequence: 10,
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.flow_triggers2 SET (change_date, sequence, owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (resource_owner = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
},
},
},
},
},
{
name: "instance reduceInstanceRemoved",
args: args{
@@ -122,7 +152,7 @@ func TestFlowProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.flows_triggers WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.flow_triggers2 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
+31 -5
View File
@@ -15,7 +15,7 @@ import (
)
const (
IDPTable = "projections.idps2"
IDPTable = "projections.idps3"
IDPOIDCTable = IDPTable + "_" + IDPOIDCSuffix
IDPJWTTable = IDPTable + "_" + IDPJWTSuffix
@@ -34,6 +34,7 @@ const (
IDPOwnerTypeCol = "owner_type"
IDPAutoRegisterCol = "auto_register"
IDPTypeCol = "type"
IDPOwnerRemovedCol = "owner_removed"
OIDCConfigIDPIDCol = "idp_id"
OIDCConfigInstanceIDCol = "instance_id"
@@ -76,10 +77,11 @@ func newIDPProjection(ctx context.Context, config crdb.StatementHandlerConfig) *
crdb.NewColumn(IDPOwnerTypeCol, crdb.ColumnTypeEnum),
crdb.NewColumn(IDPAutoRegisterCol, crdb.ColumnTypeBool, crdb.Default(false)),
crdb.NewColumn(IDPTypeCol, crdb.ColumnTypeEnum, crdb.Nullable()),
crdb.NewColumn(IDPOwnerRemovedCol, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(IDPInstanceIDCol, IDPIDCol),
crdb.WithIndex(crdb.NewIndex("idp_ro_idx", []string{IDPResourceOwnerCol})),
crdb.WithConstraint(crdb.NewConstraint("idp_id_unique", []string{IDPIDCol})),
crdb.WithIndex(crdb.NewIndex("resource_owner", []string{IDPResourceOwnerCol})),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{IDPOwnerRemovedCol})),
),
crdb.NewSuffixedTable([]*crdb.Column{
crdb.NewColumn(OIDCConfigIDPIDCol, crdb.ColumnTypeText),
@@ -95,7 +97,7 @@ func newIDPProjection(ctx context.Context, config crdb.StatementHandlerConfig) *
},
crdb.NewPrimaryKey(OIDCConfigInstanceIDCol, OIDCConfigIDPIDCol),
IDPOIDCSuffix,
crdb.WithForeignKey(crdb.NewForeignKeyOfPublicKeys("fk_oidc_ref_idp")),
crdb.WithForeignKey(crdb.NewForeignKeyOfPublicKeys()),
),
crdb.NewSuffixedTable([]*crdb.Column{
crdb.NewColumn(JWTConfigIDPIDCol, crdb.ColumnTypeText),
@@ -107,7 +109,7 @@ func newIDPProjection(ctx context.Context, config crdb.StatementHandlerConfig) *
},
crdb.NewPrimaryKey(JWTConfigInstanceIDCol, JWTConfigIDPIDCol),
IDPJWTSuffix,
crdb.WithForeignKey(crdb.NewForeignKeyOfPublicKeys("fk_jwt_ref_idp")),
crdb.WithForeignKey(crdb.NewForeignKeyOfPublicKeys()),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -200,6 +202,10 @@ func (p *idpProjection) reducers() []handler.AggregateReducer {
Event: org.IDPJWTConfigChangedEventType,
Reduce: p.reduceJWTConfigChanged,
},
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOwnerRemoved,
},
},
},
}
@@ -541,3 +547,23 @@ func (p *idpProjection) reduceJWTConfigChanged(event eventstore.Event) (*handler
),
), nil
}
func (p *idpProjection) reduceOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-YsbQC", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(IDPChangeDateCol, e.CreationDate()),
handler.NewCol(IDPSequenceCol, e.Sequence()),
handler.NewCol(IDPOwnerRemovedCol, true),
},
[]handler.Condition{
handler.NewCond(IDPInstanceIDCol, e.Aggregate().InstanceID),
handler.NewCond(IDPResourceOwnerCol, e.Aggregate().ID),
},
), nil
}
@@ -14,7 +14,7 @@ import (
)
const (
IDPLoginPolicyLinkTable = "projections.idp_login_policy_links3"
IDPLoginPolicyLinkTable = "projections.idp_login_policy_links4"
IDPLoginPolicyLinkIDPIDCol = "idp_id"
IDPLoginPolicyLinkAggregateIDCol = "aggregate_id"
@@ -24,6 +24,7 @@ const (
IDPLoginPolicyLinkResourceOwnerCol = "resource_owner"
IDPLoginPolicyLinkInstanceIDCol = "instance_id"
IDPLoginPolicyLinkProviderTypeCol = "provider_type"
IDPLoginPolicyLinkOwnerRemovedCol = "owner_removed"
)
type idpLoginPolicyLinkProjection struct {
@@ -44,9 +45,11 @@ func newIDPLoginPolicyLinkProjection(ctx context.Context, config crdb.StatementH
crdb.NewColumn(IDPLoginPolicyLinkResourceOwnerCol, crdb.ColumnTypeText),
crdb.NewColumn(IDPLoginPolicyLinkInstanceIDCol, crdb.ColumnTypeText),
crdb.NewColumn(IDPLoginPolicyLinkProviderTypeCol, crdb.ColumnTypeEnum),
crdb.NewColumn(IDPLoginPolicyLinkOwnerRemovedCol, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(IDPLoginPolicyLinkInstanceIDCol, IDPLoginPolicyLinkAggregateIDCol, IDPLoginPolicyLinkIDPIDCol),
crdb.WithIndex(crdb.NewIndex("link_ro_idx", []string{IDPLoginPolicyLinkResourceOwnerCol})),
crdb.WithIndex(crdb.NewIndex("resource_owner", []string{IDPLoginPolicyLinkResourceOwnerCol})),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{IDPLoginPolicyLinkOwnerRemovedCol})),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -74,14 +77,14 @@ func (p *idpLoginPolicyLinkProjection) reducers() []handler.AggregateReducer {
Event: org.LoginPolicyRemovedEventType,
Reduce: p.reducePolicyRemoved,
},
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOrgRemoved,
},
{
Event: org.IDPConfigRemovedEventType,
Reduce: p.reduceIDPConfigRemoved,
},
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOwnerRemoved,
},
},
},
{
@@ -206,19 +209,6 @@ func (p *idpLoginPolicyLinkProjection) reduceIDPConfigRemoved(event eventstore.E
), nil
}
func (p *idpLoginPolicyLinkProjection) reduceOrgRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "HANDL-QSoSe", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewDeleteStatement(e,
[]handler.Condition{
handler.NewCond(IDPLoginPolicyLinkResourceOwnerCol, e.Aggregate().ID),
handler.NewCond(IDPLoginPolicyLinkInstanceIDCol, event.Aggregate().InstanceID),
},
), nil
}
func (p *idpLoginPolicyLinkProjection) reducePolicyRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.LoginPolicyRemovedEvent)
if !ok {
@@ -231,3 +221,23 @@ func (p *idpLoginPolicyLinkProjection) reducePolicyRemoved(event eventstore.Even
},
), nil
}
func (p *idpLoginPolicyLinkProjection) reduceOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-YbhOv", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(IDPLoginPolicyLinkChangeDateCol, e.CreationDate()),
handler.NewCol(IDPLoginPolicyLinkSequenceCol, e.Sequence()),
handler.NewCol(IDPLoginPolicyLinkOwnerRemovedCol, true),
},
[]handler.Condition{
handler.NewCond(IDPLoginPolicyLinkInstanceIDCol, e.Aggregate().InstanceID),
handler.NewCond(IDPLoginPolicyLinkResourceOwnerCol, e.Aggregate().ID),
},
), nil
}
@@ -42,7 +42,7 @@ func TestIDPLoginPolicyLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.idp_login_policy_links3 (idp_id, aggregate_id, creation_date, change_date, sequence, resource_owner, instance_id, provider_type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
expectedStmt: "INSERT INTO projections.idp_login_policy_links4 (idp_id, aggregate_id, creation_date, change_date, sequence, resource_owner, instance_id, provider_type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
expectedArgs: []interface{}{
"idp-config-id",
"agg-id",
@@ -78,7 +78,7 @@ func TestIDPLoginPolicyLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idp_login_policy_links3 WHERE (idp_id = $1) AND (aggregate_id = $2) AND (instance_id = $3)",
expectedStmt: "DELETE FROM projections.idp_login_policy_links4 WHERE (idp_id = $1) AND (aggregate_id = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
"idp-config-id",
"agg-id",
@@ -109,7 +109,7 @@ func TestIDPLoginPolicyLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idp_login_policy_links3 WHERE (idp_id = $1) AND (aggregate_id = $2) AND (instance_id = $3)",
expectedStmt: "DELETE FROM projections.idp_login_policy_links4 WHERE (idp_id = $1) AND (aggregate_id = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
"idp-config-id",
"agg-id",
@@ -140,7 +140,7 @@ func TestIDPLoginPolicyLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.idp_login_policy_links3 (idp_id, aggregate_id, creation_date, change_date, sequence, resource_owner, instance_id, provider_type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
expectedStmt: "INSERT INTO projections.idp_login_policy_links4 (idp_id, aggregate_id, creation_date, change_date, sequence, resource_owner, instance_id, provider_type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
expectedArgs: []interface{}{
"idp-config-id",
"agg-id",
@@ -176,7 +176,7 @@ func TestIDPLoginPolicyLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idp_login_policy_links3 WHERE (idp_id = $1) AND (aggregate_id = $2) AND (instance_id = $3)",
expectedStmt: "DELETE FROM projections.idp_login_policy_links4 WHERE (idp_id = $1) AND (aggregate_id = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
"idp-config-id",
"agg-id",
@@ -204,7 +204,7 @@ func TestIDPLoginPolicyLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idp_login_policy_links3 WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.idp_login_policy_links4 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
@@ -233,7 +233,7 @@ func TestIDPLoginPolicyLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idp_login_policy_links3 WHERE (idp_id = $1) AND (aggregate_id = $2) AND (instance_id = $3)",
expectedStmt: "DELETE FROM projections.idp_login_policy_links4 WHERE (idp_id = $1) AND (aggregate_id = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
"idp-config-id",
"agg-id",
@@ -244,33 +244,6 @@ func TestIDPLoginPolicyLinkProjection_reduces(t *testing.T) {
},
},
},
{
name: "reduceOrgRemoved",
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
org.AggregateType,
[]byte(`{}`),
), org.OrgRemovedEventMapper),
},
reduce: (&idpLoginPolicyLinkProjection{}).reduceOrgRemoved,
want: wantReduce{
aggregateType: org.AggregateType,
sequence: 15,
previousSequence: 10,
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idp_login_policy_links3 WHERE (resource_owner = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
},
},
},
},
},
},
{
name: "reducePolicyRemoved",
args: args{
@@ -288,7 +261,7 @@ func TestIDPLoginPolicyLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idp_login_policy_links3 WHERE (aggregate_id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.idp_login_policy_links4 WHERE (aggregate_id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -317,7 +290,7 @@ func TestIDPLoginPolicyLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idp_login_policy_links3 WHERE (idp_id = $1) AND (resource_owner = $2) AND (instance_id = $3)",
expectedStmt: "DELETE FROM projections.idp_login_policy_links4 WHERE (idp_id = $1) AND (resource_owner = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
"idp-config-id",
"ro-id",
@@ -347,7 +320,7 @@ func TestIDPLoginPolicyLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idp_login_policy_links3 WHERE (idp_id = $1) AND (resource_owner = $2) AND (instance_id = $3)",
expectedStmt: "DELETE FROM projections.idp_login_policy_links4 WHERE (idp_id = $1) AND (resource_owner = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
"idp-config-id",
"ro-id",
@@ -358,6 +331,36 @@ func TestIDPLoginPolicyLinkProjection_reduces(t *testing.T) {
},
},
},
{
name: "org.reduceOwnerRemoved",
reduce: (&idpLoginPolicyLinkProjection{}).reduceOwnerRemoved,
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
org.AggregateType,
nil,
), org.OrgRemovedEventMapper),
},
want: wantReduce{
aggregateType: eventstore.AggregateType("org"),
sequence: 15,
previousSequence: 10,
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.idp_login_policy_links4 SET (change_date, sequence, owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (resource_owner = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
},
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
+57 -27
View File
@@ -46,7 +46,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.idps2 (id, creation_date, change_date, sequence, resource_owner, instance_id, state, name, styling_type, auto_register, owner_type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)",
expectedStmt: "INSERT INTO projections.idps3 (id, creation_date, change_date, sequence, resource_owner, instance_id, state, name, styling_type, auto_register, owner_type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)",
expectedArgs: []interface{}{
"idp-config-id",
anyArg{},
@@ -87,7 +87,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.idps2 SET (name, styling_type, auto_register, change_date, sequence) = ($1, $2, $3, $4, $5) WHERE (id = $6) AND (instance_id = $7)",
expectedStmt: "UPDATE projections.idps3 SET (name, styling_type, auto_register, change_date, sequence) = ($1, $2, $3, $4, $5) WHERE (id = $6) AND (instance_id = $7)",
expectedArgs: []interface{}{
"custom-zitadel-instance",
domain.IDPConfigStylingTypeGoogle,
@@ -121,7 +121,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.idps2 SET (state, change_date, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.idps3 SET (state, change_date, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
domain.IDPConfigStateInactive,
anyArg{},
@@ -153,7 +153,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.idps2 SET (state, change_date, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.idps3 SET (state, change_date, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
domain.IDPConfigStateActive,
anyArg{},
@@ -185,7 +185,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idps2 WHERE (id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.idps3 WHERE (id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"idp-config-id",
"instance-id",
@@ -212,7 +212,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idps2 WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.idps3 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
@@ -252,7 +252,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.idps2 SET (change_date, sequence, type) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.idps3 SET (change_date, sequence, type) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -262,7 +262,7 @@ func TestIDPProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "INSERT INTO projections.idps2_oidc_config (idp_id, instance_id, client_id, client_secret, issuer, scopes, display_name_mapping, username_mapping, authorization_endpoint, token_endpoint) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)",
expectedStmt: "INSERT INTO projections.idps3_oidc_config (idp_id, instance_id, client_id, client_secret, issuer, scopes, display_name_mapping, username_mapping, authorization_endpoint, token_endpoint) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)",
expectedArgs: []interface{}{
"idp-config-id",
"instance-id",
@@ -311,7 +311,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.idps2 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedStmt: "UPDATE projections.idps3 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -320,7 +320,7 @@ func TestIDPProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "UPDATE projections.idps2_oidc_config SET (client_id, client_secret, issuer, authorization_endpoint, token_endpoint, scopes, display_name_mapping, username_mapping) = ($1, $2, $3, $4, $5, $6, $7, $8) WHERE (idp_id = $9) AND (instance_id = $10)",
expectedStmt: "UPDATE projections.idps3_oidc_config SET (client_id, client_secret, issuer, authorization_endpoint, token_endpoint, scopes, display_name_mapping, username_mapping) = ($1, $2, $3, $4, $5, $6, $7, $8) WHERE (idp_id = $9) AND (instance_id = $10)",
expectedArgs: []interface{}{
"client-id",
anyArg{},
@@ -380,7 +380,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.idps2 SET (change_date, sequence, type) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.idps3 SET (change_date, sequence, type) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -390,7 +390,7 @@ func TestIDPProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "INSERT INTO projections.idps2_jwt_config (idp_id, instance_id, endpoint, issuer, keys_endpoint, header_name) VALUES ($1, $2, $3, $4, $5, $6)",
expectedStmt: "INSERT INTO projections.idps3_jwt_config (idp_id, instance_id, endpoint, issuer, keys_endpoint, header_name) VALUES ($1, $2, $3, $4, $5, $6)",
expectedArgs: []interface{}{
"idp-config-id",
"instance-id",
@@ -427,7 +427,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.idps2 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedStmt: "UPDATE projections.idps3 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -436,7 +436,7 @@ func TestIDPProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "UPDATE projections.idps2_jwt_config SET (endpoint, issuer, keys_endpoint, header_name) = ($1, $2, $3, $4) WHERE (idp_id = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.idps3_jwt_config SET (endpoint, issuer, keys_endpoint, header_name) = ($1, $2, $3, $4) WHERE (idp_id = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
"https://api.zitadel.ch/jwt",
"issuer",
@@ -492,7 +492,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.idps2 (id, creation_date, change_date, sequence, resource_owner, instance_id, state, name, styling_type, auto_register, owner_type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)",
expectedStmt: "INSERT INTO projections.idps3 (id, creation_date, change_date, sequence, resource_owner, instance_id, state, name, styling_type, auto_register, owner_type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)",
expectedArgs: []interface{}{
"idp-config-id",
anyArg{},
@@ -533,7 +533,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.idps2 SET (name, styling_type, auto_register, change_date, sequence) = ($1, $2, $3, $4, $5) WHERE (id = $6) AND (instance_id = $7)",
expectedStmt: "UPDATE projections.idps3 SET (name, styling_type, auto_register, change_date, sequence) = ($1, $2, $3, $4, $5) WHERE (id = $6) AND (instance_id = $7)",
expectedArgs: []interface{}{
"custom-zitadel-instance",
domain.IDPConfigStylingTypeGoogle,
@@ -567,7 +567,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.idps2 SET (state, change_date, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.idps3 SET (state, change_date, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
domain.IDPConfigStateInactive,
anyArg{},
@@ -599,7 +599,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.idps2 SET (state, change_date, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.idps3 SET (state, change_date, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
domain.IDPConfigStateActive,
anyArg{},
@@ -631,7 +631,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idps2 WHERE (id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.idps3 WHERE (id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"idp-config-id",
"instance-id",
@@ -672,7 +672,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.idps2 SET (change_date, sequence, type) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.idps3 SET (change_date, sequence, type) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -682,7 +682,7 @@ func TestIDPProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "INSERT INTO projections.idps2_oidc_config (idp_id, instance_id, client_id, client_secret, issuer, scopes, display_name_mapping, username_mapping, authorization_endpoint, token_endpoint) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)",
expectedStmt: "INSERT INTO projections.idps3_oidc_config (idp_id, instance_id, client_id, client_secret, issuer, scopes, display_name_mapping, username_mapping, authorization_endpoint, token_endpoint) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)",
expectedArgs: []interface{}{
"idp-config-id",
"instance-id",
@@ -731,7 +731,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.idps2 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedStmt: "UPDATE projections.idps3 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -740,7 +740,7 @@ func TestIDPProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "UPDATE projections.idps2_oidc_config SET (client_id, client_secret, issuer, authorization_endpoint, token_endpoint, scopes, display_name_mapping, username_mapping) = ($1, $2, $3, $4, $5, $6, $7, $8) WHERE (idp_id = $9) AND (instance_id = $10)",
expectedStmt: "UPDATE projections.idps3_oidc_config SET (client_id, client_secret, issuer, authorization_endpoint, token_endpoint, scopes, display_name_mapping, username_mapping) = ($1, $2, $3, $4, $5, $6, $7, $8) WHERE (idp_id = $9) AND (instance_id = $10)",
expectedArgs: []interface{}{
"client-id",
anyArg{},
@@ -800,7 +800,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.idps2 SET (change_date, sequence, type) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.idps3 SET (change_date, sequence, type) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -810,7 +810,7 @@ func TestIDPProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "INSERT INTO projections.idps2_jwt_config (idp_id, instance_id, endpoint, issuer, keys_endpoint, header_name) VALUES ($1, $2, $3, $4, $5, $6)",
expectedStmt: "INSERT INTO projections.idps3_jwt_config (idp_id, instance_id, endpoint, issuer, keys_endpoint, header_name) VALUES ($1, $2, $3, $4, $5, $6)",
expectedArgs: []interface{}{
"idp-config-id",
"instance-id",
@@ -847,7 +847,7 @@ func TestIDPProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.idps2 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedStmt: "UPDATE projections.idps3 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -856,7 +856,7 @@ func TestIDPProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "UPDATE projections.idps2_jwt_config SET (endpoint, issuer, keys_endpoint, header_name) = ($1, $2, $3, $4) WHERE (idp_id = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.idps3_jwt_config SET (endpoint, issuer, keys_endpoint, header_name) = ($1, $2, $3, $4) WHERE (idp_id = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
"https://api.zitadel.ch/jwt",
"issuer",
@@ -889,6 +889,36 @@ func TestIDPProjection_reduces(t *testing.T) {
},
},
},
{
name: "org.reduceOwnerRemoved",
reduce: (&idpProjection{}).reduceOwnerRemoved,
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
org.AggregateType,
nil,
), org.OrgRemovedEventMapper),
},
want: wantReduce{
aggregateType: eventstore.AggregateType("org"),
sequence: 15,
previousSequence: 10,
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.idps3 SET (change_date, sequence, owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (resource_owner = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
},
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
+15 -6
View File
@@ -13,7 +13,7 @@ import (
)
const (
IDPUserLinkTable = "projections.idp_user_links2"
IDPUserLinkTable = "projections.idp_user_links3"
IDPUserLinkIDPIDCol = "idp_id"
IDPUserLinkUserIDCol = "user_id"
IDPUserLinkExternalUserIDCol = "external_user_id"
@@ -23,6 +23,7 @@ const (
IDPUserLinkResourceOwnerCol = "resource_owner"
IDPUserLinkInstanceIDCol = "instance_id"
IDPUserLinkDisplayNameCol = "display_name"
IDPUserLinkOwnerRemovedCol = "owner_removed"
)
type idpUserLinkProjection struct {
@@ -44,9 +45,11 @@ func newIDPUserLinkProjection(ctx context.Context, config crdb.StatementHandlerC
crdb.NewColumn(IDPUserLinkResourceOwnerCol, crdb.ColumnTypeText),
crdb.NewColumn(IDPUserLinkInstanceIDCol, crdb.ColumnTypeText),
crdb.NewColumn(IDPUserLinkDisplayNameCol, crdb.ColumnTypeText),
crdb.NewColumn(IDPUserLinkOwnerRemovedCol, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(IDPUserLinkInstanceIDCol, IDPUserLinkIDPIDCol, IDPUserLinkExternalUserIDCol),
crdb.WithIndex(crdb.NewIndex("idp_user_idx", []string{IDPUserLinkUserIDCol})),
crdb.WithIndex(crdb.NewIndex("user_id", []string{IDPUserLinkUserIDCol})),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{IDPUserLinkOwnerRemovedCol})),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -85,7 +88,7 @@ func (p *idpUserLinkProjection) reducers() []handler.AggregateReducer {
},
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOrgRemoved,
Reduce: p.reduceOwnerRemoved,
},
},
},
@@ -158,13 +161,19 @@ func (p *idpUserLinkProjection) reduceCascadeRemoved(event eventstore.Event) (*h
), nil
}
func (p *idpUserLinkProjection) reduceOrgRemoved(event eventstore.Event) (*handler.Statement, error) {
func (p *idpUserLinkProjection) reduceOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "HANDL-AZmfJ", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-PGiAY", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewDeleteStatement(e,
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(IDPUserLinkChangeDateCol, e.CreationDate()),
handler.NewCol(IDPUserLinkSequenceCol, e.Sequence()),
handler.NewCol(IDPUserLinkOwnerRemovedCol, true),
},
[]handler.Condition{
handler.NewCond(IDPUserLinkResourceOwnerCol, e.Aggregate().ID),
handler.NewCond(IDPUserLinkInstanceIDCol, e.Aggregate().InstanceID),
+13 -10
View File
@@ -43,7 +43,7 @@ func TestIDPUserLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.idp_user_links2 (idp_id, user_id, external_user_id, creation_date, change_date, sequence, resource_owner, instance_id, display_name) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)",
expectedStmt: "INSERT INTO projections.idp_user_links3 (idp_id, user_id, external_user_id, creation_date, change_date, sequence, resource_owner, instance_id, display_name) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)",
expectedArgs: []interface{}{
"idp-config-id",
"agg-id",
@@ -80,7 +80,7 @@ func TestIDPUserLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idp_user_links2 WHERE (idp_id = $1) AND (user_id = $2) AND (external_user_id = $3) AND (instance_id = $4)",
expectedStmt: "DELETE FROM projections.idp_user_links3 WHERE (idp_id = $1) AND (user_id = $2) AND (external_user_id = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
"idp-config-id",
"agg-id",
@@ -112,7 +112,7 @@ func TestIDPUserLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idp_user_links2 WHERE (idp_id = $1) AND (user_id = $2) AND (external_user_id = $3) AND (instance_id = $4)",
expectedStmt: "DELETE FROM projections.idp_user_links3 WHERE (idp_id = $1) AND (user_id = $2) AND (external_user_id = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
"idp-config-id",
"agg-id",
@@ -125,7 +125,7 @@ func TestIDPUserLinkProjection_reduces(t *testing.T) {
},
},
{
name: "reduceOrgRemoved",
name: "reduceOwnerRemoved",
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
@@ -133,7 +133,7 @@ func TestIDPUserLinkProjection_reduces(t *testing.T) {
[]byte(`{}`),
), org.OrgRemovedEventMapper),
},
reduce: (&idpUserLinkProjection{}).reduceOrgRemoved,
reduce: (&idpUserLinkProjection{}).reduceOwnerRemoved,
want: wantReduce{
aggregateType: org.AggregateType,
sequence: 15,
@@ -141,8 +141,11 @@ func TestIDPUserLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idp_user_links2 WHERE (resource_owner = $1) AND (instance_id = $2)",
expectedStmt: "UPDATE projections.idp_user_links3 SET (change_date, sequence, owner_removed) = ($1, $2, $3) WHERE (resource_owner = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"agg-id",
"instance-id",
},
@@ -168,7 +171,7 @@ func TestIDPUserLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idp_user_links2 WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.idp_user_links3 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
@@ -194,7 +197,7 @@ func TestIDPUserLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idp_user_links2 WHERE (user_id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.idp_user_links3 WHERE (user_id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -223,7 +226,7 @@ func TestIDPUserLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idp_user_links2 WHERE (idp_id = $1) AND (resource_owner = $2) AND (instance_id = $3)",
expectedStmt: "DELETE FROM projections.idp_user_links3 WHERE (idp_id = $1) AND (resource_owner = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
"idp-config-id",
"ro-id",
@@ -253,7 +256,7 @@ func TestIDPUserLinkProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.idp_user_links2 WHERE (idp_id = $1) AND (resource_owner = $2) AND (instance_id = $3)",
expectedStmt: "DELETE FROM projections.idp_user_links3 WHERE (idp_id = $1) AND (resource_owner = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
"idp-config-id",
"ro-id",
+27 -3
View File
@@ -8,11 +8,12 @@ import (
"github.com/zitadel/zitadel/internal/eventstore/handler"
"github.com/zitadel/zitadel/internal/eventstore/handler/crdb"
"github.com/zitadel/zitadel/internal/repository/instance"
"github.com/zitadel/zitadel/internal/repository/org"
"github.com/zitadel/zitadel/internal/repository/user"
)
const (
InstanceMemberProjectionTable = "projections.instance_members2"
InstanceMemberProjectionTable = "projections.instance_members3"
InstanceMemberIAMIDCol = "id"
)
@@ -29,7 +30,8 @@ func newInstanceMemberProjection(ctx context.Context, config crdb.StatementHandl
crdb.NewTable(
append(memberColumns, crdb.NewColumn(InstanceColumnID, crdb.ColumnTypeText)),
crdb.NewPrimaryKey(MemberInstanceID, InstanceColumnID, MemberUserIDCol),
crdb.WithIndex(crdb.NewIndex("inst_memb_user_idx", []string{MemberUserIDCol})),
crdb.WithIndex(crdb.NewIndex("user_id", []string{MemberUserIDCol})),
crdb.WithIndex(crdb.NewIndex("user_owner_removed", []string{MemberUserOwnerRemoved})),
),
)
@@ -64,6 +66,15 @@ func (p *instanceMemberProjection) reducers() []handler.AggregateReducer {
},
},
},
{
Aggregate: org.AggregateType,
EventRedusers: []handler.EventReducer{
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceUserOwnerRemoved,
},
},
},
{
Aggregate: user.AggregateType,
EventRedusers: []handler.EventReducer{
@@ -81,7 +92,12 @@ func (p *instanceMemberProjection) reduceAdded(event eventstore.Event) (*handler
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "HANDL-pGNCu", "reduce.wrong.event.type %s", instance.MemberAddedEventType)
}
return reduceMemberAdded(e.MemberAddedEvent, withMemberCol(InstanceMemberIAMIDCol, e.Aggregate().ID))
ctx := setMemberContext(e.Aggregate())
userOwner, err := getResourceOwnerOfUser(ctx, p.Eventstore, e.Aggregate().InstanceID, e.UserID)
if err != nil {
return nil, err
}
return reduceMemberAdded(e.MemberAddedEvent, userOwner, withMemberCol(InstanceMemberIAMIDCol, e.Aggregate().ID))
}
func (p *instanceMemberProjection) reduceChanged(event eventstore.Event) (*handler.Statement, error) {
@@ -115,3 +131,11 @@ func (p *instanceMemberProjection) reduceUserRemoved(event eventstore.Event) (*h
}
return reduceMemberRemoved(e, withMemberCond(MemberUserIDCol, e.Aggregate().ID))
}
func (p *instanceMemberProjection) reduceUserOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "HANDL-mkDHa", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return reduceMemberUserOwnerRemoved(e)
}
@@ -1,14 +1,19 @@
package projection
import (
"context"
"testing"
"golang.org/x/text/language"
"github.com/zitadel/zitadel/internal/database"
"github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/errors"
"github.com/zitadel/zitadel/internal/eventstore"
"github.com/zitadel/zitadel/internal/eventstore/handler"
"github.com/zitadel/zitadel/internal/eventstore/repository"
"github.com/zitadel/zitadel/internal/repository/instance"
"github.com/zitadel/zitadel/internal/repository/org"
"github.com/zitadel/zitadel/internal/repository/user"
)
@@ -34,7 +39,21 @@ func TestInstanceMemberProjection_reduces(t *testing.T) {
}`),
), instance.MemberAddedEventMapper),
},
reduce: (&instanceMemberProjection{}).reduceAdded,
reduce: (&instanceMemberProjection{
StatementHandler: getStatementHandlerWithFilters(
user.NewHumanAddedEvent(context.Background(),
&user.NewAggregate("user-id", "org1").Aggregate,
"username1",
"firstname1",
"lastname1",
"nickname1",
"displayname1",
language.German,
domain.GenderMale,
"email1",
true,
),
)(t)}).reduceAdded,
want: wantReduce{
aggregateType: instance.AggregateType,
sequence: 15,
@@ -42,15 +61,18 @@ func TestInstanceMemberProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.instance_members2 (user_id, roles, creation_date, change_date, sequence, resource_owner, instance_id, id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
expectedStmt: "INSERT INTO projections.instance_members3 (user_id, user_resource_owner, user_owner_removed, roles, creation_date, change_date, sequence, resource_owner, instance_id, owner_removed, id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)",
expectedArgs: []interface{}{
"user-id",
"org1",
false,
database.StringArray{"role"},
anyArg{},
anyArg{},
uint64(15),
"ro-id",
"instance-id",
false,
"agg-id",
},
},
@@ -78,7 +100,7 @@ func TestInstanceMemberProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.instance_members2 SET (roles, change_date, sequence) = ($1, $2, $3) WHERE (instance_id = $4) AND (user_id = $5)",
expectedStmt: "UPDATE projections.instance_members3 SET (roles, change_date, sequence) = ($1, $2, $3) WHERE (instance_id = $4) AND (user_id = $5)",
expectedArgs: []interface{}{
database.StringArray{"role", "changed"},
anyArg{},
@@ -110,7 +132,7 @@ func TestInstanceMemberProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.instance_members2 WHERE (instance_id = $1) AND (user_id = $2)",
expectedStmt: "DELETE FROM projections.instance_members3 WHERE (instance_id = $1) AND (user_id = $2)",
expectedArgs: []interface{}{
"instance-id",
"user-id",
@@ -139,7 +161,7 @@ func TestInstanceMemberProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.instance_members2 WHERE (instance_id = $1) AND (user_id = $2)",
expectedStmt: "DELETE FROM projections.instance_members3 WHERE (instance_id = $1) AND (user_id = $2)",
expectedArgs: []interface{}{
"instance-id",
"user-id",
@@ -166,7 +188,7 @@ func TestInstanceMemberProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.instance_members2 WHERE (instance_id = $1) AND (user_id = $2)",
expectedStmt: "DELETE FROM projections.instance_members3 WHERE (instance_id = $1) AND (user_id = $2)",
expectedArgs: []interface{}{
"instance-id",
"agg-id",
@@ -176,6 +198,36 @@ func TestInstanceMemberProjection_reduces(t *testing.T) {
},
},
},
{
name: "org.OrgRemoved",
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
org.AggregateType,
nil,
), org.OrgRemovedEventMapper),
},
reduce: (&instanceMemberProjection{}).reduceUserOwnerRemoved,
want: wantReduce{
aggregateType: org.AggregateType,
sequence: 15,
previousSequence: 10,
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.instance_members3 SET (change_date, sequence, user_owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (user_resource_owner = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
},
},
},
},
},
{
name: "instance reduceInstanceRemoved",
args: args{
@@ -193,7 +245,7 @@ func TestInstanceMemberProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.instance_members2 WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.instance_members3 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
+4 -5
View File
@@ -14,7 +14,7 @@ import (
)
const (
KeyProjectionTable = "projections.keys3"
KeyProjectionTable = "projections.keys4"
KeyPrivateTable = KeyProjectionTable + "_" + privateKeyTableSuffix
KeyPublicTable = KeyProjectionTable + "_" + publicKeyTableSuffix
CertificateTable = KeyProjectionTable + "_" + certificateTableSuffix
@@ -69,7 +69,6 @@ func newKeyProjection(ctx context.Context, config crdb.StatementHandlerConfig, k
crdb.NewColumn(KeyColumnUse, crdb.ColumnTypeEnum, crdb.Default(0)),
},
crdb.NewPrimaryKey(KeyColumnInstanceID, KeyColumnID),
crdb.WithConstraint(crdb.NewConstraint("key3_id_unique", []string{KeyColumnID})),
),
crdb.NewSuffixedTable([]*crdb.Column{
crdb.NewColumn(KeyPrivateColumnID, crdb.ColumnTypeText),
@@ -79,7 +78,7 @@ func newKeyProjection(ctx context.Context, config crdb.StatementHandlerConfig, k
},
crdb.NewPrimaryKey(KeyPrivateColumnInstanceID, KeyPrivateColumnID),
privateKeyTableSuffix,
crdb.WithForeignKey(crdb.NewForeignKeyOfPublicKeys("fk_private_ref_keys3")),
crdb.WithForeignKey(crdb.NewForeignKeyOfPublicKeys()),
),
crdb.NewSuffixedTable([]*crdb.Column{
crdb.NewColumn(KeyPublicColumnID, crdb.ColumnTypeText),
@@ -89,7 +88,7 @@ func newKeyProjection(ctx context.Context, config crdb.StatementHandlerConfig, k
},
crdb.NewPrimaryKey(KeyPublicColumnInstanceID, KeyPublicColumnID),
publicKeyTableSuffix,
crdb.WithForeignKey(crdb.NewForeignKeyOfPublicKeys("fk_public_ref_keys3")),
crdb.WithForeignKey(crdb.NewForeignKeyOfPublicKeys()),
),
crdb.NewSuffixedTable([]*crdb.Column{
crdb.NewColumn(CertificateColumnID, crdb.ColumnTypeText),
@@ -99,7 +98,7 @@ func newKeyProjection(ctx context.Context, config crdb.StatementHandlerConfig, k
},
crdb.NewPrimaryKey(CertificateColumnInstanceID, CertificateColumnID),
certificateTableSuffix,
crdb.WithForeignKey(crdb.NewForeignKeyOfPublicKeys("fk_certificate_ref_keys3")),
crdb.WithForeignKey(crdb.NewForeignKeyOfPublicKeys()),
),
)
p.encryptionAlgorithm = keyEncryptionAlgorithm
+5 -5
View File
@@ -44,7 +44,7 @@ func TestKeyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.keys3 (id, creation_date, change_date, resource_owner, instance_id, sequence, algorithm, use) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
expectedStmt: "INSERT INTO projections.keys4 (id, creation_date, change_date, resource_owner, instance_id, sequence, algorithm, use) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
expectedArgs: []interface{}{
"agg-id",
anyArg{},
@@ -57,7 +57,7 @@ func TestKeyProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "INSERT INTO projections.keys3_private (id, instance_id, expiry, key) VALUES ($1, $2, $3, $4)",
expectedStmt: "INSERT INTO projections.keys4_private (id, instance_id, expiry, key) VALUES ($1, $2, $3, $4)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -71,7 +71,7 @@ func TestKeyProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "INSERT INTO projections.keys3_public (id, instance_id, expiry, key) VALUES ($1, $2, $3, $4)",
expectedStmt: "INSERT INTO projections.keys4_public (id, instance_id, expiry, key) VALUES ($1, $2, $3, $4)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -117,7 +117,7 @@ func TestKeyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.keys3 WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.keys4 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
@@ -143,7 +143,7 @@ func TestKeyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.keys3_certificate (id, instance_id, expiry, certificate) VALUES ($1, $2, $3, $4)",
expectedStmt: "INSERT INTO projections.keys4_certificate (id, instance_id, expiry, certificate) VALUES ($1, $2, $3, $4)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
+28 -1
View File
@@ -14,7 +14,7 @@ import (
)
const (
LabelPolicyTable = "projections.label_policies"
LabelPolicyTable = "projections.label_policies2"
LabelPolicyIDCol = "id"
LabelPolicyCreationDateCol = "creation_date"
@@ -28,6 +28,7 @@ const (
LabelPolicyWatermarkDisabledCol = "watermark_disabled"
LabelPolicyShouldErrorPopupCol = "should_error_popup"
LabelPolicyFontURLCol = "font_url"
LabelPolicyOwnerRemovedCol = "owner_removed"
LabelPolicyLightPrimaryColorCol = "light_primary_color"
LabelPolicyLightWarnColorCol = "light_warn_color"
@@ -78,8 +79,10 @@ func newLabelPolicyProjection(ctx context.Context, config crdb.StatementHandlerC
crdb.NewColumn(LabelPolicyDarkFontColorCol, crdb.ColumnTypeText, crdb.Nullable()),
crdb.NewColumn(LabelPolicyDarkLogoURLCol, crdb.ColumnTypeText, crdb.Nullable()),
crdb.NewColumn(LabelPolicyDarkIconURLCol, crdb.ColumnTypeText, crdb.Nullable()),
crdb.NewColumn(LabelPolicyOwnerRemovedCol, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(LabelPolicyInstanceIDCol, LabelPolicyIDCol, LabelPolicyStateCol),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{LabelPolicyOwnerRemovedCol})),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -151,6 +154,10 @@ func (p *labelPolicyProjection) reducers() []handler.AggregateReducer {
Event: org.LabelPolicyAssetsRemovedEventType,
Reduce: p.reduceAssetsRemoved,
},
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOwnerRemoved,
},
},
},
{
@@ -593,3 +600,23 @@ func (p *labelPolicyProjection) reduceAssetsRemoved(event eventstore.Event) (*ha
handler.NewCond(LabelPolicyInstanceIDCol, event.Aggregate().InstanceID),
}), nil
}
func (p *labelPolicyProjection) reduceOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-Su6pX", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(LabelPolicyChangeDateCol, e.CreationDate()),
handler.NewCol(LabelPolicySequenceCol, e.Sequence()),
handler.NewCol(LabelPolicyOwnerRemovedCol, true),
},
[]handler.Condition{
handler.NewCond(LabelPolicyInstanceIDCol, e.Aggregate().InstanceID),
handler.NewCond(LabelPolicyResourceOwnerCol, e.Aggregate().ID),
},
), nil
}
+60 -30
View File
@@ -39,7 +39,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.label_policies (creation_date, change_date, sequence, id, state, is_default, resource_owner, instance_id, light_primary_color, light_background_color, light_warn_color, light_font_color, dark_primary_color, dark_background_color, dark_warn_color, dark_font_color, hide_login_name_suffix, should_error_popup, watermark_disabled) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19)",
expectedStmt: "INSERT INTO projections.label_policies2 (creation_date, change_date, sequence, id, state, is_default, resource_owner, instance_id, light_primary_color, light_background_color, light_warn_color, light_font_color, dark_primary_color, dark_background_color, dark_warn_color, dark_font_color, hide_login_name_suffix, should_error_popup, watermark_disabled) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19)",
expectedArgs: []interface{}{
anyArg{},
anyArg{},
@@ -83,7 +83,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, light_primary_color, light_background_color, light_warn_color, light_font_color) = ($1, $2, $3, $4, $5, $6) WHERE (id = $7) AND (state = $8) AND (instance_id = $9)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, light_primary_color, light_background_color, light_warn_color, light_font_color) = ($1, $2, $3, $4, $5, $6) WHERE (id = $7) AND (state = $8) AND (instance_id = $9)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -117,7 +117,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.label_policies WHERE (id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.label_policies2 WHERE (id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -144,7 +144,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.label_policies WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.label_policies2 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
@@ -170,7 +170,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.label_policies (change_date, sequence, state, creation_date, resource_owner, instance_id, id, is_default, hide_login_name_suffix, font_url, watermark_disabled, should_error_popup, light_primary_color, light_warn_color, light_background_color, light_font_color, light_logo_url, light_icon_url, dark_primary_color, dark_warn_color, dark_background_color, dark_font_color, dark_logo_url, dark_icon_url) SELECT $1, $2, $3, creation_date, resource_owner, instance_id, id, is_default, hide_login_name_suffix, font_url, watermark_disabled, should_error_popup, light_primary_color, light_warn_color, light_background_color, light_font_color, light_logo_url, light_icon_url, dark_primary_color, dark_warn_color, dark_background_color, dark_font_color, dark_logo_url, dark_icon_url FROM projections.label_policies AS copy_table WHERE copy_table.id = $4 AND copy_table.state = $5 AND copy_table.instance_id = $6 ON CONFLICT (instance_id, id, state) DO UPDATE SET (change_date, sequence, state, creation_date, resource_owner, instance_id, id, is_default, hide_login_name_suffix, font_url, watermark_disabled, should_error_popup, light_primary_color, light_warn_color, light_background_color, light_font_color, light_logo_url, light_icon_url, dark_primary_color, dark_warn_color, dark_background_color, dark_font_color, dark_logo_url, dark_icon_url) = ($1, $2, $3, EXCLUDED.creation_date, EXCLUDED.resource_owner, EXCLUDED.instance_id, EXCLUDED.id, EXCLUDED.is_default, EXCLUDED.hide_login_name_suffix, EXCLUDED.font_url, EXCLUDED.watermark_disabled, EXCLUDED.should_error_popup, EXCLUDED.light_primary_color, EXCLUDED.light_warn_color, EXCLUDED.light_background_color, EXCLUDED.light_font_color, EXCLUDED.light_logo_url, EXCLUDED.light_icon_url, EXCLUDED.dark_primary_color, EXCLUDED.dark_warn_color, EXCLUDED.dark_background_color, EXCLUDED.dark_font_color, EXCLUDED.dark_logo_url, EXCLUDED.dark_icon_url)",
expectedStmt: "INSERT INTO projections.label_policies2 (change_date, sequence, state, creation_date, resource_owner, instance_id, id, is_default, hide_login_name_suffix, font_url, watermark_disabled, should_error_popup, light_primary_color, light_warn_color, light_background_color, light_font_color, light_logo_url, light_icon_url, dark_primary_color, dark_warn_color, dark_background_color, dark_font_color, dark_logo_url, dark_icon_url) SELECT $1, $2, $3, creation_date, resource_owner, instance_id, id, is_default, hide_login_name_suffix, font_url, watermark_disabled, should_error_popup, light_primary_color, light_warn_color, light_background_color, light_font_color, light_logo_url, light_icon_url, dark_primary_color, dark_warn_color, dark_background_color, dark_font_color, dark_logo_url, dark_icon_url FROM projections.label_policies2 AS copy_table WHERE copy_table.id = $4 AND copy_table.state = $5 AND copy_table.instance_id = $6 ON CONFLICT (instance_id, id, state) DO UPDATE SET (change_date, sequence, state, creation_date, resource_owner, instance_id, id, is_default, hide_login_name_suffix, font_url, watermark_disabled, should_error_popup, light_primary_color, light_warn_color, light_background_color, light_font_color, light_logo_url, light_icon_url, dark_primary_color, dark_warn_color, dark_background_color, dark_font_color, dark_logo_url, dark_icon_url) = ($1, $2, $3, EXCLUDED.creation_date, EXCLUDED.resource_owner, EXCLUDED.instance_id, EXCLUDED.id, EXCLUDED.is_default, EXCLUDED.hide_login_name_suffix, EXCLUDED.font_url, EXCLUDED.watermark_disabled, EXCLUDED.should_error_popup, EXCLUDED.light_primary_color, EXCLUDED.light_warn_color, EXCLUDED.light_background_color, EXCLUDED.light_font_color, EXCLUDED.light_logo_url, EXCLUDED.light_icon_url, EXCLUDED.dark_primary_color, EXCLUDED.dark_warn_color, EXCLUDED.dark_background_color, EXCLUDED.dark_font_color, EXCLUDED.dark_logo_url, EXCLUDED.dark_icon_url)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -201,7 +201,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, light_logo_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, light_logo_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -232,7 +232,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, dark_logo_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, dark_logo_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -263,7 +263,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, light_icon_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, light_icon_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -294,7 +294,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, dark_icon_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, dark_icon_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -325,7 +325,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, light_logo_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, light_logo_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -356,7 +356,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, dark_logo_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, dark_logo_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -387,7 +387,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, light_icon_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, light_icon_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -418,7 +418,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, dark_icon_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, dark_icon_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -449,7 +449,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, font_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, font_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -480,7 +480,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, font_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, font_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -511,7 +511,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, light_logo_url, light_icon_url, dark_logo_url, dark_icon_url, font_url) = ($1, $2, $3, $4, $5, $6, $7) WHERE (id = $8) AND (state = $9) AND (instance_id = $10)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, light_logo_url, light_icon_url, dark_logo_url, dark_icon_url, font_url) = ($1, $2, $3, $4, $5, $6, $7) WHERE (id = $8) AND (state = $9) AND (instance_id = $10)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -546,7 +546,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.label_policies (creation_date, change_date, sequence, id, state, is_default, resource_owner, instance_id, light_primary_color, light_background_color, light_warn_color, light_font_color, dark_primary_color, dark_background_color, dark_warn_color, dark_font_color, hide_login_name_suffix, should_error_popup, watermark_disabled) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19)",
expectedStmt: "INSERT INTO projections.label_policies2 (creation_date, change_date, sequence, id, state, is_default, resource_owner, instance_id, light_primary_color, light_background_color, light_warn_color, light_font_color, dark_primary_color, dark_background_color, dark_warn_color, dark_font_color, hide_login_name_suffix, should_error_popup, watermark_disabled) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19)",
expectedArgs: []interface{}{
anyArg{},
anyArg{},
@@ -590,7 +590,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, light_primary_color, light_background_color, light_warn_color, light_font_color, dark_primary_color, dark_background_color, dark_warn_color, dark_font_color, hide_login_name_suffix, should_error_popup, watermark_disabled) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13) WHERE (id = $14) AND (state = $15) AND (instance_id = $16)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, light_primary_color, light_background_color, light_warn_color, light_font_color, dark_primary_color, dark_background_color, dark_warn_color, dark_font_color, hide_login_name_suffix, should_error_popup, watermark_disabled) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13) WHERE (id = $14) AND (state = $15) AND (instance_id = $16)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -631,7 +631,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.label_policies (change_date, sequence, state, creation_date, resource_owner, instance_id, id, is_default, hide_login_name_suffix, font_url, watermark_disabled, should_error_popup, light_primary_color, light_warn_color, light_background_color, light_font_color, light_logo_url, light_icon_url, dark_primary_color, dark_warn_color, dark_background_color, dark_font_color, dark_logo_url, dark_icon_url) SELECT $1, $2, $3, creation_date, resource_owner, instance_id, id, is_default, hide_login_name_suffix, font_url, watermark_disabled, should_error_popup, light_primary_color, light_warn_color, light_background_color, light_font_color, light_logo_url, light_icon_url, dark_primary_color, dark_warn_color, dark_background_color, dark_font_color, dark_logo_url, dark_icon_url FROM projections.label_policies AS copy_table WHERE copy_table.id = $4 AND copy_table.state = $5 AND copy_table.instance_id = $6 ON CONFLICT (instance_id, id, state) DO UPDATE SET (change_date, sequence, state, creation_date, resource_owner, instance_id, id, is_default, hide_login_name_suffix, font_url, watermark_disabled, should_error_popup, light_primary_color, light_warn_color, light_background_color, light_font_color, light_logo_url, light_icon_url, dark_primary_color, dark_warn_color, dark_background_color, dark_font_color, dark_logo_url, dark_icon_url) = ($1, $2, $3, EXCLUDED.creation_date, EXCLUDED.resource_owner, EXCLUDED.instance_id, EXCLUDED.id, EXCLUDED.is_default, EXCLUDED.hide_login_name_suffix, EXCLUDED.font_url, EXCLUDED.watermark_disabled, EXCLUDED.should_error_popup, EXCLUDED.light_primary_color, EXCLUDED.light_warn_color, EXCLUDED.light_background_color, EXCLUDED.light_font_color, EXCLUDED.light_logo_url, EXCLUDED.light_icon_url, EXCLUDED.dark_primary_color, EXCLUDED.dark_warn_color, EXCLUDED.dark_background_color, EXCLUDED.dark_font_color, EXCLUDED.dark_logo_url, EXCLUDED.dark_icon_url)",
expectedStmt: "INSERT INTO projections.label_policies2 (change_date, sequence, state, creation_date, resource_owner, instance_id, id, is_default, hide_login_name_suffix, font_url, watermark_disabled, should_error_popup, light_primary_color, light_warn_color, light_background_color, light_font_color, light_logo_url, light_icon_url, dark_primary_color, dark_warn_color, dark_background_color, dark_font_color, dark_logo_url, dark_icon_url) SELECT $1, $2, $3, creation_date, resource_owner, instance_id, id, is_default, hide_login_name_suffix, font_url, watermark_disabled, should_error_popup, light_primary_color, light_warn_color, light_background_color, light_font_color, light_logo_url, light_icon_url, dark_primary_color, dark_warn_color, dark_background_color, dark_font_color, dark_logo_url, dark_icon_url FROM projections.label_policies2 AS copy_table WHERE copy_table.id = $4 AND copy_table.state = $5 AND copy_table.instance_id = $6 ON CONFLICT (instance_id, id, state) DO UPDATE SET (change_date, sequence, state, creation_date, resource_owner, instance_id, id, is_default, hide_login_name_suffix, font_url, watermark_disabled, should_error_popup, light_primary_color, light_warn_color, light_background_color, light_font_color, light_logo_url, light_icon_url, dark_primary_color, dark_warn_color, dark_background_color, dark_font_color, dark_logo_url, dark_icon_url) = ($1, $2, $3, EXCLUDED.creation_date, EXCLUDED.resource_owner, EXCLUDED.instance_id, EXCLUDED.id, EXCLUDED.is_default, EXCLUDED.hide_login_name_suffix, EXCLUDED.font_url, EXCLUDED.watermark_disabled, EXCLUDED.should_error_popup, EXCLUDED.light_primary_color, EXCLUDED.light_warn_color, EXCLUDED.light_background_color, EXCLUDED.light_font_color, EXCLUDED.light_logo_url, EXCLUDED.light_icon_url, EXCLUDED.dark_primary_color, EXCLUDED.dark_warn_color, EXCLUDED.dark_background_color, EXCLUDED.dark_font_color, EXCLUDED.dark_logo_url, EXCLUDED.dark_icon_url)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -662,7 +662,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, light_logo_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, light_logo_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -693,7 +693,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, dark_logo_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, dark_logo_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -724,7 +724,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, light_icon_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, light_icon_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -755,7 +755,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, dark_icon_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, dark_icon_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -786,7 +786,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, light_logo_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, light_logo_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -817,7 +817,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, dark_logo_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, dark_logo_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -848,7 +848,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, light_icon_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, light_icon_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -879,7 +879,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, dark_icon_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, dark_icon_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -910,7 +910,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, font_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, font_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -941,7 +941,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, font_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, font_url) = ($1, $2, $3) WHERE (id = $4) AND (state = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -972,7 +972,7 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies SET (change_date, sequence, light_logo_url, light_icon_url, dark_logo_url, dark_icon_url, font_url) = ($1, $2, $3, $4, $5, $6, $7) WHERE (id = $8) AND (state = $9) AND (instance_id = $10)",
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, light_logo_url, light_icon_url, dark_logo_url, dark_icon_url, font_url) = ($1, $2, $3, $4, $5, $6, $7) WHERE (id = $8) AND (state = $9) AND (instance_id = $10)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -990,6 +990,36 @@ func TestLabelPolicyProjection_reduces(t *testing.T) {
},
},
},
{
name: "org.reduceOwnerRemoved",
reduce: (&labelPolicyProjection{}).reduceOwnerRemoved,
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
org.AggregateType,
nil,
), org.OrgRemovedEventMapper),
},
want: wantReduce{
aggregateType: eventstore.AggregateType("org"),
sequence: 15,
previousSequence: 10,
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.label_policies2 SET (change_date, sequence, owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (resource_owner = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
},
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
+28 -1
View File
@@ -14,7 +14,7 @@ import (
)
const (
LockoutPolicyTable = "projections.lockout_policies"
LockoutPolicyTable = "projections.lockout_policies2"
LockoutPolicyIDCol = "id"
LockoutPolicyCreationDateCol = "creation_date"
@@ -26,6 +26,7 @@ const (
LockoutPolicyInstanceIDCol = "instance_id"
LockoutPolicyMaxPasswordAttemptsCol = "max_password_attempts"
LockoutPolicyShowLockOutFailuresCol = "show_failure"
LockoutPolicyOwnerRemovedCol = "owner_removed"
)
type lockoutPolicyProjection struct {
@@ -48,8 +49,10 @@ func newLockoutPolicyProjection(ctx context.Context, config crdb.StatementHandle
crdb.NewColumn(LockoutPolicyInstanceIDCol, crdb.ColumnTypeText),
crdb.NewColumn(LockoutPolicyMaxPasswordAttemptsCol, crdb.ColumnTypeInt64),
crdb.NewColumn(LockoutPolicyShowLockOutFailuresCol, crdb.ColumnTypeBool),
crdb.NewColumn(LockoutPolicyOwnerRemovedCol, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(LockoutPolicyInstanceIDCol, LockoutPolicyIDCol),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{LockoutPolicyOwnerRemovedCol})),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -73,6 +76,10 @@ func (p *lockoutPolicyProjection) reducers() []handler.AggregateReducer {
Event: org.LockoutPolicyRemovedEventType,
Reduce: p.reduceRemoved,
},
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOwnerRemoved,
},
},
},
{
@@ -165,3 +172,23 @@ func (p *lockoutPolicyProjection) reduceRemoved(event eventstore.Event) (*handle
handler.NewCond(LabelPolicyInstanceIDCol, event.Aggregate().InstanceID),
}), nil
}
func (p *lockoutPolicyProjection) reduceOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-IoW0x", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(LockoutPolicyChangeDateCol, e.CreationDate()),
handler.NewCol(LockoutPolicySequenceCol, e.Sequence()),
handler.NewCol(LockoutPolicyOwnerRemovedCol, true),
},
[]handler.Condition{
handler.NewCond(LockoutPolicyInstanceIDCol, e.Aggregate().InstanceID),
handler.NewCond(LockoutPolicyResourceOwnerCol, e.Aggregate().ID),
},
), nil
}
@@ -42,7 +42,7 @@ func TestLockoutPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.lockout_policies (creation_date, change_date, sequence, id, state, max_password_attempts, show_failure, is_default, resource_owner, instance_id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)",
expectedStmt: "INSERT INTO projections.lockout_policies2 (creation_date, change_date, sequence, id, state, max_password_attempts, show_failure, is_default, resource_owner, instance_id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)",
expectedArgs: []interface{}{
anyArg{},
anyArg{},
@@ -80,7 +80,7 @@ func TestLockoutPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.lockout_policies SET (change_date, sequence, max_password_attempts, show_failure) = ($1, $2, $3, $4) WHERE (id = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.lockout_policies2 SET (change_date, sequence, max_password_attempts, show_failure) = ($1, $2, $3, $4) WHERE (id = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -111,7 +111,7 @@ func TestLockoutPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.lockout_policies WHERE (id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.lockout_policies2 WHERE (id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -138,7 +138,7 @@ func TestLockoutPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.lockout_policies WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.lockout_policies2 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
@@ -167,7 +167,7 @@ func TestLockoutPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.lockout_policies (creation_date, change_date, sequence, id, state, max_password_attempts, show_failure, is_default, resource_owner, instance_id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)",
expectedStmt: "INSERT INTO projections.lockout_policies2 (creation_date, change_date, sequence, id, state, max_password_attempts, show_failure, is_default, resource_owner, instance_id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)",
expectedArgs: []interface{}{
anyArg{},
anyArg{},
@@ -205,7 +205,7 @@ func TestLockoutPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.lockout_policies SET (change_date, sequence, max_password_attempts, show_failure) = ($1, $2, $3, $4) WHERE (id = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.lockout_policies2 SET (change_date, sequence, max_password_attempts, show_failure) = ($1, $2, $3, $4) WHERE (id = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -219,6 +219,36 @@ func TestLockoutPolicyProjection_reduces(t *testing.T) {
},
},
},
{
name: "org.reduceOwnerRemoved",
reduce: (&lockoutPolicyProjection{}).reduceOwnerRemoved,
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
org.AggregateType,
nil,
), org.OrgRemovedEventMapper),
},
want: wantReduce{
aggregateType: eventstore.AggregateType("org"),
sequence: 15,
previousSequence: 10,
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.lockout_policies2 SET (change_date, sequence, owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (resource_owner = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
},
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
+183 -46
View File
@@ -2,7 +2,9 @@ package projection
import (
"context"
"fmt"
"strings"
sq "github.com/Masterminds/squirrel"
"github.com/zitadel/zitadel/internal/errors"
"github.com/zitadel/zitadel/internal/eventstore"
@@ -15,76 +17,160 @@ import (
)
const (
LoginNameProjectionTable = "projections.login_names"
LoginNameTableAlias = "login_names2"
LoginNameProjectionTable = "projections." + LoginNameTableAlias
LoginNameUserProjectionTable = LoginNameProjectionTable + "_" + loginNameUserSuffix
LoginNamePolicyProjectionTable = LoginNameProjectionTable + "_" + loginNamePolicySuffix
LoginNameDomainProjectionTable = LoginNameProjectionTable + "_" + loginNameDomainSuffix
LoginNameCol = "login_name"
LoginNameCol = "login_name"
LoginNameUserCol = "user_id"
LoginNameIsPrimaryCol = "is_primary"
LoginNameInstanceIDCol = "instance_id"
LoginNameOwnerRemovedUserCol = "user_owner_removed"
LoginNameOwnerRemovedPolicyCol = "policy_owner_removed"
LoginNameOwnerRemovedDomainCol = "domain_owner_removed"
usersAlias = "users"
policyCustomAlias = "policy_custom"
policyDefaultAlias = "policy_default"
policyUsersAlias = "policy_users"
domainsAlias = "domains"
domainAlias = "domain"
loginNameUserSuffix = "users"
LoginNameUserIDCol = "id"
LoginNameUserUserNameCol = "user_name"
LoginNameUserResourceOwnerCol = "resource_owner"
LoginNameUserInstanceIDCol = "instance_id"
LoginNameUserOwnerRemovedCol = "owner_removed"
loginNameDomainSuffix = "domains"
LoginNameDomainNameCol = "name"
LoginNameDomainIsPrimaryCol = "is_primary"
LoginNameDomainResourceOwnerCol = "resource_owner"
LoginNameDomainInstanceIDCol = "instance_id"
LoginNameDomainOwnerRemovedCol = "owner_removed"
loginNamePolicySuffix = "policies"
LoginNamePoliciesMustBeDomainCol = "must_be_domain"
LoginNamePoliciesIsDefaultCol = "is_default"
LoginNamePoliciesResourceOwnerCol = "resource_owner"
LoginNamePoliciesInstanceIDCol = "instance_id"
LoginNamePoliciesOwnerRemovedCol = "owner_removed"
)
var (
viewStmt = fmt.Sprintf("SELECT"+
" user_id"+
" , (CASE WHEN %[1]s THEN CONCAT(%[2]s, '@', domain) ELSE %[2]s END) AS login_name"+
" , COALESCE(%[3]s, true) AS %[3]s"+
" , %[4]s"+
" FROM ("+
" SELECT"+
" policy_users.user_id"+
" , policy_users.%[2]s"+
" , policy_users.%[5]s"+
" , policy_users.%[4]s"+
" , policy_users.%[1]s"+
" , domains.%[6]s AS domain"+
" , domains.%[3]s"+
" FROM ("+
" SELECT"+
" users.id as user_id"+
" , users.%[2]s"+
" , users.%[4]s"+
" , users.%[5]s"+
" , COALESCE(policy_custom.%[1]s, policy_default.%[1]s) AS %[1]s"+
" FROM %[7]s users"+
" LEFT JOIN %[8]s policy_custom on policy_custom.%[9]s = users.%[5]s AND policy_custom.%[10]s = users.%[4]s"+
" LEFT JOIN %[8]s policy_default on policy_default.%[11]s = true AND policy_default.%[10]s = users.%[4]s) policy_users"+
" LEFT JOIN %[12]s domains ON policy_users.%[1]s AND policy_users.%[5]s = domains.%[13]s AND policy_users.%[10]s = domains.%[14]s"+
") AS login_names;",
LoginNamePoliciesMustBeDomainCol,
LoginNameUserUserNameCol,
LoginNameDomainIsPrimaryCol,
LoginNameUserInstanceIDCol,
LoginNameUserResourceOwnerCol,
LoginNameDomainNameCol,
LoginNameUserProjectionTable,
LoginNamePolicyProjectionTable,
LoginNamePoliciesResourceOwnerCol,
LoginNamePoliciesInstanceIDCol,
LoginNamePoliciesIsDefaultCol,
LoginNameDomainProjectionTable,
LoginNameDomainResourceOwnerCol,
LoginNameDomainInstanceIDCol,
)
policyUsers = sq.Select(
alias(
col(usersAlias, LoginNameUserIDCol),
LoginNameUserCol,
),
col(usersAlias, LoginNameUserUserNameCol),
col(usersAlias, LoginNameUserInstanceIDCol),
col(usersAlias, LoginNameUserResourceOwnerCol),
alias(
coalesce(col(policyCustomAlias, LoginNamePoliciesMustBeDomainCol), col(policyDefaultAlias, LoginNamePoliciesMustBeDomainCol)),
LoginNamePoliciesMustBeDomainCol,
),
alias(col(usersAlias, LoginNameUserOwnerRemovedCol),
LoginNameOwnerRemovedUserCol),
alias(coalesce(col(policyCustomAlias, LoginNamePoliciesOwnerRemovedCol), "false"),
LoginNameOwnerRemovedPolicyCol),
).From(alias(LoginNameUserProjectionTable, usersAlias)).
LeftJoin(
leftJoin(LoginNamePolicyProjectionTable, policyCustomAlias,
eq(col(policyCustomAlias, LoginNamePoliciesResourceOwnerCol), col(usersAlias, LoginNameUserResourceOwnerCol)),
eq(col(policyCustomAlias, LoginNamePoliciesInstanceIDCol), col(usersAlias, LoginNameUserInstanceIDCol)),
),
).
LeftJoin(
leftJoin(LoginNamePolicyProjectionTable, policyDefaultAlias,
eq(col(policyDefaultAlias, LoginNamePoliciesIsDefaultCol), "true"),
eq(col(policyDefaultAlias, LoginNamePoliciesInstanceIDCol), col(usersAlias, LoginNameUserInstanceIDCol)),
),
)
loginNamesTable = sq.Select(
col(policyUsersAlias, LoginNameUserCol),
col(policyUsersAlias, LoginNameUserUserNameCol),
col(policyUsersAlias, LoginNameUserResourceOwnerCol),
alias(col(policyUsersAlias, LoginNameUserInstanceIDCol),
LoginNameInstanceIDCol),
col(policyUsersAlias, LoginNamePoliciesMustBeDomainCol),
alias(col(domainsAlias, LoginNameDomainNameCol),
domainAlias),
col(domainsAlias, LoginNameDomainIsPrimaryCol),
col(policyUsersAlias, LoginNameOwnerRemovedUserCol),
col(policyUsersAlias, LoginNameOwnerRemovedPolicyCol),
alias(coalesce(col(domainsAlias, LoginNameDomainOwnerRemovedCol), "false"),
LoginNameOwnerRemovedDomainCol),
).FromSelect(policyUsers, policyUsersAlias).
LeftJoin(
leftJoin(LoginNameDomainProjectionTable, domainsAlias,
col(policyUsersAlias, LoginNamePoliciesMustBeDomainCol),
eq(col(policyUsersAlias, LoginNameUserResourceOwnerCol), col(domainsAlias, LoginNameDomainResourceOwnerCol)),
eq(col(policyUsersAlias, LoginNamePoliciesInstanceIDCol), col(domainsAlias, LoginNameDomainInstanceIDCol)),
),
)
viewStmt, _ = sq.Select(
LoginNameUserCol,
alias(
whenThenElse(
LoginNamePoliciesMustBeDomainCol,
concat(LoginNameUserUserNameCol, "'@'", domainAlias),
LoginNameUserUserNameCol),
LoginNameCol),
alias(coalesce(LoginNameDomainIsPrimaryCol, "true"),
LoginNameIsPrimaryCol),
LoginNameInstanceIDCol,
LoginNameOwnerRemovedUserCol,
LoginNameOwnerRemovedPolicyCol,
LoginNameOwnerRemovedDomainCol,
).FromSelect(loginNamesTable, LoginNameTableAlias).MustSql()
)
func col(table, name string) string {
return table + "." + name
}
func alias(col, alias string) string {
return col + " AS " + alias
}
func coalesce(values ...string) string {
str := "COALESCE("
for i, value := range values {
if i > 0 {
str += ", "
}
str += value
}
str += ")"
return str
}
func eq(first, second string) string {
return first + " = " + second
}
func leftJoin(table, alias, on string, and ...string) string {
st := table + " " + alias + " ON " + on
for _, a := range and {
st += " AND " + a
}
return st
}
func concat(strs ...string) string {
return "CONCAT(" + strings.Join(strs, ", ") + ")"
}
func whenThenElse(when, then, el string) string {
return "(CASE WHEN " + when + " THEN " + then + " ELSE " + el + " END)"
}
type loginNameProjection struct {
crdb.StatementHandler
}
@@ -100,29 +186,35 @@ func newLoginNameProjection(ctx context.Context, config crdb.StatementHandlerCon
crdb.NewColumn(LoginNameUserUserNameCol, crdb.ColumnTypeText),
crdb.NewColumn(LoginNameUserResourceOwnerCol, crdb.ColumnTypeText),
crdb.NewColumn(LoginNameUserInstanceIDCol, crdb.ColumnTypeText),
crdb.NewColumn(LoginNameUserOwnerRemovedCol, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(LoginNameUserInstanceIDCol, LoginNameUserIDCol),
loginNameUserSuffix,
crdb.WithIndex(crdb.NewIndex("ro_idx", []string{LoginNameUserResourceOwnerCol})),
crdb.WithIndex(crdb.NewIndex("resource_owner", []string{LoginNameUserResourceOwnerCol})),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{LoginNameUserOwnerRemovedCol})),
),
crdb.NewSuffixedTable([]*crdb.Column{
crdb.NewColumn(LoginNameDomainNameCol, crdb.ColumnTypeText),
crdb.NewColumn(LoginNameDomainIsPrimaryCol, crdb.ColumnTypeBool, crdb.Default(false)),
crdb.NewColumn(LoginNameDomainResourceOwnerCol, crdb.ColumnTypeText),
crdb.NewColumn(LoginNameDomainInstanceIDCol, crdb.ColumnTypeText),
crdb.NewColumn(LoginNameDomainOwnerRemovedCol, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(LoginNameDomainInstanceIDCol, LoginNameDomainResourceOwnerCol, LoginNameDomainNameCol),
loginNameDomainSuffix,
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{LoginNameDomainOwnerRemovedCol})),
),
crdb.NewSuffixedTable([]*crdb.Column{
crdb.NewColumn(LoginNamePoliciesMustBeDomainCol, crdb.ColumnTypeBool),
crdb.NewColumn(LoginNamePoliciesIsDefaultCol, crdb.ColumnTypeBool),
crdb.NewColumn(LoginNamePoliciesResourceOwnerCol, crdb.ColumnTypeText),
crdb.NewColumn(LoginNamePoliciesInstanceIDCol, crdb.ColumnTypeText),
crdb.NewColumn(LoginNamePoliciesOwnerRemovedCol, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(LoginNamePoliciesInstanceIDCol, LoginNamePoliciesResourceOwnerCol),
loginNamePolicySuffix,
crdb.WithIndex(crdb.NewIndex("is_default_idx", []string{LoginNamePoliciesResourceOwnerCol, LoginNamePoliciesIsDefaultCol})),
crdb.WithIndex(crdb.NewIndex("is_default", []string{LoginNamePoliciesResourceOwnerCol, LoginNamePoliciesIsDefaultCol})),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{LoginNamePoliciesOwnerRemovedCol})),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -198,6 +290,10 @@ func (p *loginNameProjection) reducers() []handler.AggregateReducer {
Event: org.OrgDomainVerifiedEventType,
Reduce: p.reduceDomainVerified,
},
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOwnerRemoved,
},
},
},
{
@@ -469,3 +565,44 @@ func (p *loginNameProjection) reduceInstanceRemoved(event eventstore.Event) (*ha
),
), nil
}
func (p *loginNameProjection) reduceOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "HANDL-px02mo", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewMultiStatement(
event,
crdb.AddUpdateStatement(
[]handler.Column{
handler.NewCol(LoginNameDomainOwnerRemovedCol, true),
},
[]handler.Condition{
handler.NewCond(LoginNameDomainInstanceIDCol, e.Aggregate().InstanceID),
handler.NewCond(LoginNameDomainResourceOwnerCol, e.Aggregate().ID),
},
crdb.WithTableSuffix(loginNameDomainSuffix),
),
crdb.AddUpdateStatement(
[]handler.Column{
handler.NewCol(LoginNamePoliciesOwnerRemovedCol, true),
},
[]handler.Condition{
handler.NewCond(LoginNamePoliciesInstanceIDCol, e.Aggregate().InstanceID),
handler.NewCond(LoginNamePoliciesResourceOwnerCol, e.Aggregate().ID),
},
crdb.WithTableSuffix(loginNamePolicySuffix),
),
crdb.AddUpdateStatement(
[]handler.Column{
handler.NewCol(LoginNameUserOwnerRemovedCol, true),
},
[]handler.Condition{
handler.NewCond(LoginNameUserInstanceIDCol, e.Aggregate().InstanceID),
handler.NewCond(LoginNameUserResourceOwnerCol, e.Aggregate().ID),
},
crdb.WithTableSuffix(loginNameUserSuffix),
),
), nil
}
+62 -18
View File
@@ -41,7 +41,7 @@ func TestLoginNameProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.login_names_users (id, user_name, resource_owner, instance_id) VALUES ($1, $2, $3, $4)",
expectedStmt: "INSERT INTO projections.login_names2_users (id, user_name, resource_owner, instance_id) VALUES ($1, $2, $3, $4)",
expectedArgs: []interface{}{
"agg-id",
"human-added",
@@ -72,7 +72,7 @@ func TestLoginNameProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.login_names_users (id, user_name, resource_owner, instance_id) VALUES ($1, $2, $3, $4)",
expectedStmt: "INSERT INTO projections.login_names2_users (id, user_name, resource_owner, instance_id) VALUES ($1, $2, $3, $4)",
expectedArgs: []interface{}{
"agg-id",
"human-registered",
@@ -103,7 +103,7 @@ func TestLoginNameProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.login_names_users (id, user_name, resource_owner, instance_id) VALUES ($1, $2, $3, $4)",
expectedStmt: "INSERT INTO projections.login_names2_users (id, user_name, resource_owner, instance_id) VALUES ($1, $2, $3, $4)",
expectedArgs: []interface{}{
"agg-id",
"machine-added",
@@ -132,7 +132,7 @@ func TestLoginNameProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.login_names_users WHERE (id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.login_names2_users WHERE (id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -161,7 +161,7 @@ func TestLoginNameProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.login_names_users SET user_name = $1 WHERE (id = $2) AND (instance_id = $3)",
expectedStmt: "UPDATE projections.login_names2_users SET user_name = $1 WHERE (id = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
"changed",
"agg-id",
@@ -191,7 +191,7 @@ func TestLoginNameProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.login_names_users SET user_name = $1 WHERE (id = $2) AND (instance_id = $3)",
expectedStmt: "UPDATE projections.login_names2_users SET user_name = $1 WHERE (id = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
"claimed",
"agg-id",
@@ -221,7 +221,7 @@ func TestLoginNameProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.login_names_policies (must_be_domain, is_default, resource_owner, instance_id) VALUES ($1, $2, $3, $4)",
expectedStmt: "INSERT INTO projections.login_names2_policies (must_be_domain, is_default, resource_owner, instance_id) VALUES ($1, $2, $3, $4)",
expectedArgs: []interface{}{
true,
false,
@@ -252,7 +252,7 @@ func TestLoginNameProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.login_names_policies SET must_be_domain = $1 WHERE (resource_owner = $2) AND (instance_id = $3)",
expectedStmt: "UPDATE projections.login_names2_policies SET must_be_domain = $1 WHERE (resource_owner = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
false,
"ro-id",
@@ -299,7 +299,7 @@ func TestLoginNameProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.login_names_policies WHERE (resource_owner = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.login_names2_policies WHERE (resource_owner = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"ro-id",
"instance-id",
@@ -328,7 +328,7 @@ func TestLoginNameProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.login_names_domains (name, resource_owner, instance_id) VALUES ($1, $2, $3)",
expectedStmt: "INSERT INTO projections.login_names2_domains (name, resource_owner, instance_id) VALUES ($1, $2, $3)",
expectedArgs: []interface{}{
"verified",
"ro-id",
@@ -358,7 +358,7 @@ func TestLoginNameProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.login_names_domains WHERE (name = $1) AND (resource_owner = $2) AND (instance_id = $3)",
expectedStmt: "DELETE FROM projections.login_names2_domains WHERE (name = $1) AND (resource_owner = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
"remove",
"ro-id",
@@ -388,7 +388,7 @@ func TestLoginNameProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.login_names_domains SET is_primary = $1 WHERE (resource_owner = $2) AND (is_primary = $3) AND (instance_id = $4)",
expectedStmt: "UPDATE projections.login_names2_domains SET is_primary = $1 WHERE (resource_owner = $2) AND (is_primary = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
false,
"ro-id",
@@ -397,7 +397,7 @@ func TestLoginNameProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "UPDATE projections.login_names_domains SET is_primary = $1 WHERE (name = $2) AND (resource_owner = $3) AND (instance_id = $4)",
expectedStmt: "UPDATE projections.login_names2_domains SET is_primary = $1 WHERE (name = $2) AND (resource_owner = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
true,
"primary",
@@ -428,7 +428,7 @@ func TestLoginNameProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.login_names_policies (must_be_domain, is_default, resource_owner, instance_id) VALUES ($1, $2, $3, $4)",
expectedStmt: "INSERT INTO projections.login_names2_policies (must_be_domain, is_default, resource_owner, instance_id) VALUES ($1, $2, $3, $4)",
expectedArgs: []interface{}{
true,
true,
@@ -459,7 +459,7 @@ func TestLoginNameProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.login_names_policies SET must_be_domain = $1 WHERE (resource_owner = $2) AND (instance_id = $3)",
expectedStmt: "UPDATE projections.login_names2_policies SET must_be_domain = $1 WHERE (resource_owner = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
false,
"ro-id",
@@ -506,19 +506,19 @@ func TestLoginNameProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.login_names_domains WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.login_names2_domains WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
},
{
expectedStmt: "DELETE FROM projections.login_names_policies WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.login_names2_policies WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
},
{
expectedStmt: "DELETE FROM projections.login_names_users WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.login_names2_users WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
@@ -527,6 +527,50 @@ func TestLoginNameProjection_reduces(t *testing.T) {
},
},
},
{
name: "instance.reduceOwnerRemoved",
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
org.AggregateType,
[]byte(`{"name": "Name"}`),
), org.OrgRemovedEventMapper),
},
reduce: (&loginNameProjection{}).reduceOwnerRemoved,
want: wantReduce{
aggregateType: eventstore.AggregateType("org"),
sequence: 15,
previousSequence: 10,
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.login_names2_domains SET owner_removed = $1 WHERE (instance_id = $2) AND (resource_owner = $3)",
expectedArgs: []interface{}{
true,
"instance-id",
"agg-id",
},
},
{
expectedStmt: "UPDATE projections.login_names2_policies SET owner_removed = $1 WHERE (instance_id = $2) AND (resource_owner = $3)",
expectedArgs: []interface{}{
true,
"instance-id",
"agg-id",
},
},
{
expectedStmt: "UPDATE projections.login_names2_users SET owner_removed = $1 WHERE (instance_id = $2) AND (resource_owner = $3)",
expectedArgs: []interface{}{
true,
"instance-id",
"agg-id",
},
},
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
+28 -1
View File
@@ -13,7 +13,7 @@ import (
)
const (
LoginPolicyTable = "projections.login_policies3"
LoginPolicyTable = "projections.login_policies4"
LoginPolicyIDCol = "aggregate_id"
LoginPolicyInstanceIDCol = "instance_id"
@@ -39,6 +39,7 @@ const (
MFAInitSkipLifetimeCol = "mfa_init_skip_lifetime"
SecondFactorCheckLifetimeCol = "second_factor_check_lifetime"
MultiFactorCheckLifetimeCol = "multi_factor_check_lifetime"
LoginPolicyOwnerRemovedCol = "owner_removed"
)
type loginPolicyProjection struct {
@@ -75,8 +76,10 @@ func newLoginPolicyProjection(ctx context.Context, config crdb.StatementHandlerC
crdb.NewColumn(MFAInitSkipLifetimeCol, crdb.ColumnTypeInt64),
crdb.NewColumn(SecondFactorCheckLifetimeCol, crdb.ColumnTypeInt64),
crdb.NewColumn(MultiFactorCheckLifetimeCol, crdb.ColumnTypeInt64),
crdb.NewColumn(LoginPolicyOwnerRemovedCol, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(LoginPolicyInstanceIDCol, LoginPolicyIDCol),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{LoginPolicyOwnerRemovedCol})),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -116,6 +119,10 @@ func (p *loginPolicyProjection) reducers() []handler.AggregateReducer {
Event: org.LoginPolicySecondFactorRemovedEventType,
Reduce: p.reduce2FARemoved,
},
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOwnerRemoved,
},
},
},
{
@@ -381,3 +388,23 @@ func (p *loginPolicyProjection) reduce2FARemoved(event eventstore.Event) (*handl
},
), nil
}
func (p *loginPolicyProjection) reduceOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-B8NZW", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(LoginPolicyChangeDateCol, e.CreationDate()),
handler.NewCol(LoginPolicySequenceCol, e.Sequence()),
handler.NewCol(LoginPolicyOwnerRemovedCol, true),
},
[]handler.Condition{
handler.NewCond(LoginPolicyInstanceIDCol, e.Aggregate().InstanceID),
handler.NewCond(LoginPolicyIDCol, e.Aggregate().ID),
},
), nil
}
+44 -14
View File
@@ -57,7 +57,7 @@ func TestLoginPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.login_policies3 (aggregate_id, instance_id, creation_date, change_date, sequence, allow_register, allow_username_password, allow_external_idps, force_mfa, passwordless_type, is_default, hide_password_reset, ignore_unknown_usernames, allow_domain_discovery, disable_login_with_email, disable_login_with_phone, default_redirect_uri, password_check_lifetime, external_login_check_lifetime, mfa_init_skip_lifetime, second_factor_check_lifetime, multi_factor_check_lifetime) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22)",
expectedStmt: "INSERT INTO projections.login_policies4 (aggregate_id, instance_id, creation_date, change_date, sequence, allow_register, allow_username_password, allow_external_idps, force_mfa, passwordless_type, is_default, hide_password_reset, ignore_unknown_usernames, allow_domain_discovery, disable_login_with_email, disable_login_with_phone, default_redirect_uri, password_check_lifetime, external_login_check_lifetime, mfa_init_skip_lifetime, second_factor_check_lifetime, multi_factor_check_lifetime) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -121,7 +121,7 @@ func TestLoginPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.login_policies3 SET (change_date, sequence, allow_register, allow_username_password, allow_external_idps, force_mfa, passwordless_type, hide_password_reset, ignore_unknown_usernames, allow_domain_discovery, disable_login_with_email, disable_login_with_phone, default_redirect_uri, password_check_lifetime, external_login_check_lifetime, mfa_init_skip_lifetime, second_factor_check_lifetime, multi_factor_check_lifetime) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18) WHERE (aggregate_id = $19) AND (instance_id = $20)",
expectedStmt: "UPDATE projections.login_policies4 SET (change_date, sequence, allow_register, allow_username_password, allow_external_idps, force_mfa, passwordless_type, hide_password_reset, ignore_unknown_usernames, allow_domain_discovery, disable_login_with_email, disable_login_with_phone, default_redirect_uri, password_check_lifetime, external_login_check_lifetime, mfa_init_skip_lifetime, second_factor_check_lifetime, multi_factor_check_lifetime) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18) WHERE (aggregate_id = $19) AND (instance_id = $20)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -168,7 +168,7 @@ func TestLoginPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.login_policies3 SET (change_date, sequence, multi_factors) = ($1, $2, array_append(multi_factors, $3)) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.login_policies4 SET (change_date, sequence, multi_factors) = ($1, $2, array_append(multi_factors, $3)) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -200,7 +200,7 @@ func TestLoginPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.login_policies3 SET (change_date, sequence, multi_factors) = ($1, $2, array_remove(multi_factors, $3)) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.login_policies4 SET (change_date, sequence, multi_factors) = ($1, $2, array_remove(multi_factors, $3)) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -230,7 +230,7 @@ func TestLoginPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.login_policies3 WHERE (aggregate_id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.login_policies4 WHERE (aggregate_id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -259,7 +259,7 @@ func TestLoginPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.login_policies3 SET (change_date, sequence, second_factors) = ($1, $2, array_append(second_factors, $3)) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.login_policies4 SET (change_date, sequence, second_factors) = ($1, $2, array_append(second_factors, $3)) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -291,7 +291,7 @@ func TestLoginPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.login_policies3 SET (change_date, sequence, second_factors) = ($1, $2, array_remove(second_factors, $3)) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.login_policies4 SET (change_date, sequence, second_factors) = ($1, $2, array_remove(second_factors, $3)) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -338,7 +338,7 @@ func TestLoginPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.login_policies3 (aggregate_id, instance_id, creation_date, change_date, sequence, allow_register, allow_username_password, allow_external_idps, force_mfa, passwordless_type, is_default, hide_password_reset, ignore_unknown_usernames, allow_domain_discovery, disable_login_with_email, disable_login_with_phone, default_redirect_uri, password_check_lifetime, external_login_check_lifetime, mfa_init_skip_lifetime, second_factor_check_lifetime, multi_factor_check_lifetime) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22)",
expectedStmt: "INSERT INTO projections.login_policies4 (aggregate_id, instance_id, creation_date, change_date, sequence, allow_register, allow_username_password, allow_external_idps, force_mfa, passwordless_type, is_default, hide_password_reset, ignore_unknown_usernames, allow_domain_discovery, disable_login_with_email, disable_login_with_phone, default_redirect_uri, password_check_lifetime, external_login_check_lifetime, mfa_init_skip_lifetime, second_factor_check_lifetime, multi_factor_check_lifetime) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -397,7 +397,7 @@ func TestLoginPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.login_policies3 SET (change_date, sequence, allow_register, allow_username_password, allow_external_idps, force_mfa, passwordless_type, hide_password_reset, ignore_unknown_usernames, allow_domain_discovery, disable_login_with_email, disable_login_with_phone, default_redirect_uri) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13) WHERE (aggregate_id = $14) AND (instance_id = $15)",
expectedStmt: "UPDATE projections.login_policies4 SET (change_date, sequence, allow_register, allow_username_password, allow_external_idps, force_mfa, passwordless_type, hide_password_reset, ignore_unknown_usernames, allow_domain_discovery, disable_login_with_email, disable_login_with_phone, default_redirect_uri) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13) WHERE (aggregate_id = $14) AND (instance_id = $15)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -439,7 +439,7 @@ func TestLoginPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.login_policies3 SET (change_date, sequence, multi_factors) = ($1, $2, array_append(multi_factors, $3)) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.login_policies4 SET (change_date, sequence, multi_factors) = ($1, $2, array_append(multi_factors, $3)) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -471,7 +471,7 @@ func TestLoginPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.login_policies3 SET (change_date, sequence, multi_factors) = ($1, $2, array_remove(multi_factors, $3)) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.login_policies4 SET (change_date, sequence, multi_factors) = ($1, $2, array_remove(multi_factors, $3)) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -503,7 +503,7 @@ func TestLoginPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.login_policies3 SET (change_date, sequence, second_factors) = ($1, $2, array_append(second_factors, $3)) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.login_policies4 SET (change_date, sequence, second_factors) = ($1, $2, array_append(second_factors, $3)) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -535,7 +535,7 @@ func TestLoginPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.login_policies3 SET (change_date, sequence, second_factors) = ($1, $2, array_remove(second_factors, $3)) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.login_policies4 SET (change_date, sequence, second_factors) = ($1, $2, array_remove(second_factors, $3)) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -548,6 +548,36 @@ func TestLoginPolicyProjection_reduces(t *testing.T) {
},
},
},
{
name: "org.reduceOwnerRemoved",
reduce: (&loginPolicyProjection{}).reduceOwnerRemoved,
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
org.AggregateType,
nil,
), org.OrgRemovedEventMapper),
},
want: wantReduce{
aggregateType: eventstore.AggregateType("org"),
sequence: 15,
previousSequence: 10,
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.login_policies4 SET (change_date, sequence, owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (aggregate_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
},
},
},
},
},
{
name: "instance reduceInstanceRemoved",
args: args{
@@ -565,7 +595,7 @@ func TestLoginPolicyProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.login_policies3 WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.login_policies4 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
+28 -1
View File
@@ -14,7 +14,7 @@ import (
)
const (
MailTemplateTable = "projections.mail_templates"
MailTemplateTable = "projections.mail_templates2"
MailTemplateAggregateIDCol = "aggregate_id"
MailTemplateInstanceIDCol = "instance_id"
@@ -24,6 +24,7 @@ const (
MailTemplateStateCol = "state"
MailTemplateIsDefaultCol = "is_default"
MailTemplateTemplateCol = "template"
MailTemplateOwnerRemovedCol = "owner_removed"
)
type mailTemplateProjection struct {
@@ -44,8 +45,10 @@ func newMailTemplateProjection(ctx context.Context, config crdb.StatementHandler
crdb.NewColumn(MailTemplateStateCol, crdb.ColumnTypeEnum),
crdb.NewColumn(MailTemplateIsDefaultCol, crdb.ColumnTypeBool, crdb.Default(false)),
crdb.NewColumn(MailTemplateTemplateCol, crdb.ColumnTypeBytes),
crdb.NewColumn(MailTemplateOwnerRemovedCol, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(MailTemplateInstanceIDCol, MailTemplateAggregateIDCol),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{MailTemplateOwnerRemovedCol})),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -69,6 +72,10 @@ func (p *mailTemplateProjection) reducers() []handler.AggregateReducer {
Event: org.MailTemplateRemovedEventType,
Reduce: p.reduceRemoved,
},
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOwnerRemoved,
},
},
},
{
@@ -156,3 +163,23 @@ func (p *mailTemplateProjection) reduceRemoved(event eventstore.Event) (*handler
handler.NewCond(MailTemplateInstanceIDCol, policyEvent.Aggregate().InstanceID),
}), nil
}
func (p *mailTemplateProjection) reduceOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-CThXR", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(MailTemplateChangeDateCol, e.CreationDate()),
handler.NewCol(MailTemplateSequenceCol, e.Sequence()),
handler.NewCol(MailTemplateOwnerRemovedCol, true),
},
[]handler.Condition{
handler.NewCond(MailTemplateInstanceIDCol, e.Aggregate().InstanceID),
handler.NewCond(MailTemplateAggregateIDCol, e.Aggregate().ID),
},
), nil
}
+42 -12
View File
@@ -23,7 +23,7 @@ func TestMailTemplateProjection_reduces(t *testing.T) {
want wantReduce
}{
{
name: "org reduceAdded",
name: "org.reduceAdded",
args: args{
event: getEvent(testEvent(
repository.EventType(org.MailTemplateAddedEventType),
@@ -41,7 +41,7 @@ func TestMailTemplateProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.mail_templates (aggregate_id, instance_id, creation_date, change_date, sequence, state, is_default, template) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
expectedStmt: "INSERT INTO projections.mail_templates2 (aggregate_id, instance_id, creation_date, change_date, sequence, state, is_default, template) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -58,7 +58,7 @@ func TestMailTemplateProjection_reduces(t *testing.T) {
},
},
{
name: "org reduceChanged",
name: "org.reduceChanged",
reduce: (&mailTemplateProjection{}).reduceChanged,
args: args{
event: getEvent(testEvent(
@@ -76,7 +76,7 @@ func TestMailTemplateProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.mail_templates SET (change_date, sequence, template) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.mail_templates2 SET (change_date, sequence, template) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -90,7 +90,7 @@ func TestMailTemplateProjection_reduces(t *testing.T) {
},
},
{
name: "org reduceRemoved",
name: "org.reduceRemoved",
reduce: (&mailTemplateProjection{}).reduceRemoved,
args: args{
event: getEvent(testEvent(
@@ -106,7 +106,7 @@ func TestMailTemplateProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.mail_templates WHERE (aggregate_id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.mail_templates2 WHERE (aggregate_id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -117,7 +117,7 @@ func TestMailTemplateProjection_reduces(t *testing.T) {
},
},
{
name: "instance reduceInstanceRemoved",
name: "instance.reduceInstanceRemoved",
args: args{
event: getEvent(testEvent(
repository.EventType(instance.InstanceRemovedEventType),
@@ -133,7 +133,7 @@ func TestMailTemplateProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.mail_templates WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.mail_templates2 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
@@ -143,7 +143,7 @@ func TestMailTemplateProjection_reduces(t *testing.T) {
},
},
{
name: "instance reduceAdded",
name: "instance.reduceAdded",
reduce: (&mailTemplateProjection{}).reduceAdded,
args: args{
event: getEvent(testEvent(
@@ -161,7 +161,7 @@ func TestMailTemplateProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.mail_templates (aggregate_id, instance_id, creation_date, change_date, sequence, state, is_default, template) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
expectedStmt: "INSERT INTO projections.mail_templates2 (aggregate_id, instance_id, creation_date, change_date, sequence, state, is_default, template) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -178,7 +178,7 @@ func TestMailTemplateProjection_reduces(t *testing.T) {
},
},
{
name: "instance reduceChanged",
name: "instance.reduceChanged",
reduce: (&mailTemplateProjection{}).reduceChanged,
args: args{
event: getEvent(testEvent(
@@ -196,7 +196,7 @@ func TestMailTemplateProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.mail_templates SET (change_date, sequence, template) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedStmt: "UPDATE projections.mail_templates2 SET (change_date, sequence, template) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (instance_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -209,6 +209,36 @@ func TestMailTemplateProjection_reduces(t *testing.T) {
},
},
},
{
name: "org.reduceOwnerRemoved",
reduce: (&mailTemplateProjection{}).reduceOwnerRemoved,
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
org.AggregateType,
nil,
), org.OrgRemovedEventMapper),
},
want: wantReduce{
aggregateType: eventstore.AggregateType("org"),
sequence: 15,
previousSequence: 10,
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.mail_templates2 SET (change_date, sequence, owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (aggregate_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
},
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
+61
View File
@@ -0,0 +1,61 @@
package projection
import (
"database/sql"
"testing"
"time"
"github.com/zitadel/zitadel/internal/eventstore"
"github.com/zitadel/zitadel/internal/eventstore/repository"
"github.com/zitadel/zitadel/internal/eventstore/repository/mock"
action_repo "github.com/zitadel/zitadel/internal/repository/action"
iam_repo "github.com/zitadel/zitadel/internal/repository/instance"
key_repo "github.com/zitadel/zitadel/internal/repository/keypair"
"github.com/zitadel/zitadel/internal/repository/org"
proj_repo "github.com/zitadel/zitadel/internal/repository/project"
usr_repo "github.com/zitadel/zitadel/internal/repository/user"
"github.com/zitadel/zitadel/internal/repository/usergrant"
)
type expect func(mockRepository *mock.MockRepository)
func eventstoreExpect(t *testing.T, expects ...expect) *eventstore.Eventstore {
m := mock.NewRepo(t)
for _, e := range expects {
e(m)
}
es := eventstore.NewEventstore(m)
iam_repo.RegisterEventMappers(es)
org.RegisterEventMappers(es)
usr_repo.RegisterEventMappers(es)
proj_repo.RegisterEventMappers(es)
usergrant.RegisterEventMappers(es)
key_repo.RegisterEventMappers(es)
action_repo.RegisterEventMappers(es)
return es
}
func expectFilter(events ...*repository.Event) expect {
return func(m *mock.MockRepository) {
m.ExpectFilterEvents(events...)
}
}
func eventFromEventPusher(event eventstore.Command) *repository.Event {
data, _ := eventstore.EventData(event)
return &repository.Event{
ID: "",
Sequence: 0,
PreviousAggregateSequence: 0,
PreviousAggregateTypeSequence: 0,
CreationDate: time.Time{},
Type: repository.EventType(event.Type()),
Data: data,
EditorService: event.EditorService(),
EditorUser: event.EditorUser(),
Version: repository.Version(event.Aggregate().Version),
AggregateID: event.Aggregate().ID,
AggregateType: repository.AggregateType(event.Aggregate().Type),
ResourceOwner: sql.NullString{String: event.Aggregate().ResourceOwner, Valid: event.Aggregate().ResourceOwner != ""},
}
}
+77 -3
View File
@@ -1,6 +1,9 @@
package projection
import (
"context"
"github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/database"
"github.com/zitadel/zitadel/internal/eventstore"
"github.com/zitadel/zitadel/internal/eventstore/handler"
@@ -9,14 +12,17 @@ import (
)
const (
MemberUserIDCol = "user_id"
MemberRolesCol = "roles"
MemberUserIDCol = "user_id"
MemberRolesCol = "roles"
MemberUserResourceOwner = "user_resource_owner"
MemberUserOwnerRemoved = "user_owner_removed"
MemberCreationDate = "creation_date"
MemberChangeDate = "change_date"
MemberSequence = "sequence"
MemberResourceOwner = "resource_owner"
MemberInstanceID = "instance_id"
MemberOwnerRemoved = "owner_removed"
)
var (
@@ -24,10 +30,13 @@ var (
crdb.NewColumn(MemberCreationDate, crdb.ColumnTypeTimestamp),
crdb.NewColumn(MemberChangeDate, crdb.ColumnTypeTimestamp),
crdb.NewColumn(MemberUserIDCol, crdb.ColumnTypeText),
crdb.NewColumn(MemberUserResourceOwner, crdb.ColumnTypeText),
crdb.NewColumn(MemberUserOwnerRemoved, crdb.ColumnTypeBool, crdb.Default(false)),
crdb.NewColumn(MemberRolesCol, crdb.ColumnTypeTextArray, crdb.Nullable()),
crdb.NewColumn(MemberSequence, crdb.ColumnTypeInt64),
crdb.NewColumn(MemberResourceOwner, crdb.ColumnTypeText),
crdb.NewColumn(MemberInstanceID, crdb.ColumnTypeText),
crdb.NewColumn(MemberOwnerRemoved, crdb.ColumnTypeBool, crdb.Default(false)),
}
)
@@ -52,16 +61,19 @@ func withMemberCond(cond string, value interface{}) reduceMemberOpt {
}
}
func reduceMemberAdded(e member.MemberAddedEvent, opts ...reduceMemberOpt) (*handler.Statement, error) {
func reduceMemberAdded(e member.MemberAddedEvent, userResourceOwner string, opts ...reduceMemberOpt) (*handler.Statement, error) {
config := reduceMemberConfig{
cols: []handler.Column{
handler.NewCol(MemberUserIDCol, e.UserID),
handler.NewCol(MemberUserResourceOwner, userResourceOwner),
handler.NewCol(MemberUserOwnerRemoved, false),
handler.NewCol(MemberRolesCol, database.StringArray(e.Roles)),
handler.NewCol(MemberCreationDate, e.CreationDate()),
handler.NewCol(MemberChangeDate, e.CreationDate()),
handler.NewCol(MemberSequence, e.Sequence()),
handler.NewCol(MemberResourceOwner, e.Aggregate().ResourceOwner),
handler.NewCol(MemberInstanceID, e.Aggregate().InstanceID),
handler.NewCol(MemberOwnerRemoved, false),
}}
for _, opt := range opts {
@@ -115,3 +127,65 @@ func reduceMemberRemoved(e eventstore.Event, opts ...reduceMemberOpt) (*handler.
}
return crdb.NewDeleteStatement(e, config.conds), nil
}
func multiReduceMemberOwnerRemoved(e eventstore.Event, opts ...reduceMemberOpt) func(eventstore.Event) crdb.Exec {
config := reduceMemberConfig{
conds: []handler.Condition{
handler.NewCond(MemberInstanceID, e.Aggregate().InstanceID),
handler.NewCond(MemberResourceOwner, e.Aggregate().ID),
},
}
for _, opt := range opts {
config = opt(config)
}
return crdb.AddUpdateStatement(
[]handler.Column{
handler.NewCol(MemberChangeDate, e.CreationDate()),
handler.NewCol(MemberSequence, e.Sequence()),
handler.NewCol(MemberOwnerRemoved, true),
},
config.conds,
)
}
func memberUserOwnerRemovedConds(e eventstore.Event, opts ...reduceMemberOpt) []handler.Condition {
config := reduceMemberConfig{
conds: []handler.Condition{
handler.NewCond(MemberInstanceID, e.Aggregate().InstanceID),
handler.NewCond(MemberUserResourceOwner, e.Aggregate().ID),
},
}
for _, opt := range opts {
config = opt(config)
}
return config.conds
}
func memberUserOwnerRemovedCols(e eventstore.Event) []handler.Column {
return []handler.Column{
handler.NewCol(MemberChangeDate, e.CreationDate()),
handler.NewCol(MemberSequence, e.Sequence()),
handler.NewCol(MemberUserOwnerRemoved, true),
}
}
func reduceMemberUserOwnerRemoved(e eventstore.Event, opts ...reduceMemberOpt) (*handler.Statement, error) {
return crdb.NewUpdateStatement(
e,
memberUserOwnerRemovedCols(e),
memberUserOwnerRemovedConds(e, opts...),
), nil
}
func multiReduceMemberUserOwnerRemoved(e eventstore.Event, opts ...reduceMemberOpt) func(eventstore.Event) crdb.Exec {
return crdb.AddUpdateStatement(
memberUserOwnerRemovedCols(e),
memberUserOwnerRemovedConds(e, opts...),
)
}
func setMemberContext(event eventstore.Aggregate) context.Context {
return authz.WithInstanceID(context.Background(), event.InstanceID)
}
+48 -18
View File
@@ -44,7 +44,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.message_texts (aggregate_id, instance_id, creation_date, change_date, sequence, state, type, language, title) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ON CONFLICT (instance_id, aggregate_id, type, language) DO UPDATE SET (creation_date, change_date, sequence, state, title) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.state, EXCLUDED.title)",
expectedStmt: "INSERT INTO projections.message_texts2 (aggregate_id, instance_id, creation_date, change_date, sequence, state, type, language, title) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ON CONFLICT (instance_id, aggregate_id, type, language) DO UPDATE SET (creation_date, change_date, sequence, state, title) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.state, EXCLUDED.title)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -83,7 +83,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.message_texts (aggregate_id, instance_id, creation_date, change_date, sequence, state, type, language, pre_header) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ON CONFLICT (instance_id, aggregate_id, type, language) DO UPDATE SET (creation_date, change_date, sequence, state, pre_header) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.state, EXCLUDED.pre_header)",
expectedStmt: "INSERT INTO projections.message_texts2 (aggregate_id, instance_id, creation_date, change_date, sequence, state, type, language, pre_header) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ON CONFLICT (instance_id, aggregate_id, type, language) DO UPDATE SET (creation_date, change_date, sequence, state, pre_header) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.state, EXCLUDED.pre_header)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -122,7 +122,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.message_texts (aggregate_id, instance_id, creation_date, change_date, sequence, state, type, language, subject) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ON CONFLICT (instance_id, aggregate_id, type, language) DO UPDATE SET (creation_date, change_date, sequence, state, subject) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.state, EXCLUDED.subject)",
expectedStmt: "INSERT INTO projections.message_texts2 (aggregate_id, instance_id, creation_date, change_date, sequence, state, type, language, subject) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ON CONFLICT (instance_id, aggregate_id, type, language) DO UPDATE SET (creation_date, change_date, sequence, state, subject) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.state, EXCLUDED.subject)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -161,7 +161,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.message_texts (aggregate_id, instance_id, creation_date, change_date, sequence, state, type, language, greeting) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ON CONFLICT (instance_id, aggregate_id, type, language) DO UPDATE SET (creation_date, change_date, sequence, state, greeting) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.state, EXCLUDED.greeting)",
expectedStmt: "INSERT INTO projections.message_texts2 (aggregate_id, instance_id, creation_date, change_date, sequence, state, type, language, greeting) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ON CONFLICT (instance_id, aggregate_id, type, language) DO UPDATE SET (creation_date, change_date, sequence, state, greeting) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.state, EXCLUDED.greeting)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -200,7 +200,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.message_texts (aggregate_id, instance_id, creation_date, change_date, sequence, state, type, language, text) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ON CONFLICT (instance_id, aggregate_id, type, language) DO UPDATE SET (creation_date, change_date, sequence, state, text) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.state, EXCLUDED.text)",
expectedStmt: "INSERT INTO projections.message_texts2 (aggregate_id, instance_id, creation_date, change_date, sequence, state, type, language, text) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ON CONFLICT (instance_id, aggregate_id, type, language) DO UPDATE SET (creation_date, change_date, sequence, state, text) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.state, EXCLUDED.text)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -239,7 +239,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.message_texts (aggregate_id, instance_id, creation_date, change_date, sequence, state, type, language, button_text) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ON CONFLICT (instance_id, aggregate_id, type, language) DO UPDATE SET (creation_date, change_date, sequence, state, button_text) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.state, EXCLUDED.button_text)",
expectedStmt: "INSERT INTO projections.message_texts2 (aggregate_id, instance_id, creation_date, change_date, sequence, state, type, language, button_text) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ON CONFLICT (instance_id, aggregate_id, type, language) DO UPDATE SET (creation_date, change_date, sequence, state, button_text) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.state, EXCLUDED.button_text)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -278,7 +278,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.message_texts (aggregate_id, instance_id, creation_date, change_date, sequence, state, type, language, footer_text) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ON CONFLICT (instance_id, aggregate_id, type, language) DO UPDATE SET (creation_date, change_date, sequence, state, footer_text) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.state, EXCLUDED.footer_text)",
expectedStmt: "INSERT INTO projections.message_texts2 (aggregate_id, instance_id, creation_date, change_date, sequence, state, type, language, footer_text) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ON CONFLICT (instance_id, aggregate_id, type, language) DO UPDATE SET (creation_date, change_date, sequence, state, footer_text) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.state, EXCLUDED.footer_text)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -316,7 +316,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.message_texts SET (change_date, sequence, title) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (type = $5) AND (language = $6) AND (instance_id = $7)",
expectedStmt: "UPDATE projections.message_texts2 SET (change_date, sequence, title) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (type = $5) AND (language = $6) AND (instance_id = $7)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -348,7 +348,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.message_texts WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.message_texts2 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
@@ -378,7 +378,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.message_texts SET (change_date, sequence, pre_header) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (type = $5) AND (language = $6) AND (instance_id = $7)",
expectedStmt: "UPDATE projections.message_texts2 SET (change_date, sequence, pre_header) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (type = $5) AND (language = $6) AND (instance_id = $7)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -414,7 +414,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.message_texts SET (change_date, sequence, subject) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (type = $5) AND (language = $6) AND (instance_id = $7)",
expectedStmt: "UPDATE projections.message_texts2 SET (change_date, sequence, subject) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (type = $5) AND (language = $6) AND (instance_id = $7)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -450,7 +450,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.message_texts SET (change_date, sequence, greeting) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (type = $5) AND (language = $6) AND (instance_id = $7)",
expectedStmt: "UPDATE projections.message_texts2 SET (change_date, sequence, greeting) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (type = $5) AND (language = $6) AND (instance_id = $7)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -486,7 +486,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.message_texts SET (change_date, sequence, text) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (type = $5) AND (language = $6) AND (instance_id = $7)",
expectedStmt: "UPDATE projections.message_texts2 SET (change_date, sequence, text) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (type = $5) AND (language = $6) AND (instance_id = $7)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -522,7 +522,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.message_texts SET (change_date, sequence, button_text) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (type = $5) AND (language = $6) AND (instance_id = $7)",
expectedStmt: "UPDATE projections.message_texts2 SET (change_date, sequence, button_text) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (type = $5) AND (language = $6) AND (instance_id = $7)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -558,7 +558,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.message_texts SET (change_date, sequence, footer_text) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (type = $5) AND (language = $6) AND (instance_id = $7)",
expectedStmt: "UPDATE projections.message_texts2 SET (change_date, sequence, footer_text) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (type = $5) AND (language = $6) AND (instance_id = $7)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -594,7 +594,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.message_texts WHERE (aggregate_id = $1) AND (type = $2) AND (language = $3) AND (instance_id = $4)",
expectedStmt: "DELETE FROM projections.message_texts2 WHERE (aggregate_id = $1) AND (type = $2) AND (language = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
"agg-id",
"InitCode",
@@ -628,7 +628,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.message_texts (aggregate_id, instance_id, creation_date, change_date, sequence, state, type, language, title) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ON CONFLICT (instance_id, aggregate_id, type, language) DO UPDATE SET (creation_date, change_date, sequence, state, title) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.state, EXCLUDED.title)",
expectedStmt: "INSERT INTO projections.message_texts2 (aggregate_id, instance_id, creation_date, change_date, sequence, state, type, language, title) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ON CONFLICT (instance_id, aggregate_id, type, language) DO UPDATE SET (creation_date, change_date, sequence, state, title) = (EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.state, EXCLUDED.title)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -666,7 +666,7 @@ func TestMessageTextProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.message_texts SET (change_date, sequence, title) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (type = $5) AND (language = $6) AND (instance_id = $7)",
expectedStmt: "UPDATE projections.message_texts2 SET (change_date, sequence, title) = ($1, $2, $3) WHERE (aggregate_id = $4) AND (type = $5) AND (language = $6) AND (instance_id = $7)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -681,6 +681,36 @@ func TestMessageTextProjection_reduces(t *testing.T) {
},
},
},
{
name: "org.reduceOwnerRemoved",
reduce: (&messageTextProjection{}).reduceOwnerRemoved,
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
org.AggregateType,
nil,
), org.OrgRemovedEventMapper),
},
want: wantReduce{
aggregateType: eventstore.AggregateType("org"),
sequence: 15,
previousSequence: 10,
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.message_texts2 SET (change_date, sequence, owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (aggregate_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
},
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
+28 -1
View File
@@ -14,7 +14,7 @@ import (
)
const (
MessageTextTable = "projections.message_texts"
MessageTextTable = "projections.message_texts2"
MessageTextAggregateIDCol = "aggregate_id"
MessageTextInstanceIDCol = "instance_id"
@@ -31,6 +31,7 @@ const (
MessageTextTextCol = "text"
MessageTextButtonTextCol = "button_text"
MessageTextFooterCol = "footer_text"
MessageTextOwnerRemovedCol = "owner_removed"
)
type messageTextProjection struct {
@@ -58,8 +59,10 @@ func newMessageTextProjection(ctx context.Context, config crdb.StatementHandlerC
crdb.NewColumn(MessageTextTextCol, crdb.ColumnTypeText, crdb.Nullable()),
crdb.NewColumn(MessageTextButtonTextCol, crdb.ColumnTypeText, crdb.Nullable()),
crdb.NewColumn(MessageTextFooterCol, crdb.ColumnTypeText, crdb.Nullable()),
crdb.NewColumn(MessageTextOwnerRemovedCol, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(MessageTextInstanceIDCol, MessageTextAggregateIDCol, MessageTextTypeCol, MessageTextLanguageCol),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{MessageTextOwnerRemovedCol})),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -83,6 +86,10 @@ func (p *messageTextProjection) reducers() []handler.AggregateReducer {
Event: org.CustomTextTemplateRemovedEventType,
Reduce: p.reduceTemplateRemoved,
},
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOwnerRemoved,
},
},
},
{
@@ -240,6 +247,26 @@ func (p *messageTextProjection) reduceTemplateRemoved(event eventstore.Event) (*
), nil
}
func (p *messageTextProjection) reduceOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-mLsQw", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(MessageTextChangeDateCol, e.CreationDate()),
handler.NewCol(MessageTextSequenceCol, e.Sequence()),
handler.NewCol(MessageTextOwnerRemovedCol, true),
},
[]handler.Condition{
handler.NewCond(MessageTextInstanceIDCol, e.Aggregate().InstanceID),
handler.NewCond(MessageTextAggregateIDCol, e.Aggregate().ID),
},
), nil
}
func isMessageTemplate(template string) bool {
return template == domain.InitCodeMessageType ||
template == domain.PasswordResetMessageType ||
+25 -2
View File
@@ -47,8 +47,8 @@ func newOrgProjection(ctx context.Context, config crdb.StatementHandlerConfig) *
crdb.NewColumn(OrgColumnDomain, crdb.ColumnTypeText, crdb.Default("")),
},
crdb.NewPrimaryKey(OrgColumnInstanceID, OrgColumnID),
crdb.WithIndex(crdb.NewIndex("domain_idx", []string{OrgColumnDomain})),
crdb.WithIndex(crdb.NewIndex("name_idx", []string{OrgColumnName})),
crdb.WithIndex(crdb.NewIndex("domain", []string{OrgColumnDomain})),
crdb.WithIndex(crdb.NewIndex("name", []string{OrgColumnName})),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -76,6 +76,10 @@ func (p *orgProjection) reducers() []handler.AggregateReducer {
Event: org.OrgReactivatedEventType,
Reduce: p.reduceOrgReactivated,
},
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOrgRemoved,
},
{
Event: org.OrgDomainPrimarySetEventType,
Reduce: p.reducePrimaryDomainSet,
@@ -192,3 +196,22 @@ func (p *orgProjection) reducePrimaryDomainSet(event eventstore.Event) (*handler
},
), nil
}
func (p *orgProjection) reduceOrgRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-DgMSg", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(OrgColumnChangeDate, e.CreationDate()),
handler.NewCol(OrgColumnSequence, e.Sequence()),
handler.NewCol(OrgColumnState, domain.OrgStateRemoved),
},
[]handler.Condition{
handler.NewCond(OrgColumnID, e.Aggregate().ID),
handler.NewCond(OrgColumnInstanceID, e.Aggregate().InstanceID),
},
), nil
}
+28 -1
View File
@@ -13,7 +13,7 @@ import (
)
const (
OrgDomainTable = "projections.org_domains"
OrgDomainTable = "projections.org_domains2"
OrgDomainOrgIDCol = "org_id"
OrgDomainInstanceIDCol = "instance_id"
@@ -24,6 +24,7 @@ const (
OrgDomainIsVerifiedCol = "is_verified"
OrgDomainIsPrimaryCol = "is_primary"
OrgDomainValidationTypeCol = "validation_type"
OrgDomainOwnerRemovedCol = "owner_removed"
)
type orgDomainProjection struct {
@@ -45,8 +46,10 @@ func newOrgDomainProjection(ctx context.Context, config crdb.StatementHandlerCon
crdb.NewColumn(OrgDomainIsVerifiedCol, crdb.ColumnTypeBool),
crdb.NewColumn(OrgDomainIsPrimaryCol, crdb.ColumnTypeBool),
crdb.NewColumn(OrgDomainValidationTypeCol, crdb.ColumnTypeEnum),
crdb.NewColumn(OrgDomainOwnerRemovedCol, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(OrgDomainOrgIDCol, OrgDomainDomainCol, OrgDomainInstanceIDCol),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{OrgDomainOwnerRemovedCol})),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -78,6 +81,10 @@ func (p *orgDomainProjection) reducers() []handler.AggregateReducer {
Event: org.OrgDomainRemovedEventType,
Reduce: p.reduceDomainRemoved,
},
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceOwnerRemoved,
},
},
},
{
@@ -201,3 +208,23 @@ func (p *orgDomainProjection) reduceDomainRemoved(event eventstore.Event) (*hand
},
), nil
}
func (p *orgDomainProjection) reduceOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-dMUKJ", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(OrgDomainChangeDateCol, e.CreationDate()),
handler.NewCol(OrgDomainSequenceCol, e.Sequence()),
handler.NewCol(OrgDomainOwnerRemovedCol, true),
},
[]handler.Condition{
handler.NewCond(OrgDomainInstanceIDCol, e.Aggregate().InstanceID),
handler.NewCond(OrgDomainOrgIDCol, e.Aggregate().ID),
},
), nil
}
+37 -7
View File
@@ -39,7 +39,7 @@ func TestOrgDomainProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.org_domains (creation_date, change_date, sequence, domain, org_id, instance_id, is_verified, is_primary, validation_type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)",
expectedStmt: "INSERT INTO projections.org_domains2 (creation_date, change_date, sequence, domain, org_id, instance_id, is_verified, is_primary, validation_type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)",
expectedArgs: []interface{}{
anyArg{},
anyArg{},
@@ -73,7 +73,7 @@ func TestOrgDomainProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.org_domains SET (change_date, sequence, validation_type) = ($1, $2, $3) WHERE (domain = $4) AND (org_id = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.org_domains2 SET (change_date, sequence, validation_type) = ($1, $2, $3) WHERE (domain = $4) AND (org_id = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -104,7 +104,7 @@ func TestOrgDomainProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.org_domains SET (change_date, sequence, is_verified) = ($1, $2, $3) WHERE (domain = $4) AND (org_id = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.org_domains2 SET (change_date, sequence, is_verified) = ($1, $2, $3) WHERE (domain = $4) AND (org_id = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -135,7 +135,7 @@ func TestOrgDomainProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.org_domains SET (change_date, sequence, is_primary) = ($1, $2, $3) WHERE (org_id = $4) AND (is_primary = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.org_domains2 SET (change_date, sequence, is_primary) = ($1, $2, $3) WHERE (org_id = $4) AND (is_primary = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -146,7 +146,7 @@ func TestOrgDomainProjection_reduces(t *testing.T) {
},
},
{
expectedStmt: "UPDATE projections.org_domains SET (change_date, sequence, is_primary) = ($1, $2, $3) WHERE (domain = $4) AND (org_id = $5) AND (instance_id = $6)",
expectedStmt: "UPDATE projections.org_domains2 SET (change_date, sequence, is_primary) = ($1, $2, $3) WHERE (domain = $4) AND (org_id = $5) AND (instance_id = $6)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
@@ -177,7 +177,7 @@ func TestOrgDomainProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.org_domains WHERE (domain = $1) AND (org_id = $2) AND (instance_id = $3)",
expectedStmt: "DELETE FROM projections.org_domains2 WHERE (domain = $1) AND (org_id = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
"domain.new",
"agg-id",
@@ -188,6 +188,36 @@ func TestOrgDomainProjection_reduces(t *testing.T) {
},
},
},
{
name: "org.reduceOwnerRemoved",
reduce: (&orgDomainProjection{}).reduceOwnerRemoved,
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
org.AggregateType,
nil,
), org.OrgRemovedEventMapper),
},
want: wantReduce{
aggregateType: eventstore.AggregateType("org"),
sequence: 15,
previousSequence: 10,
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.org_domains2 SET (change_date, sequence, owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (org_id = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
},
},
},
},
},
{
name: "instance reduceInstanceRemoved",
args: args{
@@ -205,7 +235,7 @@ func TestOrgDomainProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.org_domains WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.org_domains2 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
+15 -8
View File
@@ -13,7 +13,7 @@ import (
)
const (
OrgMemberProjectionTable = "projections.org_members2"
OrgMemberProjectionTable = "projections.org_members3"
OrgMemberOrgIDCol = "org_id"
)
@@ -29,7 +29,9 @@ func newOrgMemberProjection(ctx context.Context, config crdb.StatementHandlerCon
crdb.NewTable(
append(memberColumns, crdb.NewColumn(OrgMemberOrgIDCol, crdb.ColumnTypeText)),
crdb.NewPrimaryKey(MemberInstanceID, OrgMemberOrgIDCol, MemberUserIDCol),
crdb.WithIndex(crdb.NewIndex("org_memb_user_idx", []string{MemberUserIDCol})),
crdb.WithIndex(crdb.NewIndex("user_id", []string{MemberUserIDCol})),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{MemberOwnerRemoved})),
crdb.WithIndex(crdb.NewIndex("user_owner_removed", []string{MemberUserOwnerRemoved})),
),
)
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
@@ -89,7 +91,12 @@ func (p *orgMemberProjection) reduceAdded(event eventstore.Event) (*handler.Stat
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "HANDL-uYq4r", "reduce.wrong.event.type %s", org.MemberAddedEventType)
}
return reduceMemberAdded(e.MemberAddedEvent, withMemberCol(OrgMemberOrgIDCol, e.Aggregate().ID))
ctx := setMemberContext(e.Aggregate())
userOwner, err := getResourceOwnerOfUser(ctx, p.Eventstore, e.Aggregate().InstanceID, e.UserID)
if err != nil {
return nil, err
}
return reduceMemberAdded(e.MemberAddedEvent, userOwner, withMemberCol(OrgMemberOrgIDCol, e.Aggregate().ID))
}
func (p *orgMemberProjection) reduceChanged(event eventstore.Event) (*handler.Statement, error) {
@@ -128,13 +135,13 @@ func (p *orgMemberProjection) reduceUserRemoved(event eventstore.Event) (*handle
}
func (p *orgMemberProjection) reduceOrgRemoved(event eventstore.Event) (*handler.Statement, error) {
//TODO: as soon as org deletion is implemented:
// Case: The user has resource owner A and an org has resource owner B
// if org B deleted it works
// if org A is deleted, the membership wouldn't be deleted
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "HANDL-jnGAV", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return reduceMemberRemoved(e, withMemberCond(OrgMemberOrgIDCol, e.Aggregate().ID))
return crdb.NewMultiStatement(
e,
multiReduceMemberOwnerRemoved(e),
multiReduceMemberUserOwnerRemoved(e),
), nil
}
+42 -8
View File
@@ -1,9 +1,13 @@
package projection
import (
"context"
"testing"
"golang.org/x/text/language"
"github.com/zitadel/zitadel/internal/database"
"github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/errors"
"github.com/zitadel/zitadel/internal/eventstore"
"github.com/zitadel/zitadel/internal/eventstore/handler"
@@ -35,7 +39,21 @@ func TestOrgMemberProjection_reduces(t *testing.T) {
}`),
), org.MemberAddedEventMapper),
},
reduce: (&orgMemberProjection{}).reduceAdded,
reduce: (&orgMemberProjection{
StatementHandler: getStatementHandlerWithFilters(
user.NewHumanAddedEvent(context.Background(),
&user.NewAggregate("user-id", "org1").Aggregate,
"username1",
"firstname1",
"lastname1",
"nickname1",
"displayname1",
language.German,
domain.GenderMale,
"email1",
true,
),
)(t)}).reduceAdded,
want: wantReduce{
aggregateType: org.AggregateType,
sequence: 15,
@@ -43,15 +61,18 @@ func TestOrgMemberProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.org_members2 (user_id, roles, creation_date, change_date, sequence, resource_owner, instance_id, org_id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
expectedStmt: "INSERT INTO projections.org_members3 (user_id, user_resource_owner, user_owner_removed, roles, creation_date, change_date, sequence, resource_owner, instance_id, owner_removed, org_id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)",
expectedArgs: []interface{}{
"user-id",
"org1",
false,
database.StringArray{"role"},
anyArg{},
anyArg{},
uint64(15),
"ro-id",
"instance-id",
false,
"agg-id",
},
},
@@ -79,7 +100,7 @@ func TestOrgMemberProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "UPDATE projections.org_members2 SET (roles, change_date, sequence) = ($1, $2, $3) WHERE (instance_id = $4) AND (user_id = $5) AND (org_id = $6)",
expectedStmt: "UPDATE projections.org_members3 SET (roles, change_date, sequence) = ($1, $2, $3) WHERE (instance_id = $4) AND (user_id = $5) AND (org_id = $6)",
expectedArgs: []interface{}{
database.StringArray{"role", "changed"},
anyArg{},
@@ -112,7 +133,7 @@ func TestOrgMemberProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.org_members2 WHERE (instance_id = $1) AND (user_id = $2) AND (org_id = $3)",
expectedStmt: "DELETE FROM projections.org_members3 WHERE (instance_id = $1) AND (user_id = $2) AND (org_id = $3)",
expectedArgs: []interface{}{
"instance-id",
"user-id",
@@ -142,7 +163,7 @@ func TestOrgMemberProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.org_members2 WHERE (instance_id = $1) AND (user_id = $2) AND (org_id = $3)",
expectedStmt: "DELETE FROM projections.org_members3 WHERE (instance_id = $1) AND (user_id = $2) AND (org_id = $3)",
expectedArgs: []interface{}{
"instance-id",
"user-id",
@@ -170,7 +191,7 @@ func TestOrgMemberProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.org_members2 WHERE (instance_id = $1) AND (user_id = $2)",
expectedStmt: "DELETE FROM projections.org_members3 WHERE (instance_id = $1) AND (user_id = $2)",
expectedArgs: []interface{}{
"instance-id",
"agg-id",
@@ -197,8 +218,21 @@ func TestOrgMemberProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.org_members2 WHERE (instance_id = $1) AND (org_id = $2)",
expectedStmt: "UPDATE projections.org_members3 SET (change_date, sequence, owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (resource_owner = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
},
{
expectedStmt: "UPDATE projections.org_members3 SET (change_date, sequence, user_owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (user_resource_owner = $5)",
expectedArgs: []interface{}{
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
@@ -224,7 +258,7 @@ func TestOrgMemberProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.org_members2 WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.org_members3 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},
+25 -2
View File
@@ -12,7 +12,7 @@ import (
)
const (
OrgMetadataProjectionTable = "projections.org_metadata"
OrgMetadataProjectionTable = "projections.org_metadata2"
OrgMetadataColumnOrgID = "org_id"
OrgMetadataColumnCreationDate = "creation_date"
@@ -22,6 +22,7 @@ const (
OrgMetadataColumnInstanceID = "instance_id"
OrgMetadataColumnKey = "key"
OrgMetadataColumnValue = "value"
OrgMetadataColumnOwnerRemoved = "owner_removed"
)
type orgMetadataProjection struct {
@@ -42,8 +43,10 @@ func newOrgMetadataProjection(ctx context.Context, config crdb.StatementHandlerC
crdb.NewColumn(OrgMetadataColumnInstanceID, crdb.ColumnTypeText),
crdb.NewColumn(OrgMetadataColumnKey, crdb.ColumnTypeText),
crdb.NewColumn(OrgMetadataColumnValue, crdb.ColumnTypeBytes, crdb.Nullable()),
crdb.NewColumn(OrgMetadataColumnOwnerRemoved, crdb.ColumnTypeBool, crdb.Default(false)),
},
crdb.NewPrimaryKey(OrgMetadataColumnInstanceID, OrgMetadataColumnOrgID, OrgMetadataColumnKey),
crdb.WithIndex(crdb.NewIndex("owner_removed", []string{OrgMetadataColumnOwnerRemoved})),
),
)
@@ -70,7 +73,7 @@ func (p *orgMetadataProjection) reducers() []handler.AggregateReducer {
},
{
Event: org.OrgRemovedEventType,
Reduce: p.reduceMetadataRemovedAll,
Reduce: p.reduceOwnerRemoved,
},
},
},
@@ -142,3 +145,23 @@ func (p *orgMetadataProjection) reduceMetadataRemovedAll(event eventstore.Event)
},
), nil
}
func (p *orgMetadataProjection) reduceOwnerRemoved(event eventstore.Event) (*handler.Statement, error) {
e, ok := event.(*org.OrgRemovedEvent)
if !ok {
return nil, errors.ThrowInvalidArgumentf(nil, "PROJE-Hkd1f", "reduce.wrong.event.type %s", org.OrgRemovedEventType)
}
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(OrgMetadataColumnChangeDate, e.CreationDate()),
handler.NewCol(OrgMetadataColumnSequence, e.Sequence()),
handler.NewCol(OrgMetadataColumnOwnerRemoved, true),
},
[]handler.Condition{
handler.NewCond(OrgMetadataColumnInstanceID, e.Aggregate().InstanceID),
handler.NewCond(OrgMetadataColumnResourceOwner, e.Aggregate().ID),
},
), nil
}
+11 -8
View File
@@ -41,7 +41,7 @@ func TestOrgMetadataProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "INSERT INTO projections.org_metadata (instance_id, org_id, key, resource_owner, creation_date, change_date, sequence, value) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) ON CONFLICT (instance_id, org_id, key) DO UPDATE SET (resource_owner, creation_date, change_date, sequence, value) = (EXCLUDED.resource_owner, EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.value)",
expectedStmt: "INSERT INTO projections.org_metadata2 (instance_id, org_id, key, resource_owner, creation_date, change_date, sequence, value) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) ON CONFLICT (instance_id, org_id, key) DO UPDATE SET (resource_owner, creation_date, change_date, sequence, value) = (EXCLUDED.resource_owner, EXCLUDED.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.value)",
expectedArgs: []interface{}{
"instance-id",
"agg-id",
@@ -76,7 +76,7 @@ func TestOrgMetadataProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.org_metadata WHERE (org_id = $1) AND (key = $2) AND (instance_id = $3)",
expectedStmt: "DELETE FROM projections.org_metadata2 WHERE (org_id = $1) AND (key = $2) AND (instance_id = $3)",
expectedArgs: []interface{}{
"agg-id",
"key",
@@ -104,7 +104,7 @@ func TestOrgMetadataProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.org_metadata WHERE (org_id = $1) AND (instance_id = $2)",
expectedStmt: "DELETE FROM projections.org_metadata2 WHERE (org_id = $1) AND (instance_id = $2)",
expectedArgs: []interface{}{
"agg-id",
"instance-id",
@@ -115,7 +115,7 @@ func TestOrgMetadataProjection_reduces(t *testing.T) {
},
},
{
name: "reduceMetadataRemovedAll (org removed)",
name: "reduceOwnerRemoved(org removed)",
args: args{
event: getEvent(testEvent(
repository.EventType(org.OrgRemovedEventType),
@@ -123,7 +123,7 @@ func TestOrgMetadataProjection_reduces(t *testing.T) {
nil,
), org.OrgRemovedEventMapper),
},
reduce: (&orgMetadataProjection{}).reduceMetadataRemovedAll,
reduce: (&orgMetadataProjection{}).reduceOwnerRemoved,
want: wantReduce{
aggregateType: org.AggregateType,
sequence: 15,
@@ -131,10 +131,13 @@ func TestOrgMetadataProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.org_metadata WHERE (org_id = $1) AND (instance_id = $2)",
expectedStmt: "UPDATE projections.org_metadata2 SET (change_date, sequence, owner_removed) = ($1, $2, $3) WHERE (instance_id = $4) AND (resource_owner = $5)",
expectedArgs: []interface{}{
"agg-id",
anyArg{},
uint64(15),
true,
"instance-id",
"agg-id",
},
},
},
@@ -158,7 +161,7 @@ func TestOrgMetadataProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
expectedStmt: "DELETE FROM projections.org_metadata WHERE (instance_id = $1)",
expectedStmt: "DELETE FROM projections.org_metadata2 WHERE (instance_id = $1)",
expectedArgs: []interface{}{
"agg-id",
},

Some files were not shown because too many files have changed in this diff Show More