mirror of
https://github.com/andwati/zitadel.git
synced 2026-11-08 23:25:12 +00:00
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:
co-authored by
Stefan Benz
Livio Spring
Fabi
Stefan Benz
parent
21a4e73bb6
commit
f3e6f3b23b
+22
-13
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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
@@ -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) {
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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
@@ -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",
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
@@ -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) {
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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()).
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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()).
|
||||
|
||||
@@ -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, ¬ificationTextMap); 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
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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()).
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
},
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
},
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
},
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
},
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 != ""},
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 ||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
},
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
},
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user