Files
zitadel/internal/command/project_model.go
T

140 lines
4.3 KiB
Go
Raw Normal View History

2021-01-12 12:59:51 +01:00
package command
import (
2021-01-28 06:35:26 +01:00
"context"
2025-06-27 17:25:44 +02:00
"slices"
2021-07-06 13:55:57 +02:00
2022-04-27 01:01:45 +02:00
"github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/eventstore"
"github.com/zitadel/zitadel/internal/repository/project"
2021-01-12 12:59:51 +01:00
)
type ProjectWriteModel struct {
eventstore.WriteModel
Name string
ProjectRoleAssertion bool
ProjectRoleCheck bool
HasProjectCheck bool
PrivateLabelingSetting domain.PrivateLabelingSetting
State domain.ProjectState
2021-01-12 12:59:51 +01:00
}
func NewProjectWriteModel(projectID string, resourceOwner string) *ProjectWriteModel {
return &ProjectWriteModel{
WriteModel: eventstore.WriteModel{
AggregateID: projectID,
ResourceOwner: resourceOwner,
},
}
}
func (wm *ProjectWriteModel) Reduce() error {
for _, event := range wm.Events {
switch e := event.(type) {
case *project.ProjectAddedEvent:
wm.Name = e.Name
2021-01-28 06:35:26 +01:00
wm.ProjectRoleAssertion = e.ProjectRoleAssertion
wm.ProjectRoleCheck = e.ProjectRoleCheck
2021-08-18 10:49:04 +02:00
wm.HasProjectCheck = e.HasProjectCheck
wm.PrivateLabelingSetting = e.PrivateLabelingSetting
2021-01-12 12:59:51 +01:00
wm.State = domain.ProjectStateActive
2021-01-28 06:35:26 +01:00
case *project.ProjectChangeEvent:
if e.Name != nil {
wm.Name = *e.Name
}
if e.ProjectRoleAssertion != nil {
wm.ProjectRoleAssertion = *e.ProjectRoleAssertion
}
if e.ProjectRoleCheck != nil {
wm.ProjectRoleCheck = *e.ProjectRoleCheck
}
2021-08-18 10:49:04 +02:00
if e.HasProjectCheck != nil {
wm.HasProjectCheck = *e.HasProjectCheck
}
if e.PrivateLabelingSetting != nil {
wm.PrivateLabelingSetting = *e.PrivateLabelingSetting
}
2021-01-28 06:35:26 +01:00
case *project.ProjectDeactivatedEvent:
if wm.State == domain.ProjectStateRemoved {
continue
}
wm.State = domain.ProjectStateInactive
case *project.ProjectReactivatedEvent:
if wm.State == domain.ProjectStateRemoved {
continue
}
wm.State = domain.ProjectStateActive
case *project.ProjectRemovedEvent:
wm.Name = ""
wm.ProjectRoleAssertion = false
wm.ProjectRoleCheck = false
wm.HasProjectCheck = false
wm.PrivateLabelingSetting = domain.PrivateLabelingSettingUnspecified
2021-01-28 06:35:26 +01:00
wm.State = domain.ProjectStateRemoved
2021-01-12 12:59:51 +01:00
}
}
2021-01-28 06:35:26 +01:00
return wm.WriteModel.Reduce()
2021-01-12 12:59:51 +01:00
}
func (wm *ProjectWriteModel) Query() *eventstore.SearchQueryBuilder {
2021-07-06 13:55:57 +02:00
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
2021-02-18 14:48:27 +01:00
ResourceOwner(wm.ResourceOwner).
2021-07-06 13:55:57 +02:00
AddQuery().
AggregateTypes(project.AggregateType).
AggregateIDs(wm.AggregateID).
2021-02-18 14:48:27 +01:00
EventTypes(project.ProjectAddedType,
project.ProjectChangedType,
project.ProjectDeactivatedType,
project.ProjectReactivatedType,
2021-07-06 13:55:57 +02:00
project.ProjectRemovedType).
Builder()
2021-01-12 12:59:51 +01:00
}
2021-01-28 06:35:26 +01:00
func (wm *ProjectWriteModel) NewChangedEvent(
ctx context.Context,
2021-02-18 14:48:27 +01:00
aggregate *eventstore.Aggregate,
2025-05-21 14:40:47 +02:00
name *string,
2021-01-28 06:35:26 +01:00
projectRoleAssertion,
2021-08-18 10:49:04 +02:00
projectRoleCheck,
2025-05-21 14:40:47 +02:00
hasProjectCheck *bool,
privateLabelingSetting *domain.PrivateLabelingSetting,
) *project.ProjectChangeEvent {
2021-01-28 06:35:26 +01:00
changes := make([]project.ProjectChanges, 0)
oldName := ""
2025-05-21 14:40:47 +02:00
if name != nil && wm.Name != *name {
oldName = wm.Name
2025-05-21 14:40:47 +02:00
changes = append(changes, project.ChangeName(*name))
2021-01-28 06:35:26 +01:00
}
2025-05-21 14:40:47 +02:00
if projectRoleAssertion != nil && wm.ProjectRoleAssertion != *projectRoleAssertion {
changes = append(changes, project.ChangeProjectRoleAssertion(*projectRoleAssertion))
2021-01-28 06:35:26 +01:00
}
2025-05-21 14:40:47 +02:00
if projectRoleCheck != nil && wm.ProjectRoleCheck != *projectRoleCheck {
changes = append(changes, project.ChangeProjectRoleCheck(*projectRoleCheck))
2021-01-28 06:35:26 +01:00
}
2025-05-21 14:40:47 +02:00
if hasProjectCheck != nil && wm.HasProjectCheck != *hasProjectCheck {
changes = append(changes, project.ChangeHasProjectCheck(*hasProjectCheck))
2021-08-18 10:49:04 +02:00
}
2025-05-21 14:40:47 +02:00
if privateLabelingSetting != nil && wm.PrivateLabelingSetting != *privateLabelingSetting {
changes = append(changes, project.ChangePrivateLabelingSetting(*privateLabelingSetting))
}
2021-01-28 06:35:26 +01:00
if len(changes) == 0 {
2025-05-21 14:40:47 +02:00
return nil
2021-01-28 06:35:26 +01:00
}
2025-05-21 14:40:47 +02:00
return project.NewProjectChangeEvent(ctx, aggregate, oldName, changes)
2021-01-28 06:35:26 +01:00
}
func isProjectStateExists(state domain.ProjectState) bool {
2025-06-27 17:25:44 +02:00
return !slices.Contains([]domain.ProjectState{domain.ProjectStateRemoved, domain.ProjectStateUnspecified}, state)
}
// Deprecated: use ProjectAggregateFromWriteModelWithCTX
2021-02-18 14:48:27 +01:00
func ProjectAggregateFromWriteModel(wm *eventstore.WriteModel) *eventstore.Aggregate {
return eventstore.AggregateFromWriteModel(wm, project.AggregateType, project.AggregateVersion)
2021-01-12 12:59:51 +01:00
}
2025-05-21 14:40:47 +02:00
func ProjectAggregateFromWriteModelWithCTX(ctx context.Context, wm *eventstore.WriteModel) *eventstore.Aggregate {
return project.AggregateFromWriteModel(ctx, wm)
}