mirror of
https://github.com/zitadel/zitadel.git
synced 2024-12-14 20:08:02 +00:00
148 lines
5.2 KiB
Go
148 lines
5.2 KiB
Go
|
package projection
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
"github.com/caos/logging"
|
||
|
"github.com/caos/zitadel/internal/domain"
|
||
|
"github.com/caos/zitadel/internal/errors"
|
||
|
"github.com/caos/zitadel/internal/eventstore"
|
||
|
"github.com/caos/zitadel/internal/eventstore/handler"
|
||
|
"github.com/caos/zitadel/internal/eventstore/handler/crdb"
|
||
|
"github.com/caos/zitadel/internal/repository/iam"
|
||
|
"github.com/caos/zitadel/internal/repository/org"
|
||
|
"github.com/caos/zitadel/internal/repository/policy"
|
||
|
)
|
||
|
|
||
|
type PrivacyPolicyProjection struct {
|
||
|
crdb.StatementHandler
|
||
|
}
|
||
|
|
||
|
const (
|
||
|
PrivacyPolicyTable = "zitadel.projections.privacy_policies"
|
||
|
|
||
|
PrivacyPolicyCreationDateCol = "creation_date"
|
||
|
PrivacyPolicyChangeDateCol = "change_date"
|
||
|
PrivacyPolicySequenceCol = "sequence"
|
||
|
PrivacyPolicyIDCol = "id"
|
||
|
PrivacyPolicyStateCol = "state"
|
||
|
PrivacyPolicyPrivacyLinkCol = "privacy_link"
|
||
|
PrivacyPolicyTOSLinkCol = "tos_link"
|
||
|
PrivacyPolicyIsDefaultCol = "is_default"
|
||
|
PrivacyPolicyResourceOwnerCol = "resource_owner"
|
||
|
)
|
||
|
|
||
|
func NewPrivacyPolicyProjection(ctx context.Context, config crdb.StatementHandlerConfig) *PrivacyPolicyProjection {
|
||
|
p := &PrivacyPolicyProjection{}
|
||
|
config.ProjectionName = PrivacyPolicyTable
|
||
|
config.Reducers = p.reducers()
|
||
|
p.StatementHandler = crdb.NewStatementHandler(ctx, config)
|
||
|
return p
|
||
|
}
|
||
|
|
||
|
func (p *PrivacyPolicyProjection) reducers() []handler.AggregateReducer {
|
||
|
return []handler.AggregateReducer{
|
||
|
{
|
||
|
Aggregate: org.AggregateType,
|
||
|
EventRedusers: []handler.EventReducer{
|
||
|
{
|
||
|
Event: org.PrivacyPolicyAddedEventType,
|
||
|
Reduce: p.reduceAdded,
|
||
|
},
|
||
|
{
|
||
|
Event: org.PrivacyPolicyChangedEventType,
|
||
|
Reduce: p.reduceChanged,
|
||
|
},
|
||
|
{
|
||
|
Event: org.PrivacyPolicyRemovedEventType,
|
||
|
Reduce: p.reduceRemoved,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
Aggregate: iam.AggregateType,
|
||
|
EventRedusers: []handler.EventReducer{
|
||
|
{
|
||
|
Event: iam.PrivacyPolicyAddedEventType,
|
||
|
Reduce: p.reduceAdded,
|
||
|
},
|
||
|
{
|
||
|
Event: iam.PrivacyPolicyChangedEventType,
|
||
|
Reduce: p.reduceChanged,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (p *PrivacyPolicyProjection) reduceAdded(event eventstore.EventReader) (*handler.Statement, error) {
|
||
|
var policyEvent policy.PrivacyPolicyAddedEvent
|
||
|
var isDefault bool
|
||
|
switch e := event.(type) {
|
||
|
case *org.PrivacyPolicyAddedEvent:
|
||
|
policyEvent = e.PrivacyPolicyAddedEvent
|
||
|
isDefault = false
|
||
|
case *iam.PrivacyPolicyAddedEvent:
|
||
|
policyEvent = e.PrivacyPolicyAddedEvent
|
||
|
isDefault = true
|
||
|
default:
|
||
|
logging.LogWithFields("PROJE-BrdLn", "seq", event.Sequence(), "expectedTypes", []eventstore.EventType{org.PrivacyPolicyAddedEventType, iam.PrivacyPolicyAddedEventType}).Error("wrong event type")
|
||
|
return nil, errors.ThrowInvalidArgument(nil, "PROJE-kRNh8", "reduce.wrong.event.type")
|
||
|
}
|
||
|
return crdb.NewCreateStatement(
|
||
|
&policyEvent,
|
||
|
[]handler.Column{
|
||
|
handler.NewCol(PrivacyPolicyCreationDateCol, policyEvent.CreationDate()),
|
||
|
handler.NewCol(PrivacyPolicyChangeDateCol, policyEvent.CreationDate()),
|
||
|
handler.NewCol(PrivacyPolicySequenceCol, policyEvent.Sequence()),
|
||
|
handler.NewCol(PrivacyPolicyIDCol, policyEvent.Aggregate().ID),
|
||
|
handler.NewCol(PrivacyPolicyStateCol, domain.PolicyStateActive),
|
||
|
handler.NewCol(PrivacyPolicyPrivacyLinkCol, policyEvent.PrivacyLink),
|
||
|
handler.NewCol(PrivacyPolicyTOSLinkCol, policyEvent.TOSLink),
|
||
|
handler.NewCol(PrivacyPolicyIsDefaultCol, isDefault),
|
||
|
handler.NewCol(PrivacyPolicyResourceOwnerCol, policyEvent.Aggregate().ResourceOwner),
|
||
|
}), nil
|
||
|
}
|
||
|
|
||
|
func (p *PrivacyPolicyProjection) reduceChanged(event eventstore.EventReader) (*handler.Statement, error) {
|
||
|
var policyEvent policy.PrivacyPolicyChangedEvent
|
||
|
switch e := event.(type) {
|
||
|
case *org.PrivacyPolicyChangedEvent:
|
||
|
policyEvent = e.PrivacyPolicyChangedEvent
|
||
|
case *iam.PrivacyPolicyChangedEvent:
|
||
|
policyEvent = e.PrivacyPolicyChangedEvent
|
||
|
default:
|
||
|
logging.LogWithFields("PROJE-1nQWm", "seq", event.Sequence(), "expectedTypes", []eventstore.EventType{org.PrivacyPolicyChangedEventType, iam.PrivacyPolicyChangedEventType}).Error("wrong event type")
|
||
|
return nil, errors.ThrowInvalidArgument(nil, "PROJE-91weZ", "reduce.wrong.event.type")
|
||
|
}
|
||
|
cols := []handler.Column{
|
||
|
handler.NewCol(PrivacyPolicyChangeDateCol, policyEvent.CreationDate()),
|
||
|
handler.NewCol(PrivacyPolicySequenceCol, policyEvent.Sequence()),
|
||
|
}
|
||
|
if policyEvent.PrivacyLink != nil {
|
||
|
cols = append(cols, handler.NewCol(PrivacyPolicyPrivacyLinkCol, *policyEvent.PrivacyLink))
|
||
|
}
|
||
|
if policyEvent.TOSLink != nil {
|
||
|
cols = append(cols, handler.NewCol(PrivacyPolicyTOSLinkCol, *policyEvent.TOSLink))
|
||
|
}
|
||
|
return crdb.NewUpdateStatement(
|
||
|
&policyEvent,
|
||
|
cols,
|
||
|
[]handler.Condition{
|
||
|
handler.NewCond(PrivacyPolicyIDCol, policyEvent.Aggregate().ID),
|
||
|
}), nil
|
||
|
}
|
||
|
|
||
|
func (p *PrivacyPolicyProjection) reduceRemoved(event eventstore.EventReader) (*handler.Statement, error) {
|
||
|
policyEvent, ok := event.(*org.PrivacyPolicyRemovedEvent)
|
||
|
if !ok {
|
||
|
logging.LogWithFields("PROJE-hN5Ip", "seq", event.Sequence(), "expectedType", org.PrivacyPolicyRemovedEventType).Error("wrong event type")
|
||
|
return nil, errors.ThrowInvalidArgument(nil, "PROJE-FvtGO", "reduce.wrong.event.type")
|
||
|
}
|
||
|
return crdb.NewDeleteStatement(
|
||
|
policyEvent,
|
||
|
[]handler.Condition{
|
||
|
handler.NewCond(PrivacyPolicyIDCol, policyEvent.Aggregate().ID),
|
||
|
}), nil
|
||
|
}
|