refactor(query): use new packages for org by id query (#7826)

If the feature is enabled the new packages are used to query org by id

Part of: https://github.com/zitadel/zitadel/issues/7639

### Definition of Ready

- [x] I am happy with the code
- [x] Short description of the feature/issue is added in the pr
description
- [x] PR is linked to the corresponding user story
- [ ] Acceptance criteria are met
- [ ] All open todos and follow ups are defined in a new ticket and
justified
- [ ] Deviations from the acceptance criteria and design are agreed with
the PO and documented.
- [x] No debug or dead code
- [x] My code has no repetitions
- [ ] Critical parts are tested automatically
- [ ] Where possible E2E tests are implemented
- [ ] Documentation/examples are up-to-date
- [ ] All non-functional requirements are met
- [x] Functionality of the acceptance criteria is checked manually on
the dev system.
This commit is contained in:
Silvan
2024-05-24 13:32:57 +02:00
committed by GitHub
parent e58869c090
commit 0bfcf2c317
27 changed files with 587 additions and 104 deletions

View File

@@ -0,0 +1,57 @@
package projection
import (
"github.com/zitadel/zitadel/internal/v2/eventstore"
"github.com/zitadel/zitadel/internal/v2/org"
)
type OrgPrimaryDomain struct {
projection
id string
Domain string
}
func NewOrgPrimaryDomain(id string) *OrgPrimaryDomain {
return &OrgPrimaryDomain{
id: id,
}
}
func (p *OrgPrimaryDomain) Filter() []*eventstore.Filter {
return []*eventstore.Filter{
eventstore.NewFilter(
eventstore.FilterPagination(
eventstore.GlobalPositionGreater(&p.position),
),
eventstore.AppendAggregateFilter(
org.AggregateType,
eventstore.AggregateIDs(p.id),
eventstore.AppendEvent(
eventstore.SetEventTypes(org.DomainPrimarySetType),
),
),
),
}
}
func (p *OrgPrimaryDomain) Reduce(events ...*eventstore.StorageEvent) error {
for _, event := range events {
if !p.shouldReduce(event) {
continue
}
if event.Type != org.DomainPrimarySetType {
continue
}
e, err := org.DomainPrimarySetEventFromStorage(event)
if err != nil {
return err
}
p.Domain = e.Payload.Name
p.projection.reduce(event)
}
return nil
}

View File

@@ -0,0 +1,67 @@
package projection
import (
"github.com/zitadel/zitadel/internal/v2/eventstore"
"github.com/zitadel/zitadel/internal/v2/org"
)
type OrgState struct {
projection
id string
org.State
}
func NewStateProjection(id string) *OrgState {
// TODO: check buffer for id and return from buffer if exists
return &OrgState{
id: id,
}
}
func (p *OrgState) Filter() []*eventstore.Filter {
return []*eventstore.Filter{
eventstore.NewFilter(
eventstore.FilterPagination(
eventstore.Descending(),
eventstore.GlobalPositionGreater(&p.position),
),
eventstore.AppendAggregateFilter(
org.AggregateType,
eventstore.AggregateIDs(p.id),
eventstore.AppendEvent(
eventstore.SetEventTypes(
org.AddedType,
org.DeactivatedType,
org.ReactivatedType,
org.RemovedType,
),
),
),
),
}
}
func (p *OrgState) Reduce(events ...*eventstore.StorageEvent) error {
for _, event := range events {
if !p.shouldReduce(event) {
continue
}
switch event.Type {
case org.AddedType:
p.State = org.ActiveState
case org.DeactivatedType:
p.State = org.InactiveState
case org.ReactivatedType:
p.State = org.ActiveState
case org.RemovedType:
p.State = org.RemovedState
default:
continue
}
p.position = event.Position
}
return nil
}

View File

@@ -0,0 +1,20 @@
package projection
import "github.com/zitadel/zitadel/internal/v2/eventstore"
type projection struct {
instance string
position eventstore.GlobalPosition
}
func (p *projection) reduce(event *eventstore.StorageEvent) {
if p.instance == "" {
p.instance = event.Aggregate.Instance
}
p.position = event.Position
}
func (p *projection) shouldReduce(event *eventstore.StorageEvent) bool {
shouldReduce := p.instance == "" || p.instance == event.Aggregate.Instance
return shouldReduce && p.position.IsLess(event.Position)
}

View File

@@ -0,0 +1,68 @@
package readmodel
import (
"time"
"github.com/zitadel/zitadel/internal/v2/eventstore"
"github.com/zitadel/zitadel/internal/v2/org"
"github.com/zitadel/zitadel/internal/v2/projection"
)
type Org struct {
ID string
Name string
PrimaryDomain *projection.OrgPrimaryDomain
State *projection.OrgState
Sequence uint32
CreationDate time.Time
ChangeDate time.Time
Owner string
}
func NewOrg(id string) *Org {
return &Org{
ID: id,
State: projection.NewStateProjection(id),
PrimaryDomain: projection.NewOrgPrimaryDomain(id),
}
}
func (rm *Org) Filter() []*eventstore.Filter {
return []*eventstore.Filter{
// we don't need the filters of the projections as we filter all events of the read model
eventstore.NewFilter(
eventstore.AppendAggregateFilter(
org.AggregateType,
eventstore.SetAggregateID(rm.ID),
),
),
}
}
func (rm *Org) Reduce(events ...*eventstore.StorageEvent) error {
for _, event := range events {
switch event.Type {
case org.AddedType:
added, err := org.AddedEventFromStorage(event)
if err != nil {
return err
}
rm.Name = added.Payload.Name
rm.Owner = event.Aggregate.Owner
rm.CreationDate = event.CreatedAt
case org.ChangedType:
changed, err := org.ChangedEventFromStorage(event)
if err != nil {
return err
}
rm.Name = changed.Payload.Name
}
rm.Sequence = event.Sequence
rm.ChangeDate = event.CreatedAt
}
if err := rm.State.Reduce(events...); err != nil {
return err
}
return rm.PrimaryDomain.Reduce(events...)
}

View File

@@ -0,0 +1,15 @@
package readmodel
import (
"database/sql"
"github.com/zitadel/zitadel/internal/v2/eventstore"
)
type QueryOpt func(opts []eventstore.QueryOpt) []eventstore.QueryOpt
func WithTx(tx *sql.Tx) QueryOpt {
return func(opts []eventstore.QueryOpt) []eventstore.QueryOpt {
return append(opts, eventstore.SetQueryTx(tx))
}
}