From 5c4fef296fa1bd89a3dfc1092c28ae2adcaf39a9 Mon Sep 17 00:00:00 2001 From: Fabi <38692350+fgerschwiler@users.noreply.github.com> Date: Thu, 13 Aug 2020 08:28:18 +0200 Subject: [PATCH] fix: app by id, views with computed objects (#583) * feat: read app by id if my events * fix: handlers if no sublist * fix: removed app * fix: removed project * fix: removed app * fix: removed app * fix: app by id with projectid --- docs/local.md | 1 + .../eventsourcing/handler/iam_member.go | 3 ++ .../eventsourcing/handler/application.go | 2 +- .../eventsourcing/handler/user_grant.go | 3 ++ .../eventsourcing/view/application.go | 4 +-- .../eventsourcing/handler/application.go | 2 +- .../eventsourcing/view/application.go | 4 +-- .../eventsourcing/eventstore/project.go | 8 ++++-- .../eventsourcing/handler/application.go | 2 +- .../eventsourcing/handler/org_member.go | 3 ++ .../handler/project_grant_member.go | 3 ++ .../eventsourcing/handler/project_member.go | 3 ++ .../eventsourcing/handler/project_role.go | 2 +- .../eventsourcing/handler/user_grant.go | 6 ++++ .../eventsourcing/view/application.go | 4 +-- internal/project/model/application.go | 1 + .../repository/view/application_view.go | 6 ++-- .../repository/view/model/application.go | 28 +++++++++++++++++++ 18 files changed, 71 insertions(+), 14 deletions(-) diff --git a/docs/local.md b/docs/local.md index b0167da6a9..e6585cf306 100644 --- a/docs/local.md +++ b/docs/local.md @@ -31,3 +31,4 @@ cockroachdb/cockroach:latest start --insecure #### Should show eventstore, management, admin, auth `show databases;` + \ No newline at end of file diff --git a/internal/admin/repository/eventsourcing/handler/iam_member.go b/internal/admin/repository/eventsourcing/handler/iam_member.go index aa4e508598..5129147998 100644 --- a/internal/admin/repository/eventsourcing/handler/iam_member.go +++ b/internal/admin/repository/eventsourcing/handler/iam_member.go @@ -87,6 +87,9 @@ func (m *IamMember) processUser(event *models.Event) (err error) { if err != nil { return err } + if len(members) == 0 { + return m.view.ProcessedIamMemberSequence(event.Sequence) + } user, err := m.userEvents.UserByID(context.Background(), event.AggregateID) if err != nil { return err diff --git a/internal/auth/repository/eventsourcing/handler/application.go b/internal/auth/repository/eventsourcing/handler/application.go index 84441b9721..7e16892efc 100644 --- a/internal/auth/repository/eventsourcing/handler/application.go +++ b/internal/auth/repository/eventsourcing/handler/application.go @@ -46,7 +46,7 @@ func (p *Application) Reduce(event *models.Event) (err error) { if err != nil { return err } - app, err = p.view.ApplicationByID(app.ID) + app, err = p.view.ApplicationByID(event.AggregateID, app.ID) if err != nil { return err } diff --git a/internal/auth/repository/eventsourcing/handler/user_grant.go b/internal/auth/repository/eventsourcing/handler/user_grant.go index 0f2cd2241f..1370c95124 100644 --- a/internal/auth/repository/eventsourcing/handler/user_grant.go +++ b/internal/auth/repository/eventsourcing/handler/user_grant.go @@ -115,6 +115,9 @@ func (u *UserGrant) processUser(event *models.Event) (err error) { if err != nil { return err } + if len(grants) == 0 { + return u.view.ProcessedUserGrantSequence(event.Sequence) + } user, err := u.userEvents.UserByID(context.Background(), event.AggregateID) if err != nil { return err diff --git a/internal/auth/repository/eventsourcing/view/application.go b/internal/auth/repository/eventsourcing/view/application.go index 01d3b3ebc3..5586b457c5 100644 --- a/internal/auth/repository/eventsourcing/view/application.go +++ b/internal/auth/repository/eventsourcing/view/application.go @@ -14,8 +14,8 @@ const ( applicationTable = "auth.applications" ) -func (v *View) ApplicationByID(appID string) (*model.ApplicationView, error) { - return view.ApplicationByID(v.Db, applicationTable, appID) +func (v *View) ApplicationByID(projectID, appID string) (*model.ApplicationView, error) { + return view.ApplicationByID(v.Db, applicationTable, projectID, appID) } func (v *View) SearchApplications(request *proj_model.ApplicationSearchRequest) ([]*model.ApplicationView, uint64, error) { diff --git a/internal/authz/repository/eventsourcing/handler/application.go b/internal/authz/repository/eventsourcing/handler/application.go index c2fac63d28..3b329daa9e 100644 --- a/internal/authz/repository/eventsourcing/handler/application.go +++ b/internal/authz/repository/eventsourcing/handler/application.go @@ -44,7 +44,7 @@ func (p *Application) Reduce(event *models.Event) (err error) { if err != nil { return err } - app, err = p.view.ApplicationByID(app.ID) + app, err = p.view.ApplicationByID(event.AggregateID, app.ID) if err != nil { return err } diff --git a/internal/authz/repository/eventsourcing/view/application.go b/internal/authz/repository/eventsourcing/view/application.go index 8edd1f4f09..63d028719e 100644 --- a/internal/authz/repository/eventsourcing/view/application.go +++ b/internal/authz/repository/eventsourcing/view/application.go @@ -11,8 +11,8 @@ const ( applicationTable = "authz.applications" ) -func (v *View) ApplicationByID(appID string) (*model.ApplicationView, error) { - return view.ApplicationByID(v.Db, applicationTable, appID) +func (v *View) ApplicationByID(projectID, appID string) (*model.ApplicationView, error) { + return view.ApplicationByID(v.Db, applicationTable, projectID, appID) } func (v *View) ApplicationByOIDCClientID(clientID string) (*model.ApplicationView, error) { diff --git a/internal/management/repository/eventsourcing/eventstore/project.go b/internal/management/repository/eventsourcing/eventstore/project.go index 15b89acf52..3e67c5245f 100644 --- a/internal/management/repository/eventsourcing/eventstore/project.go +++ b/internal/management/repository/eventsourcing/eventstore/project.go @@ -297,12 +297,13 @@ func (repo *ProjectRepo) ProjectChanges(ctx context.Context, id string, lastSequ } func (repo *ProjectRepo) ApplicationByID(ctx context.Context, projectID, appID string) (*proj_model.ApplicationView, error) { - app, viewErr := repo.View.ApplicationByID(appID) + app, viewErr := repo.View.ApplicationByID(projectID, appID) if viewErr != nil && !caos_errs.IsNotFound(viewErr) { return nil, viewErr } if caos_errs.IsNotFound(viewErr) { app = new(model.ApplicationView) + app.ID = appID } events, esErr := repo.ProjectEvents.ProjectEventsByID(ctx, projectID, app.Sequence) @@ -317,10 +318,13 @@ func (repo *ProjectRepo) ApplicationByID(ctx context.Context, projectID, appID s viewApp := *app for _, event := range events { - err := app.AppendEvent(event) + err := app.AppendEventIfMyApp(event) if err != nil { return model.ApplicationViewToModel(&viewApp), nil } + if app.State == int32(proj_model.AppStateRemoved) { + return nil, caos_errs.ThrowNotFound(nil, "EVENT-Msl96", "Errors.Application.NotFound") + } } return model.ApplicationViewToModel(app), nil } diff --git a/internal/management/repository/eventsourcing/handler/application.go b/internal/management/repository/eventsourcing/handler/application.go index 57bcf7bb90..bf729e4a94 100644 --- a/internal/management/repository/eventsourcing/handler/application.go +++ b/internal/management/repository/eventsourcing/handler/application.go @@ -46,7 +46,7 @@ func (p *Application) Reduce(event *models.Event) (err error) { if err != nil { return err } - app, err = p.view.ApplicationByID(app.ID) + app, err = p.view.ApplicationByID(event.AggregateID, app.ID) if err != nil { return err } diff --git a/internal/management/repository/eventsourcing/handler/org_member.go b/internal/management/repository/eventsourcing/handler/org_member.go index 56cd35997b..c4c09c3711 100644 --- a/internal/management/repository/eventsourcing/handler/org_member.go +++ b/internal/management/repository/eventsourcing/handler/org_member.go @@ -87,6 +87,9 @@ func (m *OrgMember) processUser(event *models.Event) (err error) { if err != nil { return err } + if len(members) == 0 { + return m.view.ProcessedOrgMemberSequence(event.Sequence) + } user, err := m.userEvents.UserByID(context.Background(), event.AggregateID) if err != nil { return err diff --git a/internal/management/repository/eventsourcing/handler/project_grant_member.go b/internal/management/repository/eventsourcing/handler/project_grant_member.go index 22dfab93de..2e5904c6d9 100644 --- a/internal/management/repository/eventsourcing/handler/project_grant_member.go +++ b/internal/management/repository/eventsourcing/handler/project_grant_member.go @@ -90,6 +90,9 @@ func (p *ProjectGrantMember) processUser(event *models.Event) (err error) { if err != nil { return err } + if len(members) == 0 { + return p.view.ProcessedProjectGrantMemberSequence(event.Sequence) + } user, err := p.userEvents.UserByID(context.Background(), event.AggregateID) if err != nil { return err diff --git a/internal/management/repository/eventsourcing/handler/project_member.go b/internal/management/repository/eventsourcing/handler/project_member.go index 1c40881c33..c0f3a0192f 100644 --- a/internal/management/repository/eventsourcing/handler/project_member.go +++ b/internal/management/repository/eventsourcing/handler/project_member.go @@ -89,6 +89,9 @@ func (p *ProjectMember) processUser(event *models.Event) (err error) { if err != nil { return err } + if len(members) == 0 { + return p.view.ProcessedProjectGrantMemberSequence(event.Sequence) + } user, err := p.userEvents.UserByID(context.Background(), event.AggregateID) if err != nil { return err diff --git a/internal/management/repository/eventsourcing/handler/project_role.go b/internal/management/repository/eventsourcing/handler/project_role.go index 08c035eb68..a3c01f5af0 100644 --- a/internal/management/repository/eventsourcing/handler/project_role.go +++ b/internal/management/repository/eventsourcing/handler/project_role.go @@ -36,7 +36,7 @@ func (p *ProjectRole) Reduce(event *models.Event) (err error) { role := new(view_model.ProjectRoleView) switch event.Type { case es_model.ProjectRoleAdded: - role.AppendEvent(event) + err = role.AppendEvent(event) case es_model.ProjectRoleChanged: err := role.SetData(event) if err != nil { diff --git a/internal/management/repository/eventsourcing/handler/user_grant.go b/internal/management/repository/eventsourcing/handler/user_grant.go index 8c4bdef4aa..b4d31654aa 100644 --- a/internal/management/repository/eventsourcing/handler/user_grant.go +++ b/internal/management/repository/eventsourcing/handler/user_grant.go @@ -97,6 +97,9 @@ func (u *UserGrant) processUser(event *models.Event) (err error) { if err != nil { return err } + if len(grants) == 0 { + return u.view.ProcessedUserGrantSequence(event.Sequence) + } user, err := u.userEvents.UserByID(context.Background(), event.AggregateID) if err != nil { return err @@ -121,6 +124,9 @@ func (u *UserGrant) processProject(event *models.Event) (err error) { if err != nil { return err } + if len(grants) == 0 { + return u.view.ProcessedUserGrantSequence(event.Sequence) + } project, err := u.projectEvents.ProjectByID(context.Background(), event.AggregateID) if err != nil { return err diff --git a/internal/management/repository/eventsourcing/view/application.go b/internal/management/repository/eventsourcing/view/application.go index d9f86611c2..53c2dbe687 100644 --- a/internal/management/repository/eventsourcing/view/application.go +++ b/internal/management/repository/eventsourcing/view/application.go @@ -11,8 +11,8 @@ const ( applicationTable = "management.applications" ) -func (v *View) ApplicationByID(appID string) (*model.ApplicationView, error) { - return view.ApplicationByID(v.Db, applicationTable, appID) +func (v *View) ApplicationByID(projectID, appID string) (*model.ApplicationView, error) { + return view.ApplicationByID(v.Db, applicationTable, projectID, appID) } func (v *View) ApplicationsByProjectID(ProjectID string) ([]*model.ApplicationView, error) { diff --git a/internal/project/model/application.go b/internal/project/model/application.go index 636f115839..d3dd028810 100644 --- a/internal/project/model/application.go +++ b/internal/project/model/application.go @@ -33,6 +33,7 @@ type AppState int32 const ( AppStateActive AppState = iota AppStateInactive + AppStateRemoved ) type AppType int32 diff --git a/internal/project/repository/view/application_view.go b/internal/project/repository/view/application_view.go index 7bd6b47f59..e871b690b8 100644 --- a/internal/project/repository/view/application_view.go +++ b/internal/project/repository/view/application_view.go @@ -9,9 +9,11 @@ import ( "github.com/jinzhu/gorm" ) -func ApplicationByID(db *gorm.DB, table, appID string) (*model.ApplicationView, error) { +func ApplicationByID(db *gorm.DB, table, projectID, appID string) (*model.ApplicationView, error) { app := new(model.ApplicationView) - query := repository.PrepareGetByKey(table, model.ApplicationSearchKey(proj_model.AppSearchKeyAppID), appID) + projectIDQuery := &model.ApplicationSearchQuery{Key: proj_model.AppSearchKeyProjectID, Value: projectID, Method: global_model.SearchMethodEquals} + appIDQuery := &model.ApplicationSearchQuery{Key: proj_model.AppSearchKeyAppID, Value: appID, Method: global_model.SearchMethodEquals} + query := repository.PrepareGetByQuery(table, projectIDQuery, appIDQuery) err := query(db, app) if caos_errs.IsNotFound(err) { return nil, caos_errs.ThrowNotFound(nil, "VIEW-DGdfx", "Errors.Application.NotFound") diff --git a/internal/project/repository/view/model/application.go b/internal/project/repository/view/model/application.go index 50728aeb04..885629db46 100644 --- a/internal/project/repository/view/model/application.go +++ b/internal/project/repository/view/model/application.go @@ -130,6 +130,32 @@ func ApplicationViewsToModel(roles []*ApplicationView) []*model.ApplicationView return result } +func (a *ApplicationView) AppendEventIfMyApp(event *models.Event) (err error) { + view := new(ApplicationView) + switch event.Type { + case es_model.ApplicationAdded: + err = view.SetData(event) + case es_model.ApplicationChanged, + es_model.OIDCConfigAdded, + es_model.OIDCConfigChanged, + es_model.ApplicationDeactivated, + es_model.ApplicationReactivated: + err := view.SetData(event) + if err != nil { + return err + } + case es_model.ApplicationRemoved: + return view.SetData(event) + case es_model.ProjectRemoved: + return a.AppendEvent(event) + default: + return nil + } + if view.ID == a.ID { + return a.AppendEvent(event) + } + return nil +} func (a *ApplicationView) AppendEvent(event *models.Event) (err error) { a.Sequence = event.Sequence a.ChangeDate = event.CreationDate @@ -156,6 +182,8 @@ func (a *ApplicationView) AppendEvent(event *models.Event) (err error) { a.State = int32(model.AppStateInactive) case es_model.ApplicationReactivated: a.State = int32(model.AppStateActive) + case es_model.ApplicationRemoved, es_model.ProjectRemoved: + a.State = int32(model.AppStateRemoved) } return err }