fix: Remove user with cascading memberships (#1811)

* fix: remove usermemberships on user remove

* fix: text user remove with memberships

* fix: translations

* Update internal/iam/repository/eventsourcing/model/types.go

Co-authored-by: Livio Amstutz <livio.a@gmail.com>

* fix: uncomment tests

* fix: remove memberships if user removed

Co-authored-by: Livio Amstutz <livio.a@gmail.com>
This commit is contained in:
Fabi
2021-06-07 07:20:47 +02:00
committed by GitHub
parent 9ffc9d9330
commit 1143e3773e
52 changed files with 693 additions and 84 deletions

View File

@@ -298,6 +298,14 @@ func (repo *UserRepo) SearchUserMemberships(ctx context.Context, request *usr_mo
return result, nil
}
func (repo *UserRepo) UserMembershipsByUserID(ctx context.Context, userID string) ([]*usr_model.UserMembershipView, error) {
memberships, err := repo.View.UserMembershipsByUserID(userID)
if err != nil {
return nil, err
}
return model.UserMembershipsToModel(memberships), nil
}
func (r *UserRepo) getUserChanges(ctx context.Context, userID string, lastSequence uint64, limit uint64, sortAscending bool, retention time.Duration) (*usr_model.UserChanges, error) {
query := usr_view.ChangesQuery(userID, lastSequence, limit, sortAscending, retention)

View File

@@ -109,7 +109,8 @@ func (m *OrgMember) processOrgMember(event *es_models.Event) (err error) {
return err
}
err = member.AppendEvent(event)
case model.OrgMemberRemoved:
case model.OrgMemberRemoved,
model.OrgMemberCascadeRemoved:
err = member.SetData(event)
if err != nil {
return err

View File

@@ -111,7 +111,8 @@ func (p *ProjectGrantMember) processProjectGrantMember(event *es_models.Event) (
return err
}
err = member.AppendEvent(event)
case proj_es_model.ProjectGrantMemberRemoved:
case proj_es_model.ProjectGrantMemberRemoved,
proj_es_model.ProjectGrantMemberCascadeRemoved:
err = member.SetData(event)
if err != nil {
return err
@@ -154,9 +155,12 @@ func (p *ProjectGrantMember) processUser(event *es_models.Event) (err error) {
p.fillUserData(member, user)
}
return p.view.PutProjectGrantMembers(members, event)
case usr_es_model.UserRemoved:
p.view.DeleteProjectGrantMembersByUserID(event.AggregateID)
default:
return p.view.ProcessedProjectGrantMemberSequence(event)
}
return nil
}
func (p *ProjectGrantMember) fillData(member *view_model.ProjectGrantMemberView) (err error) {

View File

@@ -111,7 +111,7 @@ func (p *ProjectMember) processProjectMember(event *es_models.Event) (err error)
return err
}
err = member.AppendEvent(event)
case proj_es_model.ProjectMemberRemoved:
case proj_es_model.ProjectMemberRemoved, proj_es_model.ProjectMemberCascadeRemoved:
err = member.SetData(event)
if err != nil {
return err
@@ -150,6 +150,8 @@ func (p *ProjectMember) processUser(event *es_models.Event) (err error) {
p.fillUserData(member, user)
}
return p.view.PutProjectMembers(members, event)
case usr_es_model.UserRemoved:
p.view.DeleteProjectMembersByUserID(event.AggregateID)
default:
return p.view.ProcessedProjectMemberSequence(event)
}

View File

@@ -107,7 +107,8 @@ func (m *UserMembership) processIAM(event *es_models.Event) (err error) {
return err
}
err = member.AppendEvent(event)
case iam_es_model.IAMMemberRemoved:
case iam_es_model.IAMMemberRemoved,
iam_es_model.IAMMemberCascadeRemoved:
return m.view.DeleteUserMembership(member.UserID, event.AggregateID, event.AggregateID, usr_model.MemberTypeIam, event)
default:
return m.view.ProcessedUserMembershipSequence(event)
@@ -137,7 +138,7 @@ func (m *UserMembership) processOrg(event *es_models.Event) (err error) {
return err
}
err = member.AppendEvent(event)
case org_es_model.OrgMemberRemoved:
case org_es_model.OrgMemberRemoved, org_es_model.OrgMemberCascadeRemoved:
return m.view.DeleteUserMembership(member.UserID, event.AggregateID, event.AggregateID, usr_model.MemberTypeOrganisation, event)
case org_es_model.OrgChanged:
return m.updateOrgDisplayName(event)
@@ -190,7 +191,7 @@ func (m *UserMembership) processProject(event *es_models.Event) (err error) {
return err
}
err = member.AppendEvent(event)
case proj_es_model.ProjectMemberRemoved:
case proj_es_model.ProjectMemberRemoved, proj_es_model.ProjectMemberCascadeRemoved:
return m.view.DeleteUserMembership(member.UserID, event.AggregateID, event.AggregateID, usr_model.MemberTypeProject, event)
case proj_es_model.ProjectGrantMemberChanged:
member, err = m.view.UserMembershipByIDs(member.UserID, event.AggregateID, member.ObjectID, usr_model.MemberTypeProjectGrant)
@@ -198,7 +199,8 @@ func (m *UserMembership) processProject(event *es_models.Event) (err error) {
return err
}
err = member.AppendEvent(event)
case proj_es_model.ProjectGrantMemberRemoved:
case proj_es_model.ProjectGrantMemberRemoved,
proj_es_model.ProjectGrantMemberCascadeRemoved:
return m.view.DeleteUserMembership(member.UserID, event.AggregateID, member.ObjectID, usr_model.MemberTypeProjectGrant, event)
case proj_es_model.ProjectChanged:
return m.updateProjectDisplayName(event)

View File

@@ -57,6 +57,10 @@ func (v *View) DeleteProjectGrantMembersByProjectID(projectID string) error {
return view.DeleteProjectGrantMembersByProjectID(v.Db, projectGrantMemberTable, projectID)
}
func (v *View) DeleteProjectGrantMembersByUserID(userID string) error {
return view.DeleteProjectGrantMembersByUserID(v.Db, projectGrantMemberTable, userID)
}
func (v *View) GetLatestProjectGrantMemberSequence() (*repository.CurrentSequence, error) {
return v.latestSequence(projectGrantMemberTable)
}

View File

@@ -57,6 +57,10 @@ func (v *View) DeleteProjectMembersByProjectID(projectID string) error {
return view.DeleteProjectMembersByProjectID(v.Db, projectMemberTable, projectID)
}
func (v *View) DeleteProjectMembersByUserID(userID string) error {
return view.DeleteProjectMembersByUserID(v.Db, projectMemberTable, userID)
}
func (v *View) GetLatestProjectMemberSequence() (*repository.CurrentSequence, error) {
return v.latestSequence(projectMemberTable)
}

View File

@@ -21,6 +21,10 @@ func (v *View) UserMembershipsByAggregateID(aggregateID string) ([]*model.UserMe
return view.UserMembershipsByAggregateID(v.Db, userMembershipTable, aggregateID)
}
func (v *View) UserMembershipsByUserID(userID string) ([]*model.UserMembershipView, error) {
return view.UserMembershipsByUserID(v.Db, userMembershipTable, userID)
}
func (v *View) SearchUserMemberships(request *usr_model.UserMembershipSearchRequest) ([]*model.UserMembershipView, uint64, error) {
return view.SearchUserMemberships(v.Db, userMembershipTable, request)
}

View File

@@ -38,4 +38,5 @@ type UserRepository interface {
AddressByID(ctx context.Context, userID string) (*model.Address, error)
SearchUserMemberships(ctx context.Context, request *model.UserMembershipSearchRequest) (*model.UserMembershipSearchResponse, error)
UserMembershipsByUserID(ctx context.Context, userID string) ([]*model.UserMembershipView, error)
}