fix: handle multiple statements for a single event in projections (#2313)

* fix: handle multiple statements for a single event in projections

* export func type

* fix test

* Update internal/eventstore/handler/crdb/statement.go

Co-authored-by: Silvan <silvan.reusser@gmail.com>

* Update internal/eventstore/handler/crdb/statement.go

Co-authored-by: Silvan <silvan.reusser@gmail.com>

* change to pointers

* add error test case

Co-authored-by: Silvan <silvan.reusser@gmail.com>
This commit is contained in:
Livio Amstutz
2021-09-08 13:54:31 +02:00
committed by GitHub
parent ec6a3a1847
commit 1ac1492fd3
11 changed files with 546 additions and 301 deletions

View File

@@ -66,89 +66,79 @@ const (
projectInactive
)
func (p *ProjectProjection) reduceProjectAdded(event eventstore.EventReader) ([]handler.Statement, error) {
func (p *ProjectProjection) reduceProjectAdded(event eventstore.EventReader) (*handler.Statement, error) {
e := event.(*project.ProjectAddedEvent)
return []handler.Statement{
crdb.NewCreateStatement(
e,
[]handler.Column{
handler.NewCol(projectIDCol, e.Aggregate().ID),
handler.NewCol(projectNameCol, e.Name),
handler.NewCol(projectCreationDateCol, e.CreationDate()),
handler.NewCol(projectChangeDateCol, e.CreationDate()),
handler.NewCol(projectOwnerCol, e.Aggregate().ResourceOwner),
handler.NewCol(projectCreatorCol, e.EditorUser()),
handler.NewCol(projectStateCol, projectActive),
},
),
}, nil
return crdb.NewCreateStatement(
e,
[]handler.Column{
handler.NewCol(projectIDCol, e.Aggregate().ID),
handler.NewCol(projectNameCol, e.Name),
handler.NewCol(projectCreationDateCol, e.CreationDate()),
handler.NewCol(projectChangeDateCol, e.CreationDate()),
handler.NewCol(projectOwnerCol, e.Aggregate().ResourceOwner),
handler.NewCol(projectCreatorCol, e.EditorUser()),
handler.NewCol(projectStateCol, projectActive),
},
), nil
}
func (p *ProjectProjection) reduceProjectChanged(event eventstore.EventReader) ([]handler.Statement, error) {
func (p *ProjectProjection) reduceProjectChanged(event eventstore.EventReader) (*handler.Statement, error) {
e := event.(*project.ProjectChangeEvent)
if e.Name == nil {
return []handler.Statement{crdb.NewNoOpStatement(e)}, nil
return crdb.NewNoOpStatement(e), nil
}
return []handler.Statement{
crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(projectNameCol, e.Name),
handler.NewCol(projectChangeDateCol, e.CreationDate()),
},
[]handler.Condition{
handler.NewCond(projectIDCol, e.Aggregate().ID),
},
),
}, nil
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(projectNameCol, e.Name),
handler.NewCol(projectChangeDateCol, e.CreationDate()),
},
[]handler.Condition{
handler.NewCond(projectIDCol, e.Aggregate().ID),
},
), nil
}
func (p *ProjectProjection) reduceProjectDeactivated(event eventstore.EventReader) ([]handler.Statement, error) {
func (p *ProjectProjection) reduceProjectDeactivated(event eventstore.EventReader) (*handler.Statement, error) {
e := event.(*project.ProjectDeactivatedEvent)
return []handler.Statement{
crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(projectStateCol, projectInactive),
handler.NewCol(projectChangeDateCol, e.CreationDate()),
},
[]handler.Condition{
handler.NewCond(projectIDCol, e.Aggregate().ID),
},
),
}, nil
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(projectStateCol, projectInactive),
handler.NewCol(projectChangeDateCol, e.CreationDate()),
},
[]handler.Condition{
handler.NewCond(projectIDCol, e.Aggregate().ID),
},
), nil
}
func (p *ProjectProjection) reduceProjectReactivated(event eventstore.EventReader) ([]handler.Statement, error) {
func (p *ProjectProjection) reduceProjectReactivated(event eventstore.EventReader) (*handler.Statement, error) {
e := event.(*project.ProjectReactivatedEvent)
return []handler.Statement{
crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(projectStateCol, projectActive),
handler.NewCol(projectChangeDateCol, e.CreationDate()),
},
[]handler.Condition{
handler.NewCond(projectIDCol, e.Aggregate().ID),
},
),
}, nil
return crdb.NewUpdateStatement(
e,
[]handler.Column{
handler.NewCol(projectStateCol, projectActive),
handler.NewCol(projectChangeDateCol, e.CreationDate()),
},
[]handler.Condition{
handler.NewCond(projectIDCol, e.Aggregate().ID),
},
), nil
}
func (p *ProjectProjection) reduceProjectRemoved(event eventstore.EventReader) ([]handler.Statement, error) {
func (p *ProjectProjection) reduceProjectRemoved(event eventstore.EventReader) (*handler.Statement, error) {
e := event.(*project.ProjectRemovedEvent)
return []handler.Statement{
crdb.NewDeleteStatement(
e,
[]handler.Condition{
handler.NewCond(projectIDCol, e.Aggregate().ID),
},
),
}, nil
return crdb.NewDeleteStatement(
e,
[]handler.Condition{
handler.NewCond(projectIDCol, e.Aggregate().ID),
},
), nil
}