mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-12 03:27:32 +00:00
fix: state on user projection (#3109)
* fix: state on user projection * fix: state on user projection * don't change user state on HumanEmailVerifiedEvent
This commit is contained in:
@@ -47,9 +47,6 @@ func (wm *HumanInitCodeWriteModel) Reduce() error {
|
|||||||
wm.IsEmailVerified = false
|
wm.IsEmailVerified = false
|
||||||
case *user.HumanEmailVerifiedEvent:
|
case *user.HumanEmailVerifiedEvent:
|
||||||
wm.IsEmailVerified = true
|
wm.IsEmailVerified = true
|
||||||
if wm.UserState == domain.UserStateInitial {
|
|
||||||
wm.UserState = domain.UserStateActive
|
|
||||||
}
|
|
||||||
case *user.HumanInitialCodeAddedEvent:
|
case *user.HumanInitialCodeAddedEvent:
|
||||||
wm.Code = e.Code
|
wm.Code = e.Code
|
||||||
wm.CodeCreationDate = e.CreationDate()
|
wm.CodeCreationDate = e.CreationDate()
|
||||||
|
@@ -94,6 +94,22 @@ func (p *UserProjection) reducers() []handler.AggregateReducer {
|
|||||||
Event: user.HumanRegisteredType,
|
Event: user.HumanRegisteredType,
|
||||||
Reduce: p.reduceHumanRegistered,
|
Reduce: p.reduceHumanRegistered,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Event: user.HumanInitialCodeAddedType,
|
||||||
|
Reduce: p.reduceHumanInitCodeAdded,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Event: user.UserV1InitialCodeAddedType,
|
||||||
|
Reduce: p.reduceHumanInitCodeAdded,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Event: user.HumanInitializedCheckSucceededType,
|
||||||
|
Reduce: p.reduceHumanInitCodeSucceeded,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Event: user.UserV1InitializedCheckSucceededType,
|
||||||
|
Reduce: p.reduceHumanInitCodeSucceeded,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Event: user.UserLockedType,
|
Event: user.UserLockedType,
|
||||||
Reduce: p.reduceUserLocked,
|
Reduce: p.reduceUserLocked,
|
||||||
@@ -201,7 +217,7 @@ func (p *UserProjection) reduceHumanAdded(event eventstore.Event) (*handler.Stat
|
|||||||
handler.NewCol(UserCreationDateCol, e.CreationDate()),
|
handler.NewCol(UserCreationDateCol, e.CreationDate()),
|
||||||
handler.NewCol(UserChangeDateCol, e.CreationDate()),
|
handler.NewCol(UserChangeDateCol, e.CreationDate()),
|
||||||
handler.NewCol(UserResourceOwnerCol, e.Aggregate().ResourceOwner),
|
handler.NewCol(UserResourceOwnerCol, e.Aggregate().ResourceOwner),
|
||||||
handler.NewCol(UserStateCol, domain.UserStateInitial),
|
handler.NewCol(UserStateCol, domain.UserStateActive),
|
||||||
handler.NewCol(UserSequenceCol, e.Sequence()),
|
handler.NewCol(UserSequenceCol, e.Sequence()),
|
||||||
handler.NewCol(UserUsernameCol, e.UserName),
|
handler.NewCol(UserUsernameCol, e.UserName),
|
||||||
handler.NewCol(UserTypeCol, domain.UserTypeHuman),
|
handler.NewCol(UserTypeCol, domain.UserTypeHuman),
|
||||||
@@ -238,7 +254,7 @@ func (p *UserProjection) reduceHumanRegistered(event eventstore.Event) (*handler
|
|||||||
handler.NewCol(UserCreationDateCol, e.CreationDate()),
|
handler.NewCol(UserCreationDateCol, e.CreationDate()),
|
||||||
handler.NewCol(UserChangeDateCol, e.CreationDate()),
|
handler.NewCol(UserChangeDateCol, e.CreationDate()),
|
||||||
handler.NewCol(UserResourceOwnerCol, e.Aggregate().ResourceOwner),
|
handler.NewCol(UserResourceOwnerCol, e.Aggregate().ResourceOwner),
|
||||||
handler.NewCol(UserStateCol, domain.UserStateInitial),
|
handler.NewCol(UserStateCol, domain.UserStateActive),
|
||||||
handler.NewCol(UserSequenceCol, e.Sequence()),
|
handler.NewCol(UserSequenceCol, e.Sequence()),
|
||||||
handler.NewCol(UserUsernameCol, e.UserName),
|
handler.NewCol(UserUsernameCol, e.UserName),
|
||||||
handler.NewCol(UserTypeCol, domain.UserTypeHuman),
|
handler.NewCol(UserTypeCol, domain.UserTypeHuman),
|
||||||
@@ -261,6 +277,40 @@ func (p *UserProjection) reduceHumanRegistered(event eventstore.Event) (*handler
|
|||||||
), nil
|
), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *UserProjection) reduceHumanInitCodeAdded(event eventstore.Event) (*handler.Statement, error) {
|
||||||
|
e, ok := event.(*user.HumanInitialCodeAddedEvent)
|
||||||
|
if !ok {
|
||||||
|
logging.LogWithFields("HANDL-DSfe2", "seq", event.Sequence(), "expectedType", user.HumanInitialCodeAddedType).Error("wrong event type")
|
||||||
|
return nil, errors.ThrowInvalidArgument(nil, "HANDL-Dvgws", "reduce.wrong.event.type")
|
||||||
|
}
|
||||||
|
return crdb.NewUpdateStatement(
|
||||||
|
e,
|
||||||
|
[]handler.Column{
|
||||||
|
handler.NewCol(UserStateCol, domain.UserStateInitial),
|
||||||
|
},
|
||||||
|
[]handler.Condition{
|
||||||
|
handler.NewCond(UserIDCol, e.Aggregate().ID),
|
||||||
|
},
|
||||||
|
), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *UserProjection) reduceHumanInitCodeSucceeded(event eventstore.Event) (*handler.Statement, error) {
|
||||||
|
e, ok := event.(*user.HumanInitializedCheckSucceededEvent)
|
||||||
|
if !ok {
|
||||||
|
logging.LogWithFields("HANDL-Dgff2", "seq", event.Sequence(), "expectedType", user.HumanInitializedCheckSucceededType).Error("wrong event type")
|
||||||
|
return nil, errors.ThrowInvalidArgument(nil, "HANDL-Dfvwq", "reduce.wrong.event.type")
|
||||||
|
}
|
||||||
|
return crdb.NewUpdateStatement(
|
||||||
|
e,
|
||||||
|
[]handler.Column{
|
||||||
|
handler.NewCol(UserStateCol, domain.UserStateActive),
|
||||||
|
},
|
||||||
|
[]handler.Condition{
|
||||||
|
handler.NewCond(UserIDCol, e.Aggregate().ID),
|
||||||
|
},
|
||||||
|
), nil
|
||||||
|
}
|
||||||
|
|
||||||
func (p *UserProjection) reduceUserLocked(event eventstore.Event) (*handler.Statement, error) {
|
func (p *UserProjection) reduceUserLocked(event eventstore.Event) (*handler.Statement, error) {
|
||||||
e, ok := event.(*user.UserLockedEvent)
|
e, ok := event.(*user.UserLockedEvent)
|
||||||
if !ok {
|
if !ok {
|
||||||
@@ -656,7 +706,7 @@ func (p *UserProjection) reduceMachineAdded(event eventstore.Event) (*handler.St
|
|||||||
handler.NewCol(UserCreationDateCol, e.CreationDate()),
|
handler.NewCol(UserCreationDateCol, e.CreationDate()),
|
||||||
handler.NewCol(UserChangeDateCol, e.CreationDate()),
|
handler.NewCol(UserChangeDateCol, e.CreationDate()),
|
||||||
handler.NewCol(UserResourceOwnerCol, e.Aggregate().ResourceOwner),
|
handler.NewCol(UserResourceOwnerCol, e.Aggregate().ResourceOwner),
|
||||||
handler.NewCol(UserStateCol, domain.UserStateInitial),
|
handler.NewCol(UserStateCol, domain.UserStateActive),
|
||||||
handler.NewCol(UserSequenceCol, e.Sequence()),
|
handler.NewCol(UserSequenceCol, e.Sequence()),
|
||||||
handler.NewCol(UserUsernameCol, e.UserName),
|
handler.NewCol(UserUsernameCol, e.UserName),
|
||||||
handler.NewCol(UserTypeCol, domain.UserTypeMachine),
|
handler.NewCol(UserTypeCol, domain.UserTypeMachine),
|
||||||
|
@@ -56,7 +56,7 @@ func TestUserProjection_reduces(t *testing.T) {
|
|||||||
anyArg{},
|
anyArg{},
|
||||||
anyArg{},
|
anyArg{},
|
||||||
"ro-id",
|
"ro-id",
|
||||||
domain.UserStateInitial,
|
domain.UserStateActive,
|
||||||
uint64(15),
|
uint64(15),
|
||||||
"user-name",
|
"user-name",
|
||||||
domain.UserTypeHuman,
|
domain.UserTypeHuman,
|
||||||
@@ -114,7 +114,7 @@ func TestUserProjection_reduces(t *testing.T) {
|
|||||||
anyArg{},
|
anyArg{},
|
||||||
anyArg{},
|
anyArg{},
|
||||||
"ro-id",
|
"ro-id",
|
||||||
domain.UserStateInitial,
|
domain.UserStateActive,
|
||||||
uint64(15),
|
uint64(15),
|
||||||
"user-name",
|
"user-name",
|
||||||
domain.UserTypeHuman,
|
domain.UserTypeHuman,
|
||||||
@@ -167,7 +167,7 @@ func TestUserProjection_reduces(t *testing.T) {
|
|||||||
anyArg{},
|
anyArg{},
|
||||||
anyArg{},
|
anyArg{},
|
||||||
"ro-id",
|
"ro-id",
|
||||||
domain.UserStateInitial,
|
domain.UserStateActive,
|
||||||
uint64(15),
|
uint64(15),
|
||||||
"user-name",
|
"user-name",
|
||||||
domain.UserTypeHuman,
|
domain.UserTypeHuman,
|
||||||
@@ -225,7 +225,7 @@ func TestUserProjection_reduces(t *testing.T) {
|
|||||||
anyArg{},
|
anyArg{},
|
||||||
anyArg{},
|
anyArg{},
|
||||||
"ro-id",
|
"ro-id",
|
||||||
domain.UserStateInitial,
|
domain.UserStateActive,
|
||||||
uint64(15),
|
uint64(15),
|
||||||
"user-name",
|
"user-name",
|
||||||
domain.UserTypeHuman,
|
domain.UserTypeHuman,
|
||||||
@@ -283,7 +283,7 @@ func TestUserProjection_reduces(t *testing.T) {
|
|||||||
anyArg{},
|
anyArg{},
|
||||||
anyArg{},
|
anyArg{},
|
||||||
"ro-id",
|
"ro-id",
|
||||||
domain.UserStateInitial,
|
domain.UserStateActive,
|
||||||
uint64(15),
|
uint64(15),
|
||||||
"user-name",
|
"user-name",
|
||||||
domain.UserTypeHuman,
|
domain.UserTypeHuman,
|
||||||
@@ -336,7 +336,7 @@ func TestUserProjection_reduces(t *testing.T) {
|
|||||||
anyArg{},
|
anyArg{},
|
||||||
anyArg{},
|
anyArg{},
|
||||||
"ro-id",
|
"ro-id",
|
||||||
domain.UserStateInitial,
|
domain.UserStateActive,
|
||||||
uint64(15),
|
uint64(15),
|
||||||
"user-name",
|
"user-name",
|
||||||
domain.UserTypeHuman,
|
domain.UserTypeHuman,
|
||||||
@@ -360,6 +360,118 @@ func TestUserProjection_reduces(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "reduceHumanInitCodeAdded",
|
||||||
|
args: args{
|
||||||
|
event: getEvent(testEvent(
|
||||||
|
repository.EventType(user.HumanInitialCodeAddedType),
|
||||||
|
user.AggregateType,
|
||||||
|
[]byte(`{}`),
|
||||||
|
), user.HumanInitialCodeAddedEventMapper),
|
||||||
|
},
|
||||||
|
reduce: (&UserProjection{}).reduceHumanInitCodeAdded,
|
||||||
|
want: wantReduce{
|
||||||
|
aggregateType: user.AggregateType,
|
||||||
|
sequence: 15,
|
||||||
|
previousSequence: 10,
|
||||||
|
projection: UserTable,
|
||||||
|
executer: &testExecuter{
|
||||||
|
executions: []execution{
|
||||||
|
{
|
||||||
|
expectedStmt: "UPDATE zitadel.projections.users SET (state) = ($1) WHERE (id = $2)",
|
||||||
|
expectedArgs: []interface{}{
|
||||||
|
domain.UserStateInitial,
|
||||||
|
"agg-id",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "reduceUserV1InitCodeAdded",
|
||||||
|
args: args{
|
||||||
|
event: getEvent(testEvent(
|
||||||
|
repository.EventType(user.UserV1InitialCodeAddedType),
|
||||||
|
user.AggregateType,
|
||||||
|
[]byte(`{}`),
|
||||||
|
), user.HumanInitialCodeAddedEventMapper),
|
||||||
|
},
|
||||||
|
reduce: (&UserProjection{}).reduceHumanInitCodeAdded,
|
||||||
|
want: wantReduce{
|
||||||
|
aggregateType: user.AggregateType,
|
||||||
|
sequence: 15,
|
||||||
|
previousSequence: 10,
|
||||||
|
projection: UserTable,
|
||||||
|
executer: &testExecuter{
|
||||||
|
executions: []execution{
|
||||||
|
{
|
||||||
|
expectedStmt: "UPDATE zitadel.projections.users SET (state) = ($1) WHERE (id = $2)",
|
||||||
|
expectedArgs: []interface{}{
|
||||||
|
domain.UserStateInitial,
|
||||||
|
"agg-id",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "reduceHumanInitCodeSucceeded",
|
||||||
|
args: args{
|
||||||
|
event: getEvent(testEvent(
|
||||||
|
repository.EventType(user.HumanInitializedCheckSucceededType),
|
||||||
|
user.AggregateType,
|
||||||
|
[]byte(`{}`),
|
||||||
|
), user.HumanInitializedCheckSucceededEventMapper),
|
||||||
|
},
|
||||||
|
reduce: (&UserProjection{}).reduceHumanInitCodeSucceeded,
|
||||||
|
want: wantReduce{
|
||||||
|
aggregateType: user.AggregateType,
|
||||||
|
sequence: 15,
|
||||||
|
previousSequence: 10,
|
||||||
|
projection: UserTable,
|
||||||
|
executer: &testExecuter{
|
||||||
|
executions: []execution{
|
||||||
|
{
|
||||||
|
expectedStmt: "UPDATE zitadel.projections.users SET (state) = ($1) WHERE (id = $2)",
|
||||||
|
expectedArgs: []interface{}{
|
||||||
|
domain.UserStateActive,
|
||||||
|
"agg-id",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "reduceUserV1InitCodeAdded",
|
||||||
|
args: args{
|
||||||
|
event: getEvent(testEvent(
|
||||||
|
repository.EventType(user.UserV1InitializedCheckSucceededType),
|
||||||
|
user.AggregateType,
|
||||||
|
[]byte(`{}`),
|
||||||
|
), user.HumanInitializedCheckSucceededEventMapper),
|
||||||
|
},
|
||||||
|
reduce: (&UserProjection{}).reduceHumanInitCodeSucceeded,
|
||||||
|
want: wantReduce{
|
||||||
|
aggregateType: user.AggregateType,
|
||||||
|
sequence: 15,
|
||||||
|
previousSequence: 10,
|
||||||
|
projection: UserTable,
|
||||||
|
executer: &testExecuter{
|
||||||
|
executions: []execution{
|
||||||
|
{
|
||||||
|
expectedStmt: "UPDATE zitadel.projections.users SET (state) = ($1) WHERE (id = $2)",
|
||||||
|
expectedArgs: []interface{}{
|
||||||
|
domain.UserStateActive,
|
||||||
|
"agg-id",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "reduceUserLocked",
|
name: "reduceUserLocked",
|
||||||
args: args{
|
args: args{
|
||||||
@@ -1110,7 +1222,7 @@ func TestUserProjection_reduces(t *testing.T) {
|
|||||||
anyArg{},
|
anyArg{},
|
||||||
anyArg{},
|
anyArg{},
|
||||||
"ro-id",
|
"ro-id",
|
||||||
domain.UserStateInitial,
|
domain.UserStateActive,
|
||||||
uint64(15),
|
uint64(15),
|
||||||
"username",
|
"username",
|
||||||
domain.UserTypeMachine,
|
domain.UserTypeMachine,
|
||||||
@@ -1156,7 +1268,7 @@ func TestUserProjection_reduces(t *testing.T) {
|
|||||||
anyArg{},
|
anyArg{},
|
||||||
anyArg{},
|
anyArg{},
|
||||||
"ro-id",
|
"ro-id",
|
||||||
domain.UserStateInitial,
|
domain.UserStateActive,
|
||||||
uint64(15),
|
uint64(15),
|
||||||
"username",
|
"username",
|
||||||
domain.UserTypeMachine,
|
domain.UserTypeMachine,
|
||||||
|
Reference in New Issue
Block a user