mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-12 13:37:35 +00:00
fixup! fix(import/export): allow import of deleted resoruces
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
|||||||
"github.com/zitadel/zitadel/internal/domain"
|
"github.com/zitadel/zitadel/internal/domain"
|
||||||
"github.com/zitadel/zitadel/internal/eventstore"
|
"github.com/zitadel/zitadel/internal/eventstore"
|
||||||
"github.com/zitadel/zitadel/internal/repository/member"
|
"github.com/zitadel/zitadel/internal/repository/member"
|
||||||
|
"github.com/zitadel/zitadel/internal/repository/org"
|
||||||
)
|
)
|
||||||
|
|
||||||
type MemberWriteModel struct {
|
type MemberWriteModel struct {
|
||||||
@@ -30,7 +31,7 @@ func (wm *MemberWriteModel) Reduce() error {
|
|||||||
wm.State = domain.MemberStateActive
|
wm.State = domain.MemberStateActive
|
||||||
case *member.MemberChangedEvent:
|
case *member.MemberChangedEvent:
|
||||||
wm.Roles = e.Roles
|
wm.Roles = e.Roles
|
||||||
case *member.MemberRemovedEvent:
|
case *member.MemberRemovedEvent, *org.OrgRemovedEvent:
|
||||||
wm.Roles = nil
|
wm.Roles = nil
|
||||||
wm.State = domain.MemberStateRemoved
|
wm.State = domain.MemberStateRemoved
|
||||||
}
|
}
|
||||||
|
@@ -515,6 +515,10 @@ func (c *Commands) prepareRemoveOrg(a *org.Aggregate) preparation.Validation {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
members, err := OrgMembers(ctx, filter, a.ID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
domains, err := OrgDomains(ctx, filter, a.ID)
|
domains, err := OrgDomains(ctx, filter, a.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -527,7 +531,7 @@ func (c *Commands) prepareRemoveOrg(a *org.Aggregate) preparation.Validation {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return []eventstore.Command{org.NewOrgRemovedEvent(ctx, &a.Aggregate, writeModel.Name, usernames, domainPolicy.UserLoginMustBeDomain, domains, links, entityIds)}, nil
|
return []eventstore.Command{org.NewOrgRemovedEvent(ctx, &a.Aggregate, writeModel.Name, usernames, members, domainPolicy.UserLoginMustBeDomain, domains, links, entityIds)}, nil
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -661,6 +665,46 @@ type userIDName struct {
|
|||||||
id string
|
id string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func OrgMembers(ctx context.Context, filter preparation.FilterToQueryReducer, orgID string) ([]string, error) {
|
||||||
|
events, err := filter(ctx, eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||||
|
ResourceOwner(orgID).
|
||||||
|
OrderAsc().
|
||||||
|
AddQuery().
|
||||||
|
AggregateTypes(org.AggregateType).
|
||||||
|
EventTypes(
|
||||||
|
org.MemberAddedEventType,
|
||||||
|
org.MemberRemovedEventType,
|
||||||
|
org.MemberCascadeRemovedEventType,
|
||||||
|
).Builder())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
ids := make([]string, 0)
|
||||||
|
for _, event := range events {
|
||||||
|
switch eventTyped := event.(type) {
|
||||||
|
case *org.MemberAddedEvent:
|
||||||
|
ids = append(ids, eventTyped.UserID)
|
||||||
|
case *org.MemberRemovedEvent:
|
||||||
|
for i := range ids {
|
||||||
|
if ids[i] == eventTyped.UserID {
|
||||||
|
ids[i] = ids[len(ids)-1]
|
||||||
|
ids = ids[:len(ids)-1]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case *org.MemberCascadeRemovedEvent:
|
||||||
|
for i := range ids {
|
||||||
|
if ids[i] == eventTyped.UserID {
|
||||||
|
ids[i] = ids[len(ids)-1]
|
||||||
|
ids = ids[:len(ids)-1]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ids, nil
|
||||||
|
}
|
||||||
|
|
||||||
func OrgUsers(ctx context.Context, filter preparation.FilterToQueryReducer, orgID string) ([]string, error) {
|
func OrgUsers(ctx context.Context, filter preparation.FilterToQueryReducer, orgID string) ([]string, error) {
|
||||||
events, err := filter(ctx, eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
events, err := filter(ctx, eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||||
InstanceID(authz.GetInstance(ctx).InstanceID()).
|
InstanceID(authz.GetInstance(ctx).InstanceID()).
|
||||||
@@ -712,8 +756,10 @@ func OrgUsers(ctx context.Context, filter preparation.FilterToQueryReducer, orgI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
names := make([]string, len(users))
|
names := make([]string, len(users))
|
||||||
|
ids := make([]string, len(users))
|
||||||
for i := range users {
|
for i := range users {
|
||||||
names[i] = users[i].name
|
names[i] = users[i].name
|
||||||
|
ids[i] = users[i].id
|
||||||
}
|
}
|
||||||
return names, nil
|
return names, nil
|
||||||
}
|
}
|
||||||
|
@@ -59,6 +59,8 @@ func (wm *OrgDomainWriteModel) AppendEvents(events ...eventstore.Event) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
wm.WriteModel.AppendEvents(e)
|
wm.WriteModel.AppendEvents(e)
|
||||||
|
case *org.OrgRemovedEvent:
|
||||||
|
wm.WriteModel.AppendEvents(e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -76,7 +78,7 @@ func (wm *OrgDomainWriteModel) Reduce() error {
|
|||||||
wm.Verified = true
|
wm.Verified = true
|
||||||
case *org.DomainPrimarySetEvent:
|
case *org.DomainPrimarySetEvent:
|
||||||
wm.Primary = e.Domain == wm.Domain
|
wm.Primary = e.Domain == wm.Domain
|
||||||
case *org.DomainRemovedEvent:
|
case *org.DomainRemovedEvent, *org.OrgRemovedEvent:
|
||||||
wm.State = domain.OrgDomainStateRemoved
|
wm.State = domain.OrgDomainStateRemoved
|
||||||
wm.Verified = false
|
wm.Verified = false
|
||||||
wm.Primary = false
|
wm.Primary = false
|
||||||
@@ -99,7 +101,8 @@ func (wm *OrgDomainWriteModel) Query() *eventstore.SearchQueryBuilder {
|
|||||||
org.OrgDomainVerificationAddedEventType,
|
org.OrgDomainVerificationAddedEventType,
|
||||||
org.OrgDomainVerifiedEventType,
|
org.OrgDomainVerifiedEventType,
|
||||||
org.OrgDomainPrimarySetEventType,
|
org.OrgDomainPrimarySetEventType,
|
||||||
org.OrgDomainRemovedEventType).
|
org.OrgDomainRemovedEventType,
|
||||||
|
org.OrgRemovedEventType).
|
||||||
Builder()
|
Builder()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -44,6 +44,8 @@ func (wm *OrgMemberWriteModel) AppendEvents(events ...eventstore.Event) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
wm.MemberWriteModel.AppendEvents(&e.MemberCascadeRemovedEvent)
|
wm.MemberWriteModel.AppendEvents(&e.MemberCascadeRemovedEvent)
|
||||||
|
case *org.OrgRemovedEvent:
|
||||||
|
wm.MemberWriteModel.AppendEvents(e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -62,6 +64,7 @@ func (wm *OrgMemberWriteModel) Query() *eventstore.SearchQueryBuilder {
|
|||||||
org.MemberAddedEventType,
|
org.MemberAddedEventType,
|
||||||
org.MemberChangedEventType,
|
org.MemberChangedEventType,
|
||||||
org.MemberRemovedEventType,
|
org.MemberRemovedEventType,
|
||||||
org.MemberCascadeRemovedEventType).
|
org.MemberCascadeRemovedEventType,
|
||||||
|
org.OrgRemovedEventType).
|
||||||
Builder()
|
Builder()
|
||||||
}
|
}
|
||||||
|
@@ -5,6 +5,7 @@ import (
|
|||||||
|
|
||||||
"github.com/zitadel/zitadel/internal/domain"
|
"github.com/zitadel/zitadel/internal/domain"
|
||||||
"github.com/zitadel/zitadel/internal/eventstore"
|
"github.com/zitadel/zitadel/internal/eventstore"
|
||||||
|
"github.com/zitadel/zitadel/internal/repository/member"
|
||||||
"github.com/zitadel/zitadel/internal/repository/project"
|
"github.com/zitadel/zitadel/internal/repository/project"
|
||||||
"github.com/zitadel/zitadel/internal/repository/user"
|
"github.com/zitadel/zitadel/internal/repository/user"
|
||||||
"github.com/zitadel/zitadel/internal/zerrors"
|
"github.com/zitadel/zitadel/internal/zerrors"
|
||||||
@@ -278,6 +279,7 @@ type OrgRemovedEvent struct {
|
|||||||
eventstore.BaseEvent `json:"-"`
|
eventstore.BaseEvent `json:"-"`
|
||||||
name string
|
name string
|
||||||
usernames []string
|
usernames []string
|
||||||
|
members []string
|
||||||
loginMustBeDomain bool
|
loginMustBeDomain bool
|
||||||
domains []string
|
domains []string
|
||||||
externalIDPs []*domain.UserIDPLink
|
externalIDPs []*domain.UserIDPLink
|
||||||
@@ -295,6 +297,9 @@ func (e *OrgRemovedEvent) UniqueConstraints() []*eventstore.UniqueConstraint {
|
|||||||
for _, name := range e.usernames {
|
for _, name := range e.usernames {
|
||||||
constraints = append(constraints, user.NewRemoveUsernameUniqueConstraint(name, e.Aggregate().ID, e.loginMustBeDomain))
|
constraints = append(constraints, user.NewRemoveUsernameUniqueConstraint(name, e.Aggregate().ID, e.loginMustBeDomain))
|
||||||
}
|
}
|
||||||
|
for _, id := range e.members {
|
||||||
|
constraints = append(constraints, member.NewRemoveMemberUniqueConstraint(e.Aggregate().ID, id))
|
||||||
|
}
|
||||||
for _, domain := range e.domains {
|
for _, domain := range e.domains {
|
||||||
constraints = append(constraints, NewRemoveOrgDomainUniqueConstraint(domain))
|
constraints = append(constraints, NewRemoveOrgDomainUniqueConstraint(domain))
|
||||||
}
|
}
|
||||||
@@ -314,7 +319,7 @@ func (e *OrgRemovedEvent) Fields() []*eventstore.FieldOperation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewOrgRemovedEvent(ctx context.Context, aggregate *eventstore.Aggregate, name string, usernames []string, loginMustBeDomain bool, domains []string, externalIDPs []*domain.UserIDPLink, samlEntityIDs []string) *OrgRemovedEvent {
|
func NewOrgRemovedEvent(ctx context.Context, aggregate *eventstore.Aggregate, name string, usernames []string, members []string, loginMustBeDomain bool, domains []string, externalIDPs []*domain.UserIDPLink, samlEntityIDs []string) *OrgRemovedEvent {
|
||||||
return &OrgRemovedEvent{
|
return &OrgRemovedEvent{
|
||||||
BaseEvent: *eventstore.NewBaseEventForPush(
|
BaseEvent: *eventstore.NewBaseEventForPush(
|
||||||
ctx,
|
ctx,
|
||||||
@@ -323,6 +328,7 @@ func NewOrgRemovedEvent(ctx context.Context, aggregate *eventstore.Aggregate, na
|
|||||||
),
|
),
|
||||||
name: name,
|
name: name,
|
||||||
usernames: usernames,
|
usernames: usernames,
|
||||||
|
members: members,
|
||||||
domains: domains,
|
domains: domains,
|
||||||
externalIDPs: externalIDPs,
|
externalIDPs: externalIDPs,
|
||||||
samlEntityIDs: samlEntityIDs,
|
samlEntityIDs: samlEntityIDs,
|
||||||
|
Reference in New Issue
Block a user