From 3c56fe6a0f26a71b89389e61b6ce37c4bcc65e98 Mon Sep 17 00:00:00 2001 From: Silvan Date: Tue, 30 Jun 2020 07:54:39 +0200 Subject: [PATCH] fix: project by id loads project from view and from eventstore (#315) --- .../eventsourcing/eventstore/project.go | 18 +++++++++++++++++- .../repository/eventsourcing/eventstore.go | 8 ++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/internal/management/repository/eventsourcing/eventstore/project.go b/internal/management/repository/eventsourcing/eventstore/project.go index 0aa3fe7ad2..6575aa5394 100644 --- a/internal/management/repository/eventsourcing/eventstore/project.go +++ b/internal/management/repository/eventsourcing/eventstore/project.go @@ -4,6 +4,7 @@ import ( "context" "strings" + "github.com/caos/logging" caos_errs "github.com/caos/zitadel/internal/errors" es_int "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore/models" @@ -36,9 +37,24 @@ type ProjectRepo struct { func (repo *ProjectRepo) ProjectByID(ctx context.Context, id string) (*proj_model.ProjectView, error) { project, err := repo.View.ProjectByID(id) - if err != nil { + if err != nil && !caos_errs.IsNotFound(err) { return nil, err } + + events, err := repo.ProjectEvents.ProjectEventsByID(ctx, id, project.Sequence) + if err != nil { + logging.Log("EVENT-V9x1V").WithError(err).Debug("error retrieving new events") + return model.ProjectToModel(project), nil + } + + viewProject := *project + for _, event := range events { + err := project.AppendEvent(event) + if err != nil { + return model.ProjectToModel(&viewProject), nil + } + } + return model.ProjectToModel(project), nil } diff --git a/internal/project/repository/eventsourcing/eventstore.go b/internal/project/repository/eventsourcing/eventstore.go index 7ead9d1eeb..2f058e14ea 100644 --- a/internal/project/repository/eventsourcing/eventstore.go +++ b/internal/project/repository/eventsourcing/eventstore.go @@ -71,6 +71,14 @@ func (es *ProjectEventstore) ProjectByID(ctx context.Context, id string) (*proj_ return model.ProjectToModel(project), nil } +func (es *ProjectEventstore) ProjectEventsByID(ctx context.Context, id string, sequence uint64) ([]*es_models.Event, error) { + query, err := ProjectByIDQuery(id, sequence) + if err != nil { + return nil, err + } + return es.FilterEvents(ctx, query) +} + func (es *ProjectEventstore) CreateProject(ctx context.Context, project *proj_model.Project) (*proj_model.Project, error) { if !project.IsValid() { return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-9dk45", "Errors.Project.Invalid")