mirror of
https://github.com/zitadel/zitadel.git
synced 2025-07-28 15:53:49 +00:00
feat: project grant commands (#68)
* feat: eventstore repository * fix: remove gorm * version * feat: pkg * feat: add some files for project * feat: eventstore without eventstore-lib * rename files * gnueg * fix: key json * fix: add object * fix: change imports * fix: internal models * fix: some imports * fix: global model * feat: add global view functions * fix: add some functions on repo * feat(eventstore): sdk * fix(eventstore): search query * fix(eventstore): rename app to eventstore * delete empty test * remove unused func * merge master * fix(eventstore): tests * fix(models): delete unused struct * fix: some funcitons * feat(eventstore): implemented push events * fix: move project eventstore to project package * fix: change project eventstore funcs * feat(eventstore): overwrite context data * fix: change project eventstore * fix: add project repo to mgmt server * feat(types): SQL-config * fix: commented code * feat(eventstore): options to overwrite editor * feat: auth interceptor and cockroach migrations * fix: migrations * fix: fix filter * fix: not found on getbyid * fix: use global sql config * fix: add sequence * fix: add some tests * fix(eventstore): nullable sequence * fix: add some tests * merge * fix: add some tests * fix(migrations): correct statements for sequence * fix: add some tests * fix: add some tests * fix: changes from mr * fix: changes from mr * fix: add some tests * Update internal/eventstore/models/field.go Co-Authored-By: livio-a <livio.a@gmail.com> * fix(eventstore): code quality * fix: add types to aggregate/Event-types * fix: try tests * fix(eventstore): rename modifier* to editor* * fix(eventstore): delete editor_org * fix(migrations): remove editor_org field, rename modifier_* to editor_* * fix: query tests * fix: use prepare funcs * fix: go mod * fix: generate files * fix(eventstore): tests * fix(eventstore): rename modifier to editor * fix(migrations): add cluster migration, fix(migrations): fix typo of host in clean clsuter * fix(eventstore): move health * fix(eventstore): AggregateTypeFilter aggregateType as param * code quality * fix: go tests * feat: add member funcs * feat: add member model * feat: add member events * feat: add member repo model * fix: better error func testing * fix: project member funcs * fix: add tests * fix: add tests * feat: implement member requests * fix: merge master * fix: merge master * fix: read existing in project repo * fix: fix tests * feat: add internal cache * feat: add cache mock * fix: return values of cache mock * feat: add project role * fix: add cache config * fix: add role to eventstore * fix: use eventstore sdk * fix: use eventstore sdk * fix: add project role grpc requests * fix: fix getby id * fix: changes for mr * fix: change value to interface * feat: add app event creations * fix: searchmethods * Update internal/project/model/project_member.go Co-Authored-By: Silvan <silvan.reusser@gmail.com> * fix: use get project func * fix: append events * fix: check if value is string on equal ignore case * fix: add changes test * fix: add go mod * fix: add some tests * fix: return err not nil * fix: return err not nil * fix: add aggregate funcs and tests * fix: add oidc aggregate funcs and tests * fix: add oidc * fix: add some tests * fix: tests * fix: oidc validation * fix: generate client secret * fix: generate client id * fix: test change app * fix: deactivate/reactivate application * fix: change oidc config * fix: change oidc config secret * fix: implement grpc app funcs * fix: add application requests * fix: converter * fix: converter * fix: converter and generate clientid * fix: tests * feat: project grant aggregate * feat: project grant * fix: project grant check if role existing * fix: project grant requests * fix: project grant fixes * fix: project grant member model * fix: project grant member aggregate * fix: project grant member eventstore * fix: project grant member requests * fix: problems after merger * fix: new commit * fix: remove enum converter * Update internal/project/model/project_grant.go Co-Authored-By: Livio Amstutz <livio.a@gmail.com> * Update internal/project/model/project_grant.go Co-Authored-By: Livio Amstutz <livio.a@gmail.com> * Update internal/project/model/project.go Co-Authored-By: Livio Amstutz <livio.a@gmail.com> * fix: better sub object handling * fix: imports Co-authored-by: adlerhurst <silvan.reusser@gmail.com> Co-authored-by: livio-a <livio.a@gmail.com>
This commit is contained in:
parent
04b4cd80b8
commit
8464cfa4fe
@ -30,4 +30,4 @@ cockroachdb/cockroach:v19.2.2 start --insecure
|
|||||||
`docker exec -it "zitadel-db" /cockroach/cockroach sql --insecure`
|
`docker exec -it "zitadel-db" /cockroach/cockroach sql --insecure`
|
||||||
|
|
||||||
#### Should show eventstore, management, admin, auth
|
#### Should show eventstore, management, admin, auth
|
||||||
`show databases;`
|
`show databases;`
|
||||||
|
@ -96,3 +96,46 @@ func (repo *ProjectRepo) ChangeOIDCConfig(ctx context.Context, config *proj_mode
|
|||||||
func (repo *ProjectRepo) ChangeOIDConfigSecret(ctx context.Context, projectID, appID string) (*proj_model.OIDCConfig, error) {
|
func (repo *ProjectRepo) ChangeOIDConfigSecret(ctx context.Context, projectID, appID string) (*proj_model.OIDCConfig, error) {
|
||||||
return repo.ProjectEvents.ChangeOIDCConfigSecret(ctx, projectID, appID)
|
return repo.ProjectEvents.ChangeOIDCConfigSecret(ctx, projectID, appID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (repo *ProjectRepo) ProjectGrantByID(ctx context.Context, projectID, appID string) (app *proj_model.ProjectGrant, err error) {
|
||||||
|
return repo.ProjectEvents.ProjectGrantByIDs(ctx, projectID, appID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *ProjectRepo) AddProjectGrant(ctx context.Context, app *proj_model.ProjectGrant) (*proj_model.ProjectGrant, error) {
|
||||||
|
return repo.ProjectEvents.AddProjectGrant(ctx, app)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *ProjectRepo) ChangeProjectGrant(ctx context.Context, app *proj_model.ProjectGrant) (*proj_model.ProjectGrant, error) {
|
||||||
|
return repo.ProjectEvents.ChangeProjectGrant(ctx, app)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *ProjectRepo) DeactivateProjectGrant(ctx context.Context, projectID, appID string) (*proj_model.ProjectGrant, error) {
|
||||||
|
return repo.ProjectEvents.DeactivateProjectGrant(ctx, projectID, appID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *ProjectRepo) ReactivateProjectGrant(ctx context.Context, projectID, appID string) (*proj_model.ProjectGrant, error) {
|
||||||
|
return repo.ProjectEvents.ReactivateProjectGrant(ctx, projectID, appID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *ProjectRepo) RemoveProjectGrant(ctx context.Context, projectID, appID string) error {
|
||||||
|
app := proj_model.NewProjectGrant(projectID, appID)
|
||||||
|
return repo.ProjectEvents.RemoveProjectGrant(ctx, app)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *ProjectRepo) ProjectGrantMemberByID(ctx context.Context, projectID, grantID, userID string) (member *proj_model.ProjectGrantMember, err error) {
|
||||||
|
member = proj_model.NewProjectGrantMember(projectID, grantID, userID)
|
||||||
|
return repo.ProjectEvents.ProjectGrantMemberByIDs(ctx, member)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *ProjectRepo) AddProjectGrantMember(ctx context.Context, member *proj_model.ProjectGrantMember) (*proj_model.ProjectGrantMember, error) {
|
||||||
|
return repo.ProjectEvents.AddProjectGrantMember(ctx, member)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *ProjectRepo) ChangeProjectGrantMember(ctx context.Context, member *proj_model.ProjectGrantMember) (*proj_model.ProjectGrantMember, error) {
|
||||||
|
return repo.ProjectEvents.ChangeProjectGrantMember(ctx, member)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *ProjectRepo) RemoveProjectGrantMember(ctx context.Context, projectID, grantID, userID string) error {
|
||||||
|
member := proj_model.NewProjectGrantMember(projectID, grantID, userID)
|
||||||
|
return repo.ProjectEvents.RemoveProjectGrantMember(ctx, member)
|
||||||
|
}
|
||||||
|
@ -29,4 +29,16 @@ type ProjectRepository interface {
|
|||||||
RemoveApplication(ctx context.Context, projectID, appID string) error
|
RemoveApplication(ctx context.Context, projectID, appID string) error
|
||||||
ChangeOIDCConfig(ctx context.Context, config *model.OIDCConfig) (*model.OIDCConfig, error)
|
ChangeOIDCConfig(ctx context.Context, config *model.OIDCConfig) (*model.OIDCConfig, error)
|
||||||
ChangeOIDConfigSecret(ctx context.Context, projectID, appID string) (*model.OIDCConfig, error)
|
ChangeOIDConfigSecret(ctx context.Context, projectID, appID string) (*model.OIDCConfig, error)
|
||||||
|
|
||||||
|
ProjectGrantByID(ctx context.Context, projectID, appID string) (*model.ProjectGrant, error)
|
||||||
|
AddProjectGrant(ctx context.Context, app *model.ProjectGrant) (*model.ProjectGrant, error)
|
||||||
|
ChangeProjectGrant(ctx context.Context, app *model.ProjectGrant) (*model.ProjectGrant, error)
|
||||||
|
DeactivateProjectGrant(ctx context.Context, projectID, appID string) (*model.ProjectGrant, error)
|
||||||
|
ReactivateProjectGrant(ctx context.Context, projectID, appID string) (*model.ProjectGrant, error)
|
||||||
|
RemoveProjectGrant(ctx context.Context, projectID, appID string) error
|
||||||
|
|
||||||
|
ProjectGrantMemberByID(ctx context.Context, projectID, grantID, userID string) (*model.ProjectGrantMember, error)
|
||||||
|
AddProjectGrantMember(ctx context.Context, member *model.ProjectGrantMember) (*model.ProjectGrantMember, error)
|
||||||
|
ChangeProjectGrantMember(ctx context.Context, member *model.ProjectGrantMember) (*model.ProjectGrantMember, error)
|
||||||
|
RemoveProjectGrantMember(ctx context.Context, projectID, grantID, userID string) error
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ type Project struct {
|
|||||||
Members []*ProjectMember
|
Members []*ProjectMember
|
||||||
Roles []*ProjectRole
|
Roles []*ProjectRole
|
||||||
Applications []*Application
|
Applications []*Application
|
||||||
|
Grants []*ProjectGrant
|
||||||
}
|
}
|
||||||
|
|
||||||
type ProjectState int32
|
type ProjectState int32
|
||||||
@ -33,13 +34,13 @@ func (p *Project) IsValid() bool {
|
|||||||
return p.Name != ""
|
return p.Name != ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Project) ContainsMember(member *ProjectMember) bool {
|
func (p *Project) GetMember(userID string) (int, *ProjectMember) {
|
||||||
for _, m := range p.Members {
|
for i, m := range p.Members {
|
||||||
if m.UserID == member.UserID {
|
if m.UserID == userID {
|
||||||
return true
|
return i, m
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return -1, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Project) ContainsRole(role *ProjectRole) bool {
|
func (p *Project) ContainsRole(role *ProjectRole) bool {
|
||||||
@ -51,11 +52,50 @@ func (p *Project) ContainsRole(role *ProjectRole) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Project) ContainsApp(app *Application) (*Application, bool) {
|
func (p *Project) GetApp(appID string) (int, *Application) {
|
||||||
for _, a := range p.Applications {
|
for i, a := range p.Applications {
|
||||||
if a.AppID == app.AppID {
|
if a.AppID == appID {
|
||||||
return a, true
|
return i, a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil, false
|
return -1, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) GetGrant(grantID string) (int, *ProjectGrant) {
|
||||||
|
for i, g := range p.Grants {
|
||||||
|
if g.GrantID == grantID {
|
||||||
|
return i, g
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) ContainsGrantForOrg(orgID string) bool {
|
||||||
|
for _, g := range p.Grants {
|
||||||
|
if g.GrantedOrgID == orgID {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) ContainsRoles(roleKeys []string) bool {
|
||||||
|
for _, r := range roleKeys {
|
||||||
|
if !p.ContainsRole(&ProjectRole{Key: r}) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) ContainsGrantMember(member *ProjectGrantMember) bool {
|
||||||
|
for _, g := range p.Grants {
|
||||||
|
if g.GrantID != member.GrantID {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if _, m := g.GetMember(member.UserID); m != nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
43
internal/project/model/project_grant.go
Normal file
43
internal/project/model/project_grant.go
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ProjectGrant struct {
|
||||||
|
es_models.ObjectRoot
|
||||||
|
|
||||||
|
GrantID string
|
||||||
|
GrantedOrgID string
|
||||||
|
State ProjectGrantState
|
||||||
|
RoleKeys []string
|
||||||
|
Members []*ProjectGrantMember
|
||||||
|
}
|
||||||
|
|
||||||
|
type ProjectGrantState int32
|
||||||
|
|
||||||
|
const (
|
||||||
|
PROJECTGRANTSTATE_ACTIVE ProjectGrantState = iota
|
||||||
|
PROJECTGRANTSTATE_INACTIVE
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewProjectGrant(projectID, grantID string) *ProjectGrant {
|
||||||
|
return &ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: projectID}, GrantID: grantID, State: PROJECTGRANTSTATE_ACTIVE}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ProjectGrant) IsActive() bool {
|
||||||
|
return p.State == PROJECTGRANTSTATE_ACTIVE
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ProjectGrant) IsValid() bool {
|
||||||
|
return p.GrantedOrgID != ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ProjectGrant) GetMember(userID string) (int, *ProjectGrantMember) {
|
||||||
|
for i, m := range p.Members {
|
||||||
|
if m.UserID == userID {
|
||||||
|
return i, m
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1, nil
|
||||||
|
}
|
18
internal/project/model/project_grant_member.go
Normal file
18
internal/project/model/project_grant_member.go
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
|
||||||
|
type ProjectGrantMember struct {
|
||||||
|
es_models.ObjectRoot
|
||||||
|
GrantID string
|
||||||
|
UserID string
|
||||||
|
Roles []string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewProjectGrantMember(projectID, grantID, userID string) *ProjectGrantMember {
|
||||||
|
return &ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: projectID}, GrantID: grantID, UserID: userID}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ProjectGrantMember) IsValid() bool {
|
||||||
|
return p.AggregateID != "" && p.UserID != "" && len(p.Roles) != 0
|
||||||
|
}
|
@ -20,12 +20,13 @@ const (
|
|||||||
|
|
||||||
ProjectGrantAdded models.EventType = "project.grant.added"
|
ProjectGrantAdded models.EventType = "project.grant.added"
|
||||||
ProjectGrantChanged models.EventType = "project.grant.changed"
|
ProjectGrantChanged models.EventType = "project.grant.changed"
|
||||||
|
ProjectGrantRemoved models.EventType = "project.grant.removed"
|
||||||
ProjectGrantDeactivated models.EventType = "project.grant.deactivated"
|
ProjectGrantDeactivated models.EventType = "project.grant.deactivated"
|
||||||
ProjectGrantReactivated models.EventType = "project.grant.reactivated"
|
ProjectGrantReactivated models.EventType = "project.grant.reactivated"
|
||||||
|
|
||||||
GrantMemberAdded models.EventType = "project.grant.member.added"
|
ProjectGrantMemberAdded models.EventType = "project.grant.member.added"
|
||||||
GrantMemberChanged models.EventType = "project.grant.member.changed"
|
ProjectGrantMemberChanged models.EventType = "project.grant.member.changed"
|
||||||
GrantMemberRemoved models.EventType = "project.grant.member.removed"
|
ProjectGrantMemberRemoved models.EventType = "project.grant.member.removed"
|
||||||
|
|
||||||
ApplicationAdded models.EventType = "project.application.added"
|
ApplicationAdded models.EventType = "project.application.added"
|
||||||
ApplicationChanged models.EventType = "project.application.changed"
|
ApplicationChanged models.EventType = "project.application.changed"
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
"github.com/caos/zitadel/internal/cache"
|
"github.com/caos/zitadel/internal/cache"
|
||||||
"github.com/caos/zitadel/internal/cache/config"
|
"github.com/caos/zitadel/internal/cache/config"
|
||||||
"github.com/caos/zitadel/internal/eventstore/models"
|
"github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
"github.com/caos/zitadel/internal/project/repository/eventsourcing/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ProjectCache struct {
|
type ProjectCache struct {
|
||||||
@ -18,15 +19,15 @@ func StartCache(conf *config.CacheConfig) (*ProjectCache, error) {
|
|||||||
return &ProjectCache{projectCache: projectCache}, nil
|
return &ProjectCache{projectCache: projectCache}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ProjectCache) getProject(ID string) (project *Project) {
|
func (c *ProjectCache) getProject(ID string) (project *model.Project) {
|
||||||
project = &Project{ObjectRoot: models.ObjectRoot{AggregateID: ID}}
|
project = &model.Project{ObjectRoot: models.ObjectRoot{AggregateID: ID}}
|
||||||
if err := c.projectCache.Get(ID, project); err != nil {
|
if err := c.projectCache.Get(ID, project); err != nil {
|
||||||
logging.Log("EVENT-4eTZh").WithError(err).Debug("error in getting cache")
|
logging.Log("EVENT-4eTZh").WithError(err).Debug("error in getting cache")
|
||||||
}
|
}
|
||||||
return project
|
return project
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ProjectCache) cacheProject(project *Project) {
|
func (c *ProjectCache) cacheProject(project *model.Project) {
|
||||||
err := c.projectCache.Set(project.AggregateID, project)
|
err := c.projectCache.Set(project.AggregateID, project)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logging.Log("EVENT-ThnBb").WithError(err).Debug("error in setting project cache")
|
logging.Log("EVENT-ThnBb").WithError(err).Debug("error in setting project cache")
|
||||||
|
@ -2,6 +2,7 @@ package eventsourcing
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"github.com/caos/zitadel/internal/project/repository/eventsourcing/model"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/sony/sonyflake"
|
"github.com/sony/sonyflake"
|
||||||
@ -56,7 +57,7 @@ func (es *ProjectEventstore) ProjectByID(ctx context.Context, id string) (*proj_
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
es.projectCache.cacheProject(project)
|
es.projectCache.cacheProject(project)
|
||||||
return ProjectToModel(project), nil
|
return model.ProjectToModel(project), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (es *ProjectEventstore) CreateProject(ctx context.Context, project *proj_model.Project) (*proj_model.Project, error) {
|
func (es *ProjectEventstore) CreateProject(ctx context.Context, project *proj_model.Project) (*proj_model.Project, error) {
|
||||||
@ -69,7 +70,7 @@ func (es *ProjectEventstore) CreateProject(ctx context.Context, project *proj_mo
|
|||||||
}
|
}
|
||||||
project.AggregateID = strconv.FormatUint(id, 10)
|
project.AggregateID = strconv.FormatUint(id, 10)
|
||||||
project.State = proj_model.PROJECTSTATE_ACTIVE
|
project.State = proj_model.PROJECTSTATE_ACTIVE
|
||||||
repoProject := ProjectFromModel(project)
|
repoProject := model.ProjectFromModel(project)
|
||||||
|
|
||||||
createAggregate := ProjectCreateAggregate(es.AggregateCreator(), repoProject)
|
createAggregate := ProjectCreateAggregate(es.AggregateCreator(), repoProject)
|
||||||
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, createAggregate)
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, createAggregate)
|
||||||
@ -78,7 +79,7 @@ func (es *ProjectEventstore) CreateProject(ctx context.Context, project *proj_mo
|
|||||||
}
|
}
|
||||||
|
|
||||||
es.projectCache.cacheProject(repoProject)
|
es.projectCache.cacheProject(repoProject)
|
||||||
return ProjectToModel(repoProject), nil
|
return model.ProjectToModel(repoProject), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (es *ProjectEventstore) UpdateProject(ctx context.Context, project *proj_model.Project) (*proj_model.Project, error) {
|
func (es *ProjectEventstore) UpdateProject(ctx context.Context, project *proj_model.Project) (*proj_model.Project, error) {
|
||||||
@ -89,8 +90,8 @@ func (es *ProjectEventstore) UpdateProject(ctx context.Context, project *proj_mo
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
repoExisting := ProjectFromModel(existingProject)
|
repoExisting := model.ProjectFromModel(existingProject)
|
||||||
repoNew := ProjectFromModel(project)
|
repoNew := model.ProjectFromModel(project)
|
||||||
|
|
||||||
updateAggregate := ProjectUpdateAggregate(es.AggregateCreator(), repoExisting, repoNew)
|
updateAggregate := ProjectUpdateAggregate(es.AggregateCreator(), repoExisting, repoNew)
|
||||||
err = es_sdk.Push(ctx, es.PushAggregates, repoExisting.AppendEvents, updateAggregate)
|
err = es_sdk.Push(ctx, es.PushAggregates, repoExisting.AppendEvents, updateAggregate)
|
||||||
@ -99,7 +100,7 @@ func (es *ProjectEventstore) UpdateProject(ctx context.Context, project *proj_mo
|
|||||||
}
|
}
|
||||||
|
|
||||||
es.projectCache.cacheProject(repoExisting)
|
es.projectCache.cacheProject(repoExisting)
|
||||||
return ProjectToModel(repoExisting), nil
|
return model.ProjectToModel(repoExisting), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (es *ProjectEventstore) DeactivateProject(ctx context.Context, id string) (*proj_model.Project, error) {
|
func (es *ProjectEventstore) DeactivateProject(ctx context.Context, id string) (*proj_model.Project, error) {
|
||||||
@ -111,12 +112,12 @@ func (es *ProjectEventstore) DeactivateProject(ctx context.Context, id string) (
|
|||||||
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-die45", "project must be active")
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-die45", "project must be active")
|
||||||
}
|
}
|
||||||
|
|
||||||
repoExisting := ProjectFromModel(existing)
|
repoExisting := model.ProjectFromModel(existing)
|
||||||
aggregate := ProjectDeactivateAggregate(es.AggregateCreator(), repoExisting)
|
aggregate := ProjectDeactivateAggregate(es.AggregateCreator(), repoExisting)
|
||||||
es_sdk.Push(ctx, es.PushAggregates, repoExisting.AppendEvents, aggregate)
|
es_sdk.Push(ctx, es.PushAggregates, repoExisting.AppendEvents, aggregate)
|
||||||
|
|
||||||
es.projectCache.cacheProject(repoExisting)
|
es.projectCache.cacheProject(repoExisting)
|
||||||
return ProjectToModel(repoExisting), nil
|
return model.ProjectToModel(repoExisting), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (es *ProjectEventstore) ReactivateProject(ctx context.Context, id string) (*proj_model.Project, error) {
|
func (es *ProjectEventstore) ReactivateProject(ctx context.Context, id string) (*proj_model.Project, error) {
|
||||||
@ -128,12 +129,12 @@ func (es *ProjectEventstore) ReactivateProject(ctx context.Context, id string) (
|
|||||||
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-die45", "project must be inactive")
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-die45", "project must be inactive")
|
||||||
}
|
}
|
||||||
|
|
||||||
repoExisting := ProjectFromModel(existing)
|
repoExisting := model.ProjectFromModel(existing)
|
||||||
aggregate := ProjectReactivateAggregate(es.AggregateCreator(), repoExisting)
|
aggregate := ProjectReactivateAggregate(es.AggregateCreator(), repoExisting)
|
||||||
es_sdk.Push(ctx, es.PushAggregates, repoExisting.AppendEvents, aggregate)
|
es_sdk.Push(ctx, es.PushAggregates, repoExisting.AppendEvents, aggregate)
|
||||||
|
|
||||||
es.projectCache.cacheProject(repoExisting)
|
es.projectCache.cacheProject(repoExisting)
|
||||||
return ProjectToModel(repoExisting), nil
|
return model.ProjectToModel(repoExisting), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (es *ProjectEventstore) ProjectMemberByIDs(ctx context.Context, member *proj_model.ProjectMember) (*proj_model.ProjectMember, error) {
|
func (es *ProjectEventstore) ProjectMemberByIDs(ctx context.Context, member *proj_model.ProjectMember) (*proj_model.ProjectMember, error) {
|
||||||
@ -144,12 +145,11 @@ func (es *ProjectEventstore) ProjectMemberByIDs(ctx context.Context, member *pro
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
for _, m := range project.Members {
|
|
||||||
if m.UserID == member.UserID {
|
if _, m := project.GetMember(member.UserID); m != nil {
|
||||||
return m, nil
|
return m, nil
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil, caos_errs.ThrowInternal(nil, "EVENT-3udjs", "Could not find member in list")
|
return nil, caos_errs.ThrowNotFound(nil, "EVENT-3udjs", "member not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (es *ProjectEventstore) AddProjectMember(ctx context.Context, member *proj_model.ProjectMember) (*proj_model.ProjectMember, error) {
|
func (es *ProjectEventstore) AddProjectMember(ctx context.Context, member *proj_model.ProjectMember) (*proj_model.ProjectMember, error) {
|
||||||
@ -160,11 +160,11 @@ func (es *ProjectEventstore) AddProjectMember(ctx context.Context, member *proj_
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if existing.ContainsMember(member) {
|
if _, m := existing.GetMember(member.UserID); m != nil {
|
||||||
return nil, caos_errs.ThrowAlreadyExists(nil, "EVENT-idke6", "User is already member of this Project")
|
return nil, caos_errs.ThrowAlreadyExists(nil, "EVENT-idke6", "User is already member of this Project")
|
||||||
}
|
}
|
||||||
repoProject := ProjectFromModel(existing)
|
repoProject := model.ProjectFromModel(existing)
|
||||||
repoMember := ProjectMemberFromModel(member)
|
repoMember := model.ProjectMemberFromModel(member)
|
||||||
|
|
||||||
addAggregate := ProjectMemberAddedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoMember)
|
addAggregate := ProjectMemberAddedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoMember)
|
||||||
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, addAggregate)
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, addAggregate)
|
||||||
@ -172,10 +172,9 @@ func (es *ProjectEventstore) AddProjectMember(ctx context.Context, member *proj_
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
es.projectCache.cacheProject(repoProject)
|
es.projectCache.cacheProject(repoProject)
|
||||||
for _, m := range repoProject.Members {
|
|
||||||
if m.UserID == member.UserID {
|
if _, m := model.GetProjectMember(repoProject.Members, member.UserID); m != nil {
|
||||||
return ProjectMemberToModel(m), nil
|
return model.ProjectMemberToModel(m), nil
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil, caos_errs.ThrowInternal(nil, "EVENT-3udjs", "Could not find member in list")
|
return nil, caos_errs.ThrowInternal(nil, "EVENT-3udjs", "Could not find member in list")
|
||||||
}
|
}
|
||||||
@ -188,19 +187,18 @@ func (es *ProjectEventstore) ChangeProjectMember(ctx context.Context, member *pr
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if !existing.ContainsMember(member) {
|
if _, m := existing.GetMember(member.UserID); m == nil {
|
||||||
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-oe39f", "User is not member of this project")
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-oe39f", "User is not member of this project")
|
||||||
}
|
}
|
||||||
repoProject := ProjectFromModel(existing)
|
repoProject := model.ProjectFromModel(existing)
|
||||||
repoMember := ProjectMemberFromModel(member)
|
repoMember := model.ProjectMemberFromModel(member)
|
||||||
|
|
||||||
projectAggregate := ProjectMemberChangedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoMember)
|
projectAggregate := ProjectMemberChangedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoMember)
|
||||||
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
||||||
es.projectCache.cacheProject(repoProject)
|
es.projectCache.cacheProject(repoProject)
|
||||||
for _, m := range repoProject.Members {
|
|
||||||
if m.UserID == member.UserID {
|
if _, m := model.GetProjectMember(repoProject.Members, member.UserID); m != nil {
|
||||||
return ProjectMemberToModel(m), nil
|
return model.ProjectMemberToModel(m), nil
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil, caos_errs.ThrowInternal(nil, "EVENT-3udjs", "Could not find member in list")
|
return nil, caos_errs.ThrowInternal(nil, "EVENT-3udjs", "Could not find member in list")
|
||||||
}
|
}
|
||||||
@ -213,11 +211,11 @@ func (es *ProjectEventstore) RemoveProjectMember(ctx context.Context, member *pr
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if !existing.ContainsMember(member) {
|
if _, m := existing.GetMember(member.UserID); m == nil {
|
||||||
return caos_errs.ThrowPreconditionFailed(nil, "EVENT-swf34", "User is not member of this project")
|
return caos_errs.ThrowPreconditionFailed(nil, "EVENT-swf34", "User is not member of this project")
|
||||||
}
|
}
|
||||||
repoProject := ProjectFromModel(existing)
|
repoProject := model.ProjectFromModel(existing)
|
||||||
repoMember := ProjectMemberFromModel(member)
|
repoMember := model.ProjectMemberFromModel(member)
|
||||||
|
|
||||||
projectAggregate := ProjectMemberRemovedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoMember)
|
projectAggregate := ProjectMemberRemovedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoMember)
|
||||||
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
||||||
@ -236,8 +234,8 @@ func (es *ProjectEventstore) AddProjectRole(ctx context.Context, role *proj_mode
|
|||||||
if existing.ContainsRole(role) {
|
if existing.ContainsRole(role) {
|
||||||
return nil, caos_errs.ThrowAlreadyExists(nil, "EVENT-sk35t", "Project contains role with same key")
|
return nil, caos_errs.ThrowAlreadyExists(nil, "EVENT-sk35t", "Project contains role with same key")
|
||||||
}
|
}
|
||||||
repoProject := ProjectFromModel(existing)
|
repoProject := model.ProjectFromModel(existing)
|
||||||
repoRole := ProjectRoleFromModel(role)
|
repoRole := model.ProjectRoleFromModel(role)
|
||||||
projectAggregate := ProjectRoleAddedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoRole)
|
projectAggregate := ProjectRoleAddedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoRole)
|
||||||
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -245,10 +243,9 @@ func (es *ProjectEventstore) AddProjectRole(ctx context.Context, role *proj_mode
|
|||||||
}
|
}
|
||||||
|
|
||||||
es.projectCache.cacheProject(repoProject)
|
es.projectCache.cacheProject(repoProject)
|
||||||
for _, r := range repoProject.Roles {
|
|
||||||
if r.Key == role.Key {
|
if _, r := model.GetProjectRole(repoProject.Roles, role.Key); r != nil {
|
||||||
return ProjectRoleToModel(r), nil
|
return model.ProjectRoleToModel(r), nil
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil, caos_errs.ThrowInternal(nil, "EVENT-sie83", "Could not find role in list")
|
return nil, caos_errs.ThrowInternal(nil, "EVENT-sie83", "Could not find role in list")
|
||||||
}
|
}
|
||||||
@ -264,8 +261,8 @@ func (es *ProjectEventstore) ChangeProjectRole(ctx context.Context, role *proj_m
|
|||||||
if !existing.ContainsRole(role) {
|
if !existing.ContainsRole(role) {
|
||||||
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-die34", "Role doesn't exist on this project")
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-die34", "Role doesn't exist on this project")
|
||||||
}
|
}
|
||||||
repoProject := ProjectFromModel(existing)
|
repoProject := model.ProjectFromModel(existing)
|
||||||
repoRole := ProjectRoleFromModel(role)
|
repoRole := model.ProjectRoleFromModel(role)
|
||||||
projectAggregate := ProjectRoleChangedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoRole)
|
projectAggregate := ProjectRoleChangedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoRole)
|
||||||
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -273,10 +270,9 @@ func (es *ProjectEventstore) ChangeProjectRole(ctx context.Context, role *proj_m
|
|||||||
}
|
}
|
||||||
|
|
||||||
es.projectCache.cacheProject(repoProject)
|
es.projectCache.cacheProject(repoProject)
|
||||||
for _, r := range repoProject.Roles {
|
|
||||||
if r.Key == role.Key {
|
if _, r := model.GetProjectRole(repoProject.Roles, role.Key); r != nil {
|
||||||
return ProjectRoleToModel(r), nil
|
return model.ProjectRoleToModel(r), nil
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil, caos_errs.ThrowInternal(nil, "EVENT-sl1or", "Could not find role in list")
|
return nil, caos_errs.ThrowInternal(nil, "EVENT-sl1or", "Could not find role in list")
|
||||||
}
|
}
|
||||||
@ -292,8 +288,8 @@ func (es *ProjectEventstore) RemoveProjectRole(ctx context.Context, role *proj_m
|
|||||||
if !existing.ContainsRole(role) {
|
if !existing.ContainsRole(role) {
|
||||||
return caos_errs.ThrowPreconditionFailed(nil, "EVENT-oe823", "Role doesn't exist on project")
|
return caos_errs.ThrowPreconditionFailed(nil, "EVENT-oe823", "Role doesn't exist on project")
|
||||||
}
|
}
|
||||||
repoProject := ProjectFromModel(existing)
|
repoProject := model.ProjectFromModel(existing)
|
||||||
repoRole := ProjectRoleFromModel(role)
|
repoRole := model.ProjectRoleFromModel(role)
|
||||||
projectAggregate := ProjectRoleRemovedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoRole)
|
projectAggregate := ProjectRoleRemovedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoRole)
|
||||||
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -311,10 +307,9 @@ func (es *ProjectEventstore) ApplicationByIDs(ctx context.Context, projectID, ap
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
for _, a := range project.Applications {
|
|
||||||
if a.AppID == appID {
|
if _, a := project.GetApp(appID); a != nil {
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil, caos_errs.ThrowNotFound(nil, "EVENT-8ei2s", "Could not find app")
|
return nil, caos_errs.ThrowNotFound(nil, "EVENT-8ei2s", "Could not find app")
|
||||||
}
|
}
|
||||||
@ -348,18 +343,16 @@ func (es *ProjectEventstore) AddApplication(ctx context.Context, app *proj_model
|
|||||||
}
|
}
|
||||||
app.OIDCConfig.ClientID = clientID
|
app.OIDCConfig.ClientID = clientID
|
||||||
}
|
}
|
||||||
repoProject := ProjectFromModel(existing)
|
repoProject := model.ProjectFromModel(existing)
|
||||||
repoApp := AppFromModel(app)
|
repoApp := model.AppFromModel(app)
|
||||||
|
|
||||||
addAggregate := ApplicationAddedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoApp)
|
addAggregate := ApplicationAddedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoApp)
|
||||||
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, addAggregate)
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, addAggregate)
|
||||||
es.projectCache.cacheProject(repoProject)
|
es.projectCache.cacheProject(repoProject)
|
||||||
for _, a := range repoProject.Applications {
|
if _, a := model.GetApplication(repoProject.Applications, app.AppID); a != nil {
|
||||||
if a.AppID == app.AppID {
|
converted := model.AppToModel(a)
|
||||||
converted := AppToModel(a)
|
converted.OIDCConfig.ClientSecretString = stringPw
|
||||||
converted.OIDCConfig.ClientSecretString = stringPw
|
return converted, nil
|
||||||
return converted, nil
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil, caos_errs.ThrowInternal(nil, "EVENT-3udjs", "Could not find member in list")
|
return nil, caos_errs.ThrowInternal(nil, "EVENT-3udjs", "Could not find member in list")
|
||||||
}
|
}
|
||||||
@ -372,19 +365,17 @@ func (es *ProjectEventstore) ChangeApplication(ctx context.Context, app *proj_mo
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if _, ok := existing.ContainsApp(app); !ok {
|
if _, app := existing.GetApp(app.AppID); app == nil {
|
||||||
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-die83", "App is not in this project")
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-die83", "App is not in this project")
|
||||||
}
|
}
|
||||||
repoProject := ProjectFromModel(existing)
|
repoProject := model.ProjectFromModel(existing)
|
||||||
repoApp := AppFromModel(app)
|
repoApp := model.AppFromModel(app)
|
||||||
|
|
||||||
projectAggregate := ApplicationChangedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoApp)
|
projectAggregate := ApplicationChangedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoApp)
|
||||||
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
||||||
es.projectCache.cacheProject(repoProject)
|
es.projectCache.cacheProject(repoProject)
|
||||||
for _, a := range repoProject.Applications {
|
if _, a := model.GetApplication(repoProject.Applications, app.AppID); a != nil {
|
||||||
if a.AppID == app.AppID {
|
return model.AppToModel(a), nil
|
||||||
return AppToModel(a), nil
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil, caos_errs.ThrowInternal(nil, "EVENT-dksi8", "Could not find app in list")
|
return nil, caos_errs.ThrowInternal(nil, "EVENT-dksi8", "Could not find app in list")
|
||||||
}
|
}
|
||||||
@ -397,11 +388,11 @@ func (es *ProjectEventstore) RemoveApplication(ctx context.Context, app *proj_mo
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if _, ok := existing.ContainsApp(app); !ok {
|
if _, app := existing.GetApp(app.AppID); app == nil {
|
||||||
return caos_errs.ThrowPreconditionFailed(nil, "EVENT-di83s", "Application doesn't exist on project")
|
return caos_errs.ThrowPreconditionFailed(nil, "EVENT-di83s", "Application doesn't exist on project")
|
||||||
}
|
}
|
||||||
repoProject := ProjectFromModel(existing)
|
repoProject := model.ProjectFromModel(existing)
|
||||||
appRepo := AppFromModel(app)
|
appRepo := model.AppFromModel(app)
|
||||||
projectAggregate := ApplicationRemovedAggregate(es.Eventstore.AggregateCreator(), repoProject, appRepo)
|
projectAggregate := ApplicationRemovedAggregate(es.Eventstore.AggregateCreator(), repoProject, appRepo)
|
||||||
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -420,19 +411,17 @@ func (es *ProjectEventstore) DeactivateApplication(ctx context.Context, projectI
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
app := &proj_model.Application{AppID: appID}
|
app := &proj_model.Application{AppID: appID}
|
||||||
if _, ok := existing.ContainsApp(app); !ok {
|
if _, app := existing.GetApp(app.AppID); app == nil {
|
||||||
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-slpe9", "App is not in this project")
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-slpe9", "App is not in this project")
|
||||||
}
|
}
|
||||||
repoProject := ProjectFromModel(existing)
|
repoProject := model.ProjectFromModel(existing)
|
||||||
repoApp := AppFromModel(app)
|
repoApp := model.AppFromModel(app)
|
||||||
|
|
||||||
projectAggregate := ApplicationDeactivatedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoApp)
|
projectAggregate := ApplicationDeactivatedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoApp)
|
||||||
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
||||||
es.projectCache.cacheProject(repoProject)
|
es.projectCache.cacheProject(repoProject)
|
||||||
for _, a := range repoProject.Applications {
|
if _, a := model.GetApplication(repoProject.Applications, app.AppID); a != nil {
|
||||||
if a.AppID == app.AppID {
|
return model.AppToModel(a), nil
|
||||||
return AppToModel(a), nil
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil, caos_errs.ThrowInternal(nil, "EVENT-sie83", "Could not find app in list")
|
return nil, caos_errs.ThrowInternal(nil, "EVENT-sie83", "Could not find app in list")
|
||||||
}
|
}
|
||||||
@ -446,19 +435,17 @@ func (es *ProjectEventstore) ReactivateApplication(ctx context.Context, projectI
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
app := &proj_model.Application{AppID: appID}
|
app := &proj_model.Application{AppID: appID}
|
||||||
if _, ok := existing.ContainsApp(app); !ok {
|
if _, app := existing.GetApp(app.AppID); app == nil {
|
||||||
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-ld92d", "App is not in this project")
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-ld92d", "App is not in this project")
|
||||||
}
|
}
|
||||||
repoProject := ProjectFromModel(existing)
|
repoProject := model.ProjectFromModel(existing)
|
||||||
repoApp := AppFromModel(app)
|
repoApp := model.AppFromModel(app)
|
||||||
|
|
||||||
projectAggregate := ApplicationReactivatedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoApp)
|
projectAggregate := ApplicationReactivatedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoApp)
|
||||||
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
||||||
es.projectCache.cacheProject(repoProject)
|
es.projectCache.cacheProject(repoProject)
|
||||||
for _, a := range repoProject.Applications {
|
if _, a := model.GetApplication(repoProject.Applications, app.AppID); a != nil {
|
||||||
if a.AppID == app.AppID {
|
return model.AppToModel(a), nil
|
||||||
return AppToModel(a), nil
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil, caos_errs.ThrowInternal(nil, "EVENT-sld93", "Could not find app in list")
|
return nil, caos_errs.ThrowInternal(nil, "EVENT-sld93", "Could not find app in list")
|
||||||
}
|
}
|
||||||
@ -471,24 +458,21 @@ func (es *ProjectEventstore) ChangeOIDCConfig(ctx context.Context, config *proj_
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var ok bool
|
|
||||||
var app *proj_model.Application
|
var app *proj_model.Application
|
||||||
if app, ok = existing.ContainsApp(&proj_model.Application{AppID: config.AppID}); !ok {
|
if _, app = existing.GetApp(config.AppID); app == nil {
|
||||||
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-dkso8", "App is not in this project")
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-dkso8", "App is not in this project")
|
||||||
}
|
}
|
||||||
if app.Type != proj_model.APPTYPE_OIDC {
|
if app.Type != proj_model.APPTYPE_OIDC {
|
||||||
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-98uje", "App is not an oidc application")
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-98uje", "App is not an oidc application")
|
||||||
}
|
}
|
||||||
repoProject := ProjectFromModel(existing)
|
repoProject := model.ProjectFromModel(existing)
|
||||||
repoConfig := OIDCConfigFromModel(config)
|
repoConfig := model.OIDCConfigFromModel(config)
|
||||||
|
|
||||||
projectAggregate := OIDCConfigChangedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoConfig)
|
projectAggregate := OIDCConfigChangedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoConfig)
|
||||||
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
||||||
es.projectCache.cacheProject(repoProject)
|
es.projectCache.cacheProject(repoProject)
|
||||||
for _, a := range repoProject.Applications {
|
if _, a := model.GetApplication(repoProject.Applications, app.AppID); a != nil {
|
||||||
if a.AppID == app.AppID {
|
return model.OIDCConfigToModel(a.OIDCConfig), nil
|
||||||
return OIDCConfigToModel(a.OIDCConfig), nil
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil, caos_errs.ThrowInternal(nil, "EVENT-dk87s", "Could not find app in list")
|
return nil, caos_errs.ThrowInternal(nil, "EVENT-dk87s", "Could not find app in list")
|
||||||
}
|
}
|
||||||
@ -501,15 +485,14 @@ func (es *ProjectEventstore) ChangeOIDCConfigSecret(ctx context.Context, project
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var ok bool
|
|
||||||
var app *proj_model.Application
|
var app *proj_model.Application
|
||||||
if app, ok = existing.ContainsApp(&proj_model.Application{AppID: appID}); !ok {
|
if _, app = existing.GetApp(appID); app == nil {
|
||||||
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-9odi4", "App is not in this project")
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-9odi4", "App is not in this project")
|
||||||
}
|
}
|
||||||
if app.Type != proj_model.APPTYPE_OIDC {
|
if app.Type != proj_model.APPTYPE_OIDC {
|
||||||
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-dile4", "App is not an oidc application")
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-dile4", "App is not an oidc application")
|
||||||
}
|
}
|
||||||
repoProject := ProjectFromModel(existing)
|
repoProject := model.ProjectFromModel(existing)
|
||||||
|
|
||||||
stringPw, crypto, err := generateNewClientSecret(es.pwGenerator)
|
stringPw, crypto, err := generateNewClientSecret(es.pwGenerator)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -519,12 +502,242 @@ func (es *ProjectEventstore) ChangeOIDCConfigSecret(ctx context.Context, project
|
|||||||
projectAggregate := OIDCConfigSecretChangedAggregate(es.Eventstore.AggregateCreator(), repoProject, appID, crypto)
|
projectAggregate := OIDCConfigSecretChangedAggregate(es.Eventstore.AggregateCreator(), repoProject, appID, crypto)
|
||||||
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
||||||
es.projectCache.cacheProject(repoProject)
|
es.projectCache.cacheProject(repoProject)
|
||||||
for _, a := range repoProject.Applications {
|
|
||||||
if a.AppID == app.AppID {
|
if _, a := model.GetApplication(repoProject.Applications, app.AppID); a != nil {
|
||||||
config := OIDCConfigToModel(a.OIDCConfig)
|
config := model.OIDCConfigToModel(a.OIDCConfig)
|
||||||
config.ClientSecretString = stringPw
|
config.ClientSecretString = stringPw
|
||||||
return config, nil
|
return config, nil
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, caos_errs.ThrowInternal(nil, "EVENT-dk87s", "Could not find app in list")
|
return nil, caos_errs.ThrowInternal(nil, "EVENT-dk87s", "Could not find app in list")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (es *ProjectEventstore) ProjectGrantByIDs(ctx context.Context, projectID, grantID string) (*proj_model.ProjectGrant, error) {
|
||||||
|
if grantID == "" {
|
||||||
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-e8die", "grantID missing")
|
||||||
|
}
|
||||||
|
project, err := es.ProjectByID(ctx, projectID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if _, g := project.GetGrant(grantID); g != nil {
|
||||||
|
return g, nil
|
||||||
|
}
|
||||||
|
return nil, caos_errs.ThrowNotFound(nil, "EVENT-slo45", "grant not found")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (es *ProjectEventstore) AddProjectGrant(ctx context.Context, grant *proj_model.ProjectGrant) (*proj_model.ProjectGrant, error) {
|
||||||
|
if grant == nil || !grant.IsValid() {
|
||||||
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-37dhs", "Project grant invalid")
|
||||||
|
}
|
||||||
|
existing, err := es.ProjectByID(ctx, grant.AggregateID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if existing.ContainsGrantForOrg(grant.GrantedOrgID) {
|
||||||
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-7ug4g", "Grant for org already exists")
|
||||||
|
}
|
||||||
|
if !existing.ContainsRoles(grant.RoleKeys) {
|
||||||
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-di83d", "One role doesnt exist in Project")
|
||||||
|
}
|
||||||
|
id, err := es.idGenerator.NextID()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
grant.GrantID = strconv.FormatUint(id, 10)
|
||||||
|
|
||||||
|
repoProject := model.ProjectFromModel(existing)
|
||||||
|
repoGrant := model.GrantFromModel(grant)
|
||||||
|
|
||||||
|
addAggregate := ProjectGrantAddedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoGrant)
|
||||||
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, addAggregate)
|
||||||
|
|
||||||
|
if _, g := model.GetProjectGrant(repoProject.Grants, grant.GrantID); g != nil {
|
||||||
|
return model.GrantToModel(g), nil
|
||||||
|
}
|
||||||
|
return nil, caos_errs.ThrowInternal(nil, "EVENT-sk3t5", "Could not find grant in list")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (es *ProjectEventstore) ChangeProjectGrant(ctx context.Context, grant *proj_model.ProjectGrant) (*proj_model.ProjectGrant, error) {
|
||||||
|
if grant == nil && grant.GrantID == "" {
|
||||||
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-8sie3", "invalid grant")
|
||||||
|
}
|
||||||
|
existing, err := es.ProjectByID(ctx, grant.AggregateID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if _, g := existing.GetGrant(grant.GrantID); g == nil {
|
||||||
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-die83", "Grant not existing on project")
|
||||||
|
}
|
||||||
|
if !existing.ContainsRoles(grant.RoleKeys) {
|
||||||
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-di83d", "One role doesnt exist in Project")
|
||||||
|
}
|
||||||
|
repoProject := model.ProjectFromModel(existing)
|
||||||
|
repoGrant := model.GrantFromModel(grant)
|
||||||
|
|
||||||
|
projectAggregate := ProjectGrantChangedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoGrant)
|
||||||
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
||||||
|
es.projectCache.cacheProject(repoProject)
|
||||||
|
|
||||||
|
if _, g := model.GetProjectGrant(repoProject.Grants, grant.GrantID); g != nil {
|
||||||
|
return model.GrantToModel(g), nil
|
||||||
|
}
|
||||||
|
return nil, caos_errs.ThrowInternal(nil, "EVENT-dksi8", "Could not find app in list")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (es *ProjectEventstore) RemoveProjectGrant(ctx context.Context, grant *proj_model.ProjectGrant) error {
|
||||||
|
if grant.GrantID == "" {
|
||||||
|
return caos_errs.ThrowPreconditionFailed(nil, "EVENT-8eud6", "GrantId is required")
|
||||||
|
}
|
||||||
|
existing, err := es.ProjectByID(ctx, grant.AggregateID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, g := existing.GetGrant(grant.GrantID); g == nil {
|
||||||
|
return caos_errs.ThrowPreconditionFailed(nil, "EVENT-9ie3s", "Grant doesn't exist on project")
|
||||||
|
}
|
||||||
|
repoProject := model.ProjectFromModel(existing)
|
||||||
|
grantRepo := model.GrantFromModel(grant)
|
||||||
|
projectAggregate := ProjectGrantRemovedAggregate(es.Eventstore.AggregateCreator(), repoProject, grantRepo)
|
||||||
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
es.projectCache.cacheProject(repoProject)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (es *ProjectEventstore) DeactivateProjectGrant(ctx context.Context, projectID, grantID string) (*proj_model.ProjectGrant, error) {
|
||||||
|
if grantID == "" {
|
||||||
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-7due2", "grantID missing")
|
||||||
|
}
|
||||||
|
existing, err := es.ProjectByID(ctx, projectID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
grant := &proj_model.ProjectGrant{GrantID: grantID}
|
||||||
|
if _, g := existing.GetGrant(grant.GrantID); g == nil {
|
||||||
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-slpe9", "Grant is not in this project")
|
||||||
|
}
|
||||||
|
repoProject := model.ProjectFromModel(existing)
|
||||||
|
repoGrant := model.GrantFromModel(grant)
|
||||||
|
|
||||||
|
projectAggregate := ProjectGrantDeactivatedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoGrant)
|
||||||
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
||||||
|
es.projectCache.cacheProject(repoProject)
|
||||||
|
if _, g := model.GetProjectGrant(repoProject.Grants, grant.GrantID); g != nil {
|
||||||
|
return model.GrantToModel(g), nil
|
||||||
|
}
|
||||||
|
return nil, caos_errs.ThrowInternal(nil, "EVENT-sie83", "Could not find grant in list")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (es *ProjectEventstore) ReactivateProjectGrant(ctx context.Context, projectID, grantID string) (*proj_model.ProjectGrant, error) {
|
||||||
|
if grantID == "" {
|
||||||
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-d7suw", "grantID missing")
|
||||||
|
}
|
||||||
|
existing, err := es.ProjectByID(ctx, projectID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
grant := &proj_model.ProjectGrant{GrantID: grantID}
|
||||||
|
if _, g := existing.GetGrant(grant.GrantID); g == nil {
|
||||||
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-0spew", "Grant is not in this project")
|
||||||
|
}
|
||||||
|
repoProject := model.ProjectFromModel(existing)
|
||||||
|
repoGrant := model.GrantFromModel(grant)
|
||||||
|
|
||||||
|
projectAggregate := ProjectGrantReactivatedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoGrant)
|
||||||
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
||||||
|
es.projectCache.cacheProject(repoProject)
|
||||||
|
|
||||||
|
if _, g := model.GetProjectGrant(repoProject.Grants, grant.GrantID); g != nil {
|
||||||
|
return model.GrantToModel(g), nil
|
||||||
|
}
|
||||||
|
return nil, caos_errs.ThrowInternal(nil, "EVENT-9osjw", "Could not find grant in list")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (es *ProjectEventstore) ProjectGrantMemberByIDs(ctx context.Context, member *proj_model.ProjectGrantMember) (*proj_model.ProjectGrantMember, error) {
|
||||||
|
if member.GrantID == "" || member.UserID == "" {
|
||||||
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-8diw2", "userID missing")
|
||||||
|
}
|
||||||
|
project, err := es.ProjectByID(ctx, member.AggregateID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if _, g := project.GetGrant(member.GrantID); g != nil {
|
||||||
|
if _, m := g.GetMember(member.UserID); m != nil {
|
||||||
|
return m, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, caos_errs.ThrowNotFound(nil, "EVENT-3udjs", "member not found")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (es *ProjectEventstore) AddProjectGrantMember(ctx context.Context, member *proj_model.ProjectGrantMember) (*proj_model.ProjectGrantMember, error) {
|
||||||
|
if !member.IsValid() {
|
||||||
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-0dor4", "invalid member")
|
||||||
|
}
|
||||||
|
existing, err := es.ProjectByID(ctx, member.AggregateID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if existing.ContainsGrantMember(member) {
|
||||||
|
return nil, caos_errs.ThrowAlreadyExists(nil, "EVENT-8die3", "User is already member of this ProjectGrant")
|
||||||
|
}
|
||||||
|
repoProject := model.ProjectFromModel(existing)
|
||||||
|
repoMember := model.GrantMemberFromModel(member)
|
||||||
|
|
||||||
|
addAggregate := ProjectGrantMemberAddedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoMember)
|
||||||
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, addAggregate)
|
||||||
|
es.projectCache.cacheProject(repoProject)
|
||||||
|
if _, g := model.GetProjectGrant(repoProject.Grants, member.GrantID); g != nil {
|
||||||
|
if _, m := model.GetProjectGrantMember(g.Members, member.UserID); m != nil {
|
||||||
|
return model.GrantMemberToModel(m), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, caos_errs.ThrowInternal(nil, "EVENT-3udjs", "Could not find member in list")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (es *ProjectEventstore) ChangeProjectGrantMember(ctx context.Context, member *proj_model.ProjectGrantMember) (*proj_model.ProjectGrantMember, error) {
|
||||||
|
if !member.IsValid() {
|
||||||
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-dkw35", "member is not valid")
|
||||||
|
}
|
||||||
|
existing, err := es.ProjectByID(ctx, member.AggregateID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if !existing.ContainsGrantMember(member) {
|
||||||
|
return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-8dj4s", "User is not member of this grant")
|
||||||
|
}
|
||||||
|
repoProject := model.ProjectFromModel(existing)
|
||||||
|
repoMember := model.GrantMemberFromModel(member)
|
||||||
|
|
||||||
|
projectAggregate := ProjectGrantMemberChangedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoMember)
|
||||||
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
||||||
|
es.projectCache.cacheProject(repoProject)
|
||||||
|
if _, g := model.GetProjectGrant(repoProject.Grants, member.GrantID); g != nil {
|
||||||
|
if _, m := model.GetProjectGrantMember(g.Members, member.UserID); m != nil {
|
||||||
|
return model.GrantMemberToModel(m), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, caos_errs.ThrowInternal(nil, "EVENT-s8ur3", "Could not find member in list")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (es *ProjectEventstore) RemoveProjectGrantMember(ctx context.Context, member *proj_model.ProjectGrantMember) error {
|
||||||
|
if member.UserID == "" {
|
||||||
|
return caos_errs.ThrowPreconditionFailed(nil, "EVENT-8su4r", "member is not valid")
|
||||||
|
}
|
||||||
|
existing, err := es.ProjectByID(ctx, member.AggregateID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !existing.ContainsGrantMember(member) {
|
||||||
|
return caos_errs.ThrowPreconditionFailed(nil, "EVENT-9ode4", "User is not member of this grant")
|
||||||
|
}
|
||||||
|
repoProject := model.ProjectFromModel(existing)
|
||||||
|
repoMember := model.GrantMemberFromModel(member)
|
||||||
|
|
||||||
|
projectAggregate := ProjectGrantMemberRemovedAggregate(es.Eventstore.AggregateCreator(), repoProject, repoMember)
|
||||||
|
err = es_sdk.Push(ctx, es.PushAggregates, repoProject.AppendEvents, projectAggregate)
|
||||||
|
es.projectCache.cacheProject(repoProject)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
@ -6,7 +6,8 @@ import (
|
|||||||
"github.com/caos/zitadel/internal/crypto"
|
"github.com/caos/zitadel/internal/crypto"
|
||||||
"github.com/caos/zitadel/internal/eventstore/mock"
|
"github.com/caos/zitadel/internal/eventstore/mock"
|
||||||
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
"github.com/caos/zitadel/internal/project/model"
|
proj_model "github.com/caos/zitadel/internal/project/model"
|
||||||
|
"github.com/caos/zitadel/internal/project/repository/eventsourcing/model"
|
||||||
"github.com/golang/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/sony/sonyflake"
|
"github.com/sony/sonyflake"
|
||||||
)
|
)
|
||||||
@ -47,9 +48,9 @@ func GetMockPwGenerator(ctrl *gomock.Controller) crypto.Generator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetMockProjectByIDOK(ctrl *gomock.Controller) *ProjectEventstore {
|
func GetMockProjectByIDOK(ctrl *gomock.Controller) *ProjectEventstore {
|
||||||
data, _ := json.Marshal(Project{Name: "Name"})
|
data, _ := json.Marshal(model.Project{Name: "Name"})
|
||||||
events := []*es_models.Event{
|
events := []*es_models.Event{
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectAdded, Data: data},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.ProjectAdded, Data: data},
|
||||||
}
|
}
|
||||||
mockEs := mock.NewMockEventstore(ctrl)
|
mockEs := mock.NewMockEventstore(ctrl)
|
||||||
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
||||||
@ -64,9 +65,9 @@ func GetMockProjectByIDNoEvents(ctrl *gomock.Controller) *ProjectEventstore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetMockManipulateProject(ctrl *gomock.Controller) *ProjectEventstore {
|
func GetMockManipulateProject(ctrl *gomock.Controller) *ProjectEventstore {
|
||||||
data, _ := json.Marshal(Project{Name: "Name"})
|
data, _ := json.Marshal(model.Project{Name: "Name"})
|
||||||
events := []*es_models.Event{
|
events := []*es_models.Event{
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectAdded, Data: data},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.ProjectAdded, Data: data},
|
||||||
}
|
}
|
||||||
mockEs := mock.NewMockEventstore(ctrl)
|
mockEs := mock.NewMockEventstore(ctrl)
|
||||||
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
||||||
@ -76,9 +77,9 @@ func GetMockManipulateProject(ctrl *gomock.Controller) *ProjectEventstore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetMockManipulateProjectWithPw(ctrl *gomock.Controller) *ProjectEventstore {
|
func GetMockManipulateProjectWithPw(ctrl *gomock.Controller) *ProjectEventstore {
|
||||||
data, _ := json.Marshal(Project{Name: "Name"})
|
data, _ := json.Marshal(model.Project{Name: "Name"})
|
||||||
events := []*es_models.Event{
|
events := []*es_models.Event{
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectAdded, Data: data},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.ProjectAdded, Data: data},
|
||||||
}
|
}
|
||||||
mockEs := mock.NewMockEventstore(ctrl)
|
mockEs := mock.NewMockEventstore(ctrl)
|
||||||
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
||||||
@ -88,10 +89,10 @@ func GetMockManipulateProjectWithPw(ctrl *gomock.Controller) *ProjectEventstore
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetMockManipulateInactiveProject(ctrl *gomock.Controller) *ProjectEventstore {
|
func GetMockManipulateInactiveProject(ctrl *gomock.Controller) *ProjectEventstore {
|
||||||
data, _ := json.Marshal(Project{Name: "Name"})
|
data, _ := json.Marshal(model.Project{Name: "Name"})
|
||||||
events := []*es_models.Event{
|
events := []*es_models.Event{
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectAdded, Data: data},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.ProjectAdded, Data: data},
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 2, Type: model.ProjectDeactivated, Data: data},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 2, Type: proj_model.ProjectDeactivated, Data: data},
|
||||||
}
|
}
|
||||||
mockEs := mock.NewMockEventstore(ctrl)
|
mockEs := mock.NewMockEventstore(ctrl)
|
||||||
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
||||||
@ -101,11 +102,11 @@ func GetMockManipulateInactiveProject(ctrl *gomock.Controller) *ProjectEventstor
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetMockManipulateProjectWithMember(ctrl *gomock.Controller) *ProjectEventstore {
|
func GetMockManipulateProjectWithMember(ctrl *gomock.Controller) *ProjectEventstore {
|
||||||
data, _ := json.Marshal(Project{Name: "Name"})
|
data, _ := json.Marshal(model.Project{Name: "Name"})
|
||||||
memberData, _ := json.Marshal(ProjectMember{UserID: "UserID", Roles: []string{"Role"}})
|
memberData, _ := json.Marshal(model.ProjectMember{UserID: "UserID", Roles: []string{"Role"}})
|
||||||
events := []*es_models.Event{
|
events := []*es_models.Event{
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectAdded, Data: data},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.ProjectAdded, Data: data},
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectMemberAdded, Data: memberData},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.ProjectMemberAdded, Data: memberData},
|
||||||
}
|
}
|
||||||
mockEs := mock.NewMockEventstore(ctrl)
|
mockEs := mock.NewMockEventstore(ctrl)
|
||||||
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
||||||
@ -115,11 +116,11 @@ func GetMockManipulateProjectWithMember(ctrl *gomock.Controller) *ProjectEventst
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetMockManipulateProjectWithRole(ctrl *gomock.Controller) *ProjectEventstore {
|
func GetMockManipulateProjectWithRole(ctrl *gomock.Controller) *ProjectEventstore {
|
||||||
data, _ := json.Marshal(Project{Name: "Name"})
|
data, _ := json.Marshal(model.Project{Name: "Name"})
|
||||||
roleData, _ := json.Marshal(ProjectRole{Key: "Key", DisplayName: "DisplayName", Group: "Group"})
|
roleData, _ := json.Marshal(model.ProjectRole{Key: "Key", DisplayName: "DisplayName", Group: "Group"})
|
||||||
events := []*es_models.Event{
|
events := []*es_models.Event{
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectAdded, Data: data},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.ProjectAdded, Data: data},
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectRoleAdded, Data: roleData},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.ProjectRoleAdded, Data: roleData},
|
||||||
}
|
}
|
||||||
mockEs := mock.NewMockEventstore(ctrl)
|
mockEs := mock.NewMockEventstore(ctrl)
|
||||||
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
||||||
@ -129,17 +130,17 @@ func GetMockManipulateProjectWithRole(ctrl *gomock.Controller) *ProjectEventstor
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetMockManipulateProjectWithOIDCApp(ctrl *gomock.Controller) *ProjectEventstore {
|
func GetMockManipulateProjectWithOIDCApp(ctrl *gomock.Controller) *ProjectEventstore {
|
||||||
data, _ := json.Marshal(Project{Name: "Name"})
|
data, _ := json.Marshal(model.Project{Name: "Name"})
|
||||||
appData, _ := json.Marshal(Application{AppID: "AppID", Name: "Name"})
|
appData, _ := json.Marshal(model.Application{AppID: "AppID", Name: "Name"})
|
||||||
oidcData, _ := json.Marshal(OIDCConfig{
|
oidcData, _ := json.Marshal(model.OIDCConfig{
|
||||||
AppID: "AppID",
|
AppID: "AppID",
|
||||||
ResponseTypes: []int32{int32(model.OIDCRESPONSETYPE_CODE)},
|
ResponseTypes: []int32{int32(proj_model.OIDCRESPONSETYPE_CODE)},
|
||||||
GrantTypes: []int32{int32(model.OIDCGRANTTYPE_AUTHORIZATION_CODE)},
|
GrantTypes: []int32{int32(proj_model.OIDCGRANTTYPE_AUTHORIZATION_CODE)},
|
||||||
})
|
})
|
||||||
events := []*es_models.Event{
|
events := []*es_models.Event{
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectAdded, Data: data},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.ProjectAdded, Data: data},
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ApplicationAdded, Data: appData},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.ApplicationAdded, Data: appData},
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.OIDCConfigAdded, Data: oidcData},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.OIDCConfigAdded, Data: oidcData},
|
||||||
}
|
}
|
||||||
mockEs := mock.NewMockEventstore(ctrl)
|
mockEs := mock.NewMockEventstore(ctrl)
|
||||||
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
||||||
@ -149,12 +150,60 @@ func GetMockManipulateProjectWithOIDCApp(ctrl *gomock.Controller) *ProjectEvents
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetMockManipulateProjectWithSAMLApp(ctrl *gomock.Controller) *ProjectEventstore {
|
func GetMockManipulateProjectWithSAMLApp(ctrl *gomock.Controller) *ProjectEventstore {
|
||||||
data, _ := json.Marshal(Project{Name: "Name"})
|
data, _ := json.Marshal(model.Project{Name: "Name"})
|
||||||
appData, _ := json.Marshal(Application{AppID: "AppID", Name: "Name"})
|
appData, _ := json.Marshal(model.Application{AppID: "AppID", Name: "Name"})
|
||||||
|
|
||||||
events := []*es_models.Event{
|
events := []*es_models.Event{
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectAdded, Data: data},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.ProjectAdded, Data: data},
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ApplicationAdded, Data: appData},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.ApplicationAdded, Data: appData},
|
||||||
|
}
|
||||||
|
mockEs := mock.NewMockEventstore(ctrl)
|
||||||
|
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
||||||
|
mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST"))
|
||||||
|
mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil)
|
||||||
|
return GetMockedEventstore(ctrl, mockEs)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMockManipulateProjectWithGrant(ctrl *gomock.Controller) *ProjectEventstore {
|
||||||
|
data, _ := json.Marshal(model.Project{Name: "Name"})
|
||||||
|
grantData, _ := json.Marshal(model.ProjectGrant{GrantID: "GrantID", GrantedOrgID: "GrantedOrgID", RoleKeys: []string{"Key"}})
|
||||||
|
events := []*es_models.Event{
|
||||||
|
&es_models.Event{AggregateID: "ID", Sequence: 1, Type: proj_model.ProjectAdded, Data: data},
|
||||||
|
&es_models.Event{AggregateID: "ID", Sequence: 1, Type: proj_model.ProjectGrantAdded, Data: grantData},
|
||||||
|
}
|
||||||
|
mockEs := mock.NewMockEventstore(ctrl)
|
||||||
|
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
||||||
|
mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST"))
|
||||||
|
mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil)
|
||||||
|
return GetMockedEventstore(ctrl, mockEs)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMockManipulateProjectWithGrantExistingRole(ctrl *gomock.Controller) *ProjectEventstore {
|
||||||
|
data, _ := json.Marshal(model.Project{Name: "Name"})
|
||||||
|
roleData, _ := json.Marshal(model.ProjectRole{Key: "Key", DisplayName: "DisplayName", Group: "Group"})
|
||||||
|
roleData2, _ := json.Marshal(model.ProjectRole{Key: "KeyChanged", DisplayName: "DisplayName", Group: "Group"})
|
||||||
|
grantData, _ := json.Marshal(model.ProjectGrant{GrantID: "GrantID", GrantedOrgID: "GrantedOrgID", RoleKeys: []string{"Key"}})
|
||||||
|
events := []*es_models.Event{
|
||||||
|
&es_models.Event{AggregateID: "ID", Sequence: 1, Type: proj_model.ProjectAdded, Data: data},
|
||||||
|
&es_models.Event{AggregateID: "ID", Sequence: 1, Type: proj_model.ProjectRoleAdded, Data: roleData},
|
||||||
|
&es_models.Event{AggregateID: "ID", Sequence: 1, Type: proj_model.ProjectRoleAdded, Data: roleData2},
|
||||||
|
&es_models.Event{AggregateID: "ID", Sequence: 1, Type: proj_model.ProjectGrantAdded, Data: grantData},
|
||||||
|
}
|
||||||
|
mockEs := mock.NewMockEventstore(ctrl)
|
||||||
|
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
||||||
|
mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST"))
|
||||||
|
mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil)
|
||||||
|
return GetMockedEventstore(ctrl, mockEs)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMockManipulateProjectWithGrantMember(ctrl *gomock.Controller) *ProjectEventstore {
|
||||||
|
data, _ := json.Marshal(model.Project{Name: "Name"})
|
||||||
|
grantData, _ := json.Marshal(model.ProjectGrant{GrantID: "GrantID", GrantedOrgID: "GrantedOrgID", RoleKeys: []string{"Key"}})
|
||||||
|
memberData, _ := json.Marshal(model.ProjectGrantMember{GrantID: "GrantID", UserID: "UserID", Roles: []string{"Role"}})
|
||||||
|
events := []*es_models.Event{
|
||||||
|
&es_models.Event{AggregateID: "ID", Sequence: 1, Type: proj_model.ProjectAdded, Data: data},
|
||||||
|
&es_models.Event{AggregateID: "ID", Sequence: 1, Type: proj_model.ProjectGrantAdded, Data: grantData},
|
||||||
|
&es_models.Event{AggregateID: "ID", Sequence: 1, Type: proj_model.ProjectGrantMemberAdded, Data: memberData},
|
||||||
}
|
}
|
||||||
mockEs := mock.NewMockEventstore(ctrl)
|
mockEs := mock.NewMockEventstore(ctrl)
|
||||||
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
||||||
@ -173,11 +222,11 @@ func GetMockManipulateProjectNoEvents(ctrl *gomock.Controller) *ProjectEventstor
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetMockProjectMemberByIDsOK(ctrl *gomock.Controller) *ProjectEventstore {
|
func GetMockProjectMemberByIDsOK(ctrl *gomock.Controller) *ProjectEventstore {
|
||||||
projectData, _ := json.Marshal(Project{Name: "Name"})
|
projectData, _ := json.Marshal(model.Project{Name: "Name"})
|
||||||
memberData, _ := json.Marshal(ProjectMember{UserID: "UserID", Roles: []string{"Role"}})
|
memberData, _ := json.Marshal(model.ProjectMember{UserID: "UserID", Roles: []string{"Role"}})
|
||||||
events := []*es_models.Event{
|
events := []*es_models.Event{
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectAdded, Data: projectData},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.ProjectAdded, Data: projectData},
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectMemberAdded, Data: memberData},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.ProjectMemberAdded, Data: memberData},
|
||||||
}
|
}
|
||||||
mockEs := mock.NewMockEventstore(ctrl)
|
mockEs := mock.NewMockEventstore(ctrl)
|
||||||
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
||||||
@ -185,14 +234,42 @@ func GetMockProjectMemberByIDsOK(ctrl *gomock.Controller) *ProjectEventstore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetMockProjectAppsByIDsOK(ctrl *gomock.Controller) *ProjectEventstore {
|
func GetMockProjectAppsByIDsOK(ctrl *gomock.Controller) *ProjectEventstore {
|
||||||
projectData, _ := json.Marshal(Project{Name: "Name"})
|
projectData, _ := json.Marshal(model.Project{Name: "Name"})
|
||||||
appData, _ := json.Marshal(Application{AppID: "AppID", Name: "Name"})
|
appData, _ := json.Marshal(model.Application{AppID: "AppID", Name: "Name"})
|
||||||
oidcData, _ := json.Marshal(OIDCConfig{ClientID: "ClientID"})
|
oidcData, _ := json.Marshal(model.OIDCConfig{ClientID: "ClientID"})
|
||||||
|
|
||||||
events := []*es_models.Event{
|
events := []*es_models.Event{
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectAdded, Data: projectData},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.ProjectAdded, Data: projectData},
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ApplicationAdded, Data: appData},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.ApplicationAdded, Data: appData},
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.OIDCConfigAdded, Data: oidcData},
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: proj_model.OIDCConfigAdded, Data: oidcData},
|
||||||
|
}
|
||||||
|
mockEs := mock.NewMockEventstore(ctrl)
|
||||||
|
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
||||||
|
return GetMockedEventstore(ctrl, mockEs)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMockProjectGrantByIDsOK(ctrl *gomock.Controller) *ProjectEventstore {
|
||||||
|
projectData, _ := json.Marshal(model.Project{Name: "Name"})
|
||||||
|
grantData, _ := json.Marshal(model.ProjectGrant{GrantID: "GrantID", GrantedOrgID: "GrantID", RoleKeys: []string{"Key"}})
|
||||||
|
|
||||||
|
events := []*es_models.Event{
|
||||||
|
&es_models.Event{AggregateID: "ID", Sequence: 1, Type: proj_model.ProjectAdded, Data: projectData},
|
||||||
|
&es_models.Event{AggregateID: "ID", Sequence: 1, Type: proj_model.ProjectGrantAdded, Data: grantData},
|
||||||
|
}
|
||||||
|
mockEs := mock.NewMockEventstore(ctrl)
|
||||||
|
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
||||||
|
return GetMockedEventstore(ctrl, mockEs)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMockProjectGrantMemberByIDsOK(ctrl *gomock.Controller) *ProjectEventstore {
|
||||||
|
projectData, _ := json.Marshal(model.Project{Name: "Name"})
|
||||||
|
grantData, _ := json.Marshal(model.ProjectGrant{GrantID: "GrantID", GrantedOrgID: "GrantID", RoleKeys: []string{"Key"}})
|
||||||
|
memberData, _ := json.Marshal(model.ProjectGrantMember{GrantID: "GrantID", UserID: "UserID", Roles: []string{"Role"}})
|
||||||
|
|
||||||
|
events := []*es_models.Event{
|
||||||
|
&es_models.Event{AggregateID: "ID", Sequence: 1, Type: proj_model.ProjectAdded, Data: projectData},
|
||||||
|
&es_models.Event{AggregateID: "ID", Sequence: 1, Type: proj_model.ProjectGrantAdded, Data: grantData},
|
||||||
|
&es_models.Event{AggregateID: "ID", Sequence: 1, Type: proj_model.ProjectGrantMemberAdded, Data: memberData},
|
||||||
}
|
}
|
||||||
mockEs := mock.NewMockEventstore(ctrl)
|
mockEs := mock.NewMockEventstore(ctrl)
|
||||||
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
|
||||||
|
@ -7,6 +7,7 @@ import (
|
|||||||
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
"github.com/caos/zitadel/internal/project/model"
|
"github.com/caos/zitadel/internal/project/model"
|
||||||
"github.com/golang/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -1763,3 +1764,934 @@ func TestChangeOIDCConfigSecret(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestProjectGrantByID(t *testing.T) {
|
||||||
|
ctrl := gomock.NewController(t)
|
||||||
|
type args struct {
|
||||||
|
es *ProjectEventstore
|
||||||
|
grant *model.ProjectGrant
|
||||||
|
}
|
||||||
|
type res struct {
|
||||||
|
grant *model.ProjectGrant
|
||||||
|
wantErr bool
|
||||||
|
errFunc func(err error) bool
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
res res
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "get grant",
|
||||||
|
args: args{
|
||||||
|
es: GetMockProjectGrantByIDsOK(ctrl),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1}, GrantID: "GrantID"},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
GrantedOrgID: "GrantedOrgID",
|
||||||
|
RoleKeys: []string{"Key"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no events for project",
|
||||||
|
args: args{
|
||||||
|
es: GetMockProjectByIDNoEvents(ctrl),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1}, GrantID: "GrantID"},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsNotFound,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "grant has no id",
|
||||||
|
args: args{
|
||||||
|
es: GetMockProjectByIDNoEvents(ctrl),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1}},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: func(err error) bool {
|
||||||
|
return caos_errs.IsPreconditionFailed(err)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
result, err := tt.args.es.ProjectGrantByIDs(nil, tt.args.grant.AggregateID, tt.args.grant.GrantID)
|
||||||
|
if !tt.res.wantErr && result.AggregateID != tt.res.grant.AggregateID {
|
||||||
|
t.Errorf("got wrong result id: expected: %v, actual: %v ", tt.res.grant.AggregateID, result.AggregateID)
|
||||||
|
}
|
||||||
|
if !tt.res.wantErr && result.GrantID != tt.res.grant.GrantID {
|
||||||
|
t.Errorf("got wrong result grantid: expected: %v, actual: %v ", tt.res.grant.GrantID, result.GrantID)
|
||||||
|
}
|
||||||
|
if tt.res.wantErr && !tt.res.errFunc(err) {
|
||||||
|
t.Errorf("got wrong err: %v ", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAddProjectGrant(t *testing.T) {
|
||||||
|
ctrl := gomock.NewController(t)
|
||||||
|
type args struct {
|
||||||
|
es *ProjectEventstore
|
||||||
|
ctx context.Context
|
||||||
|
grant *model.ProjectGrant
|
||||||
|
}
|
||||||
|
type res struct {
|
||||||
|
result *model.ProjectGrant
|
||||||
|
wantErr bool
|
||||||
|
errFunc func(err error) bool
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
res res
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "add grant, ok",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectWithRole(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
GrantedOrgID: "GrantedOrgID",
|
||||||
|
RoleKeys: []string{"Key"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
result: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
GrantedOrgID: "GrantedOrgID",
|
||||||
|
RoleKeys: []string{"Key"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid grant",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProject(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsPreconditionFailed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "grant for org already exists",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectWithGrant(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
GrantedOrgID: "GrantedOrgID",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsPreconditionFailed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "role not existing on project",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProject(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
GrantedOrgID: "GrantedOrgID",
|
||||||
|
RoleKeys: []string{"Key"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsPreconditionFailed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "existing project not found",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectNoEvents(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
GrantedOrgID: "GrantedOrgID",
|
||||||
|
RoleKeys: []string{"Key"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsNotFound,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
result, err := tt.args.es.AddProjectGrant(tt.args.ctx, tt.args.grant)
|
||||||
|
|
||||||
|
if !tt.res.wantErr && result.GrantID == "" {
|
||||||
|
t.Errorf("result has no id")
|
||||||
|
}
|
||||||
|
if tt.res.wantErr && !tt.res.errFunc(err) {
|
||||||
|
t.Errorf("got wrong err: %v ", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestChangeProjectGrant(t *testing.T) {
|
||||||
|
ctrl := gomock.NewController(t)
|
||||||
|
type args struct {
|
||||||
|
es *ProjectEventstore
|
||||||
|
ctx context.Context
|
||||||
|
grant *model.ProjectGrant
|
||||||
|
}
|
||||||
|
type res struct {
|
||||||
|
result *model.ProjectGrant
|
||||||
|
wantErr bool
|
||||||
|
errFunc func(err error) bool
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
res res
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "change grant, ok",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectWithGrantExistingRole(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
GrantedOrgID: "GrantedOrgID",
|
||||||
|
RoleKeys: []string{"KeyChanged"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
result: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
GrantedOrgID: "GrantedOrgID",
|
||||||
|
RoleKeys: []string{"KeyChanged"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid grant",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProject(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
RoleKeys: []string{"KeyChanged"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsPreconditionFailed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "grant not existing",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProject(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
GrantedOrgID: "GrantedOrgID",
|
||||||
|
RoleKeys: []string{"KeyChanged"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsPreconditionFailed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "role not existing",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectWithGrant(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
GrantedOrgID: "GrantedOrgID",
|
||||||
|
RoleKeys: []string{"KeyChanged"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsPreconditionFailed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "existing project not found",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectNoEvents(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
GrantedOrgID: "GrantedOrgID",
|
||||||
|
RoleKeys: []string{"KeyChanged"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsNotFound,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
result, err := tt.args.es.ChangeProjectGrant(tt.args.ctx, tt.args.grant)
|
||||||
|
|
||||||
|
if !tt.res.wantErr && result.AggregateID == "" {
|
||||||
|
t.Errorf("result has no id")
|
||||||
|
}
|
||||||
|
if !tt.res.wantErr && result.GrantID != tt.res.result.GrantID {
|
||||||
|
t.Errorf("got wrong result GrantID: expected: %v, actual: %v ", tt.res.result.GrantID, result.GrantID)
|
||||||
|
}
|
||||||
|
if !tt.res.wantErr && !reflect.DeepEqual(result.RoleKeys, tt.res.result.RoleKeys) {
|
||||||
|
t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.res.result.RoleKeys, result.GrantID)
|
||||||
|
}
|
||||||
|
if tt.res.wantErr && !tt.res.errFunc(err) {
|
||||||
|
t.Errorf("got wrong err: %v ", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRemoveProjectGrant(t *testing.T) {
|
||||||
|
ctrl := gomock.NewController(t)
|
||||||
|
type args struct {
|
||||||
|
es *ProjectEventstore
|
||||||
|
ctx context.Context
|
||||||
|
grant *model.ProjectGrant
|
||||||
|
}
|
||||||
|
type res struct {
|
||||||
|
wantErr bool
|
||||||
|
errFunc func(err error) bool
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
res res
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "remove app, ok",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectWithGrant(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no grantID",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProject(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1}},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsPreconditionFailed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "grant not existing",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProject(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsPreconditionFailed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "existing project not found",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectNoEvents(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsNotFound,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
err := tt.args.es.RemoveProjectGrant(tt.args.ctx, tt.args.grant)
|
||||||
|
|
||||||
|
if !tt.res.wantErr && err != nil {
|
||||||
|
t.Errorf("should not get err")
|
||||||
|
}
|
||||||
|
if tt.res.wantErr && !tt.res.errFunc(err) {
|
||||||
|
t.Errorf("got wrong err: %v ", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDeactivateProjectGrant(t *testing.T) {
|
||||||
|
ctrl := gomock.NewController(t)
|
||||||
|
type args struct {
|
||||||
|
es *ProjectEventstore
|
||||||
|
ctx context.Context
|
||||||
|
grant *model.ProjectGrant
|
||||||
|
}
|
||||||
|
type res struct {
|
||||||
|
result *model.ProjectGrant
|
||||||
|
wantErr bool
|
||||||
|
errFunc func(err error) bool
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
res res
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "deactivate, ok",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectWithGrant(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
result: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
State: model.PROJECTGRANTSTATE_INACTIVE,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no grant id",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProject(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1}},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsPreconditionFailed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "grant not existing",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProject(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsPreconditionFailed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "existing project not found",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectNoEvents(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsNotFound,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
result, err := tt.args.es.DeactivateProjectGrant(tt.args.ctx, tt.args.grant.AggregateID, tt.args.grant.GrantID)
|
||||||
|
|
||||||
|
if !tt.res.wantErr && result.AggregateID == "" {
|
||||||
|
t.Errorf("result has no id")
|
||||||
|
}
|
||||||
|
if !tt.res.wantErr && result.GrantID != tt.res.result.GrantID {
|
||||||
|
t.Errorf("got wrong result AppID: expected: %v, actual: %v ", tt.res.result.GrantID, result.GrantID)
|
||||||
|
}
|
||||||
|
if !tt.res.wantErr && result.State != tt.res.result.State {
|
||||||
|
t.Errorf("got wrong result state: expected: %v, actual: %v ", tt.res.result.State, result.State)
|
||||||
|
}
|
||||||
|
if tt.res.wantErr && !tt.res.errFunc(err) {
|
||||||
|
t.Errorf("got wrong err: %v ", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReactivateProjectGrant(t *testing.T) {
|
||||||
|
ctrl := gomock.NewController(t)
|
||||||
|
type args struct {
|
||||||
|
es *ProjectEventstore
|
||||||
|
ctx context.Context
|
||||||
|
grant *model.ProjectGrant
|
||||||
|
}
|
||||||
|
type res struct {
|
||||||
|
result *model.ProjectGrant
|
||||||
|
wantErr bool
|
||||||
|
errFunc func(err error) bool
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
res res
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "reactivate, ok",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectWithGrant(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
result: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
State: model.PROJECTGRANTSTATE_ACTIVE,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no grant id",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProject(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1}},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsPreconditionFailed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "grant not existing",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProject(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsPreconditionFailed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "existing project not found",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectNoEvents(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
grant: &model.ProjectGrant{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsNotFound,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
result, err := tt.args.es.ReactivateProjectGrant(tt.args.ctx, tt.args.grant.AggregateID, tt.args.grant.GrantID)
|
||||||
|
|
||||||
|
if !tt.res.wantErr && result.AggregateID == "" {
|
||||||
|
t.Errorf("result has no id")
|
||||||
|
}
|
||||||
|
if !tt.res.wantErr && result.GrantID != tt.res.result.GrantID {
|
||||||
|
t.Errorf("got wrong result AppID: expected: %v, actual: %v ", tt.res.result.GrantID, result.GrantID)
|
||||||
|
}
|
||||||
|
if !tt.res.wantErr && result.State != tt.res.result.State {
|
||||||
|
t.Errorf("got wrong result state: expected: %v, actual: %v ", tt.res.result.State, result.State)
|
||||||
|
}
|
||||||
|
if tt.res.wantErr && !tt.res.errFunc(err) {
|
||||||
|
t.Errorf("got wrong err: %v ", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestProjectGrantMemberByIDs(t *testing.T) {
|
||||||
|
ctrl := gomock.NewController(t)
|
||||||
|
type args struct {
|
||||||
|
es *ProjectEventstore
|
||||||
|
member *model.ProjectGrantMember
|
||||||
|
}
|
||||||
|
type res struct {
|
||||||
|
member *model.ProjectGrantMember
|
||||||
|
wantErr bool
|
||||||
|
errFunc func(err error) bool
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
res res
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "projectgrant member from events, ok",
|
||||||
|
args: args{
|
||||||
|
es: GetMockProjectGrantMemberByIDsOK(ctrl),
|
||||||
|
member: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1}, GrantID: "GrantID", UserID: "UserID"},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
member: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1}, GrantID: "GrantID", UserID: "UserID", Roles: []string{"Role"}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no project events",
|
||||||
|
args: args{
|
||||||
|
es: GetMockProjectByIDNoEvents(ctrl),
|
||||||
|
member: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1}, GrantID: "GrantID", UserID: "UserID"},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsNotFound,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "member id missing",
|
||||||
|
args: args{
|
||||||
|
es: GetMockProjectByIDNoEvents(ctrl),
|
||||||
|
member: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1}},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: func(err error) bool {
|
||||||
|
return caos_errs.IsPreconditionFailed(err)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
result, err := tt.args.es.ProjectGrantMemberByIDs(nil, tt.args.member)
|
||||||
|
if !tt.res.wantErr && result.AggregateID != tt.res.member.AggregateID {
|
||||||
|
t.Errorf("got wrong result id: expected: %v, actual: %v ", tt.res.member.AggregateID, result.AggregateID)
|
||||||
|
}
|
||||||
|
if !tt.res.wantErr && result.UserID != tt.res.member.UserID {
|
||||||
|
t.Errorf("got wrong result userid: expected: %v, actual: %v ", tt.res.member.UserID, result.UserID)
|
||||||
|
}
|
||||||
|
if !tt.res.wantErr && len(result.Roles) != len(tt.res.member.Roles) {
|
||||||
|
t.Errorf("got wrong result roles: expected: %v, actual: %v ", tt.res.member.Roles, result.Roles)
|
||||||
|
}
|
||||||
|
if tt.res.wantErr && !tt.res.errFunc(err) {
|
||||||
|
t.Errorf("got wrong err: %v ", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAddProjectGrantMember(t *testing.T) {
|
||||||
|
ctrl := gomock.NewController(t)
|
||||||
|
type args struct {
|
||||||
|
es *ProjectEventstore
|
||||||
|
ctx context.Context
|
||||||
|
member *model.ProjectGrantMember
|
||||||
|
}
|
||||||
|
type res struct {
|
||||||
|
result *model.ProjectGrantMember
|
||||||
|
wantErr bool
|
||||||
|
errFunc func(err error) bool
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
res res
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "add project grant member",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectWithGrantExistingRole(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
member: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
UserID: "UserID",
|
||||||
|
Roles: []string{"Role"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
result: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
UserID: "UserID",
|
||||||
|
Roles: []string{"Role"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid member",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProject(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
member: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
Roles: []string{"Role"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsPreconditionFailed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "existing project not found",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectNoEvents(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
member: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
UserID: "UserID",
|
||||||
|
Roles: []string{"Role"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsNotFound,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "member already existing",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectWithGrantMember(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
member: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
UserID: "UserID",
|
||||||
|
Roles: []string{"Role"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsErrorAlreadyExists,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
result, err := tt.args.es.AddProjectGrantMember(tt.args.ctx, tt.args.member)
|
||||||
|
|
||||||
|
if !tt.res.wantErr && result.AggregateID == "" {
|
||||||
|
t.Errorf("result has no id")
|
||||||
|
}
|
||||||
|
if !tt.res.wantErr && result.GrantID != tt.res.result.GrantID {
|
||||||
|
t.Errorf("got wrong result GrantID: expected: %v, actual: %v ", tt.res.result.GrantID, result.GrantID)
|
||||||
|
}
|
||||||
|
if tt.res.wantErr && !tt.res.errFunc(err) {
|
||||||
|
t.Errorf("got wrong err: %v ", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestChangeProjectGrantMember(t *testing.T) {
|
||||||
|
ctrl := gomock.NewController(t)
|
||||||
|
type args struct {
|
||||||
|
es *ProjectEventstore
|
||||||
|
ctx context.Context
|
||||||
|
member *model.ProjectGrantMember
|
||||||
|
}
|
||||||
|
type res struct {
|
||||||
|
result *model.ProjectGrantMember
|
||||||
|
wantErr bool
|
||||||
|
errFunc func(err error) bool
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
res res
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "change project grant member",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectWithGrantMember(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
member: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
UserID: "UserID",
|
||||||
|
Roles: []string{"RoleChanged"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
result: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
UserID: "UserID",
|
||||||
|
Roles: []string{"RoleChanged"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid member",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProject(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
member: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
Roles: []string{"Role"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsPreconditionFailed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "existing project not found",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectNoEvents(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
member: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
UserID: "UserID",
|
||||||
|
Roles: []string{"Role"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsNotFound,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "user not member of grant",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectWithGrant(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
member: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
UserID: "UserID",
|
||||||
|
Roles: []string{"Role"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsPreconditionFailed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
result, err := tt.args.es.ChangeProjectGrantMember(tt.args.ctx, tt.args.member)
|
||||||
|
|
||||||
|
if !tt.res.wantErr && result.AggregateID == "" {
|
||||||
|
t.Errorf("result has no id")
|
||||||
|
}
|
||||||
|
if !tt.res.wantErr && result.GrantID != tt.res.result.GrantID {
|
||||||
|
t.Errorf("got wrong result GrantID: expected: %v, actual: %v ", tt.res.result.GrantID, result.GrantID)
|
||||||
|
}
|
||||||
|
if tt.res.wantErr && !tt.res.errFunc(err) {
|
||||||
|
t.Errorf("got wrong err: %v ", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRemoveProjectGrantMember(t *testing.T) {
|
||||||
|
ctrl := gomock.NewController(t)
|
||||||
|
type args struct {
|
||||||
|
es *ProjectEventstore
|
||||||
|
ctx context.Context
|
||||||
|
member *model.ProjectGrantMember
|
||||||
|
}
|
||||||
|
type res struct {
|
||||||
|
wantErr bool
|
||||||
|
errFunc func(err error) bool
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
res res
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "remove project grant member",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectWithGrantMember(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
member: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
UserID: "UserID",
|
||||||
|
Roles: []string{"RoleChanged"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid member",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProject(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
member: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
Roles: []string{"Role"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsPreconditionFailed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "existing project not found",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectNoEvents(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
member: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
UserID: "UserID",
|
||||||
|
Roles: []string{"Role"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsNotFound,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "user not member of grant",
|
||||||
|
args: args{
|
||||||
|
es: GetMockManipulateProjectWithGrant(ctrl),
|
||||||
|
ctx: auth.NewMockContext("orgID", "userID"),
|
||||||
|
member: &model.ProjectGrantMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID", Sequence: 1},
|
||||||
|
GrantID: "GrantID",
|
||||||
|
UserID: "UserID",
|
||||||
|
Roles: []string{"Role"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
wantErr: true,
|
||||||
|
errFunc: caos_errs.IsPreconditionFailed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
err := tt.args.es.RemoveProjectGrantMember(tt.args.ctx, tt.args.member)
|
||||||
|
|
||||||
|
if !tt.res.wantErr && err != nil {
|
||||||
|
t.Errorf("should not get err")
|
||||||
|
}
|
||||||
|
if tt.res.wantErr && !tt.res.errFunc(err) {
|
||||||
|
t.Errorf("got wrong err: %v ", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,614 +0,0 @@
|
|||||||
package eventsourcing
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"github.com/caos/logging"
|
|
||||||
"github.com/caos/zitadel/internal/crypto"
|
|
||||||
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
|
||||||
"github.com/caos/zitadel/internal/project/model"
|
|
||||||
"reflect"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
projectVersion = "v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Project struct {
|
|
||||||
es_models.ObjectRoot
|
|
||||||
Name string `json:"name,omitempty"`
|
|
||||||
State int32 `json:"-"`
|
|
||||||
Members []*ProjectMember `json:"-"`
|
|
||||||
Roles []*ProjectRole `json:"-"`
|
|
||||||
Applications []*Application `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ProjectMember struct {
|
|
||||||
es_models.ObjectRoot
|
|
||||||
UserID string `json:"userId,omitempty"`
|
|
||||||
Roles []string `json:"roles,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ProjectRole struct {
|
|
||||||
es_models.ObjectRoot
|
|
||||||
Key string `json:"key,omitempty"`
|
|
||||||
DisplayName string `json:"displayName,omitempty"`
|
|
||||||
Group string `json:"group,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Application struct {
|
|
||||||
es_models.ObjectRoot
|
|
||||||
AppID string `json:"appId"`
|
|
||||||
State int32 `json:"-"`
|
|
||||||
Name string `json:"name,omitempty"`
|
|
||||||
Type int32 `json:"appType,omitempty"`
|
|
||||||
OIDCConfig *OIDCConfig `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ApplicationID struct {
|
|
||||||
es_models.ObjectRoot
|
|
||||||
AppID string `json:"appId"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type OIDCConfig struct {
|
|
||||||
es_models.ObjectRoot
|
|
||||||
AppID string `json:"appId"`
|
|
||||||
ClientID string `json:"clientId,omitempty"`
|
|
||||||
ClientSecret *crypto.CryptoValue `json:"clientSecret,omitempty"`
|
|
||||||
RedirectUris []string `json:"redirectUris,omitempty"`
|
|
||||||
ResponseTypes []int32 `json:"responseTypes,omitempty"`
|
|
||||||
GrantTypes []int32 `json:"grantTypes,omitempty"`
|
|
||||||
ApplicationType int32 `json:"applicationType,omitempty"`
|
|
||||||
AuthMethodType int32 `json:"authMethodType,omitempty"`
|
|
||||||
PostLogoutRedirectUris []string `json:"postLogoutRedirectUris,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Project) Changes(changed *Project) map[string]interface{} {
|
|
||||||
changes := make(map[string]interface{}, 1)
|
|
||||||
if changed.Name != "" && p.Name != changed.Name {
|
|
||||||
changes["name"] = changed.Name
|
|
||||||
}
|
|
||||||
return changes
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *Application) Changes(changed *Application) map[string]interface{} {
|
|
||||||
changes := make(map[string]interface{}, 1)
|
|
||||||
changes["appId"] = a.AppID
|
|
||||||
if changed.Name != "" && a.Name != changed.Name {
|
|
||||||
changes["name"] = changed.Name
|
|
||||||
}
|
|
||||||
return changes
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *OIDCConfig) Changes(changed *OIDCConfig) map[string]interface{} {
|
|
||||||
changes := make(map[string]interface{}, 1)
|
|
||||||
changes["appId"] = c.AppID
|
|
||||||
if !reflect.DeepEqual(c.RedirectUris, changed.RedirectUris) {
|
|
||||||
changes["redirectUris"] = changed.RedirectUris
|
|
||||||
}
|
|
||||||
if !reflect.DeepEqual(c.ResponseTypes, changed.ResponseTypes) {
|
|
||||||
changes["responseTypes"] = changed.ResponseTypes
|
|
||||||
}
|
|
||||||
if !reflect.DeepEqual(c.GrantTypes, changed.GrantTypes) {
|
|
||||||
changes["grantTypes"] = changed.GrantTypes
|
|
||||||
}
|
|
||||||
if c.ApplicationType != changed.ApplicationType {
|
|
||||||
changes["applicationType"] = changed.ApplicationType
|
|
||||||
}
|
|
||||||
if c.AuthMethodType != changed.AuthMethodType {
|
|
||||||
changes["authMethodType"] = changed.AuthMethodType
|
|
||||||
}
|
|
||||||
if !reflect.DeepEqual(c.PostLogoutRedirectUris, changed.PostLogoutRedirectUris) {
|
|
||||||
changes["postLogoutRedirectUris"] = changed.PostLogoutRedirectUris
|
|
||||||
}
|
|
||||||
return changes
|
|
||||||
}
|
|
||||||
|
|
||||||
func ProjectFromModel(project *model.Project) *Project {
|
|
||||||
members := ProjectMembersFromModel(project.Members)
|
|
||||||
roles := ProjectRolesFromModel(project.Roles)
|
|
||||||
apps := AppsFromModel(project.Applications)
|
|
||||||
return &Project{
|
|
||||||
ObjectRoot: es_models.ObjectRoot{
|
|
||||||
AggregateID: project.ObjectRoot.AggregateID,
|
|
||||||
Sequence: project.Sequence,
|
|
||||||
ChangeDate: project.ChangeDate,
|
|
||||||
CreationDate: project.CreationDate,
|
|
||||||
},
|
|
||||||
Name: project.Name,
|
|
||||||
State: int32(project.State),
|
|
||||||
Members: members,
|
|
||||||
Roles: roles,
|
|
||||||
Applications: apps,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ProjectToModel(project *Project) *model.Project {
|
|
||||||
members := ProjectMembersToModel(project.Members)
|
|
||||||
roles := ProjectRolesToModel(project.Roles)
|
|
||||||
apps := AppsToModel(project.Applications)
|
|
||||||
return &model.Project{
|
|
||||||
ObjectRoot: es_models.ObjectRoot{
|
|
||||||
AggregateID: project.AggregateID,
|
|
||||||
ChangeDate: project.ChangeDate,
|
|
||||||
CreationDate: project.CreationDate,
|
|
||||||
Sequence: project.Sequence,
|
|
||||||
},
|
|
||||||
Name: project.Name,
|
|
||||||
State: model.ProjectState(project.State),
|
|
||||||
Members: members,
|
|
||||||
Roles: roles,
|
|
||||||
Applications: apps,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ProjectMembersToModel(members []*ProjectMember) []*model.ProjectMember {
|
|
||||||
convertedMembers := make([]*model.ProjectMember, len(members))
|
|
||||||
for i, m := range members {
|
|
||||||
convertedMembers[i] = ProjectMemberToModel(m)
|
|
||||||
}
|
|
||||||
return convertedMembers
|
|
||||||
}
|
|
||||||
|
|
||||||
func ProjectMembersFromModel(members []*model.ProjectMember) []*ProjectMember {
|
|
||||||
convertedMembers := make([]*ProjectMember, len(members))
|
|
||||||
for i, m := range members {
|
|
||||||
convertedMembers[i] = ProjectMemberFromModel(m)
|
|
||||||
}
|
|
||||||
return convertedMembers
|
|
||||||
}
|
|
||||||
|
|
||||||
func ProjectMemberFromModel(member *model.ProjectMember) *ProjectMember {
|
|
||||||
return &ProjectMember{
|
|
||||||
ObjectRoot: es_models.ObjectRoot{
|
|
||||||
AggregateID: member.ObjectRoot.AggregateID,
|
|
||||||
Sequence: member.Sequence,
|
|
||||||
ChangeDate: member.ChangeDate,
|
|
||||||
CreationDate: member.CreationDate,
|
|
||||||
},
|
|
||||||
UserID: member.UserID,
|
|
||||||
Roles: member.Roles,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ProjectMemberToModel(member *ProjectMember) *model.ProjectMember {
|
|
||||||
return &model.ProjectMember{
|
|
||||||
ObjectRoot: es_models.ObjectRoot{
|
|
||||||
AggregateID: member.AggregateID,
|
|
||||||
ChangeDate: member.ChangeDate,
|
|
||||||
CreationDate: member.CreationDate,
|
|
||||||
Sequence: member.Sequence,
|
|
||||||
},
|
|
||||||
UserID: member.UserID,
|
|
||||||
Roles: member.Roles,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ProjectRolesToModel(roles []*ProjectRole) []*model.ProjectRole {
|
|
||||||
convertedRoles := make([]*model.ProjectRole, len(roles))
|
|
||||||
for i, r := range roles {
|
|
||||||
convertedRoles[i] = ProjectRoleToModel(r)
|
|
||||||
}
|
|
||||||
return convertedRoles
|
|
||||||
}
|
|
||||||
|
|
||||||
func ProjectRolesFromModel(roles []*model.ProjectRole) []*ProjectRole {
|
|
||||||
convertedRoles := make([]*ProjectRole, len(roles))
|
|
||||||
for i, r := range roles {
|
|
||||||
convertedRoles[i] = ProjectRoleFromModel(r)
|
|
||||||
}
|
|
||||||
return convertedRoles
|
|
||||||
}
|
|
||||||
|
|
||||||
func ProjectRoleFromModel(role *model.ProjectRole) *ProjectRole {
|
|
||||||
return &ProjectRole{
|
|
||||||
ObjectRoot: es_models.ObjectRoot{
|
|
||||||
AggregateID: role.ObjectRoot.AggregateID,
|
|
||||||
Sequence: role.Sequence,
|
|
||||||
ChangeDate: role.ChangeDate,
|
|
||||||
CreationDate: role.CreationDate,
|
|
||||||
},
|
|
||||||
Key: role.Key,
|
|
||||||
DisplayName: role.DisplayName,
|
|
||||||
Group: role.Group,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ProjectRoleToModel(role *ProjectRole) *model.ProjectRole {
|
|
||||||
return &model.ProjectRole{
|
|
||||||
ObjectRoot: es_models.ObjectRoot{
|
|
||||||
AggregateID: role.AggregateID,
|
|
||||||
ChangeDate: role.ChangeDate,
|
|
||||||
CreationDate: role.CreationDate,
|
|
||||||
Sequence: role.Sequence,
|
|
||||||
},
|
|
||||||
Key: role.Key,
|
|
||||||
DisplayName: role.DisplayName,
|
|
||||||
Group: role.Group,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func AppsToModel(apps []*Application) []*model.Application {
|
|
||||||
convertedApps := make([]*model.Application, len(apps))
|
|
||||||
for i, a := range apps {
|
|
||||||
convertedApps[i] = AppToModel(a)
|
|
||||||
}
|
|
||||||
return convertedApps
|
|
||||||
}
|
|
||||||
|
|
||||||
func AppsFromModel(apps []*model.Application) []*Application {
|
|
||||||
convertedApps := make([]*Application, len(apps))
|
|
||||||
for i, a := range apps {
|
|
||||||
convertedApps[i] = AppFromModel(a)
|
|
||||||
}
|
|
||||||
return convertedApps
|
|
||||||
}
|
|
||||||
|
|
||||||
func AppFromModel(app *model.Application) *Application {
|
|
||||||
converted := &Application{
|
|
||||||
ObjectRoot: es_models.ObjectRoot{
|
|
||||||
AggregateID: app.ObjectRoot.AggregateID,
|
|
||||||
Sequence: app.Sequence,
|
|
||||||
ChangeDate: app.ChangeDate,
|
|
||||||
CreationDate: app.CreationDate,
|
|
||||||
},
|
|
||||||
AppID: app.AppID,
|
|
||||||
Name: app.Name,
|
|
||||||
State: int32(app.State),
|
|
||||||
Type: int32(app.Type),
|
|
||||||
}
|
|
||||||
if app.OIDCConfig != nil {
|
|
||||||
converted.OIDCConfig = OIDCConfigFromModel(app.OIDCConfig)
|
|
||||||
}
|
|
||||||
return converted
|
|
||||||
}
|
|
||||||
|
|
||||||
func AppToModel(app *Application) *model.Application {
|
|
||||||
converted := &model.Application{
|
|
||||||
ObjectRoot: es_models.ObjectRoot{
|
|
||||||
AggregateID: app.AggregateID,
|
|
||||||
ChangeDate: app.ChangeDate,
|
|
||||||
CreationDate: app.CreationDate,
|
|
||||||
Sequence: app.Sequence,
|
|
||||||
},
|
|
||||||
AppID: app.AppID,
|
|
||||||
Name: app.Name,
|
|
||||||
State: model.AppState(app.State),
|
|
||||||
Type: model.AppType(app.Type),
|
|
||||||
}
|
|
||||||
if app.OIDCConfig != nil {
|
|
||||||
converted.OIDCConfig = OIDCConfigToModel(app.OIDCConfig)
|
|
||||||
}
|
|
||||||
return converted
|
|
||||||
}
|
|
||||||
|
|
||||||
func OIDCConfigFromModel(config *model.OIDCConfig) *OIDCConfig {
|
|
||||||
responseTypes := make([]int32, len(config.ResponseTypes))
|
|
||||||
for i, rt := range config.ResponseTypes {
|
|
||||||
responseTypes[i] = int32(rt)
|
|
||||||
}
|
|
||||||
grantTypes := make([]int32, len(config.GrantTypes))
|
|
||||||
for i, rt := range config.GrantTypes {
|
|
||||||
grantTypes[i] = int32(rt)
|
|
||||||
}
|
|
||||||
return &OIDCConfig{
|
|
||||||
ObjectRoot: es_models.ObjectRoot{
|
|
||||||
AggregateID: config.ObjectRoot.AggregateID,
|
|
||||||
Sequence: config.Sequence,
|
|
||||||
ChangeDate: config.ChangeDate,
|
|
||||||
CreationDate: config.CreationDate,
|
|
||||||
},
|
|
||||||
AppID: config.AppID,
|
|
||||||
ClientID: config.ClientID,
|
|
||||||
ClientSecret: config.ClientSecret,
|
|
||||||
RedirectUris: config.RedirectUris,
|
|
||||||
ResponseTypes: responseTypes,
|
|
||||||
GrantTypes: grantTypes,
|
|
||||||
ApplicationType: int32(config.ApplicationType),
|
|
||||||
AuthMethodType: int32(config.AuthMethodType),
|
|
||||||
PostLogoutRedirectUris: config.PostLogoutRedirectUris,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func OIDCConfigToModel(config *OIDCConfig) *model.OIDCConfig {
|
|
||||||
responseTypes := make([]model.OIDCResponseType, len(config.ResponseTypes))
|
|
||||||
for i, rt := range config.ResponseTypes {
|
|
||||||
responseTypes[i] = model.OIDCResponseType(rt)
|
|
||||||
}
|
|
||||||
grantTypes := make([]model.OIDCGrantType, len(config.GrantTypes))
|
|
||||||
for i, rt := range config.GrantTypes {
|
|
||||||
grantTypes[i] = model.OIDCGrantType(rt)
|
|
||||||
}
|
|
||||||
return &model.OIDCConfig{
|
|
||||||
ObjectRoot: es_models.ObjectRoot{
|
|
||||||
AggregateID: config.ObjectRoot.AggregateID,
|
|
||||||
Sequence: config.Sequence,
|
|
||||||
ChangeDate: config.ChangeDate,
|
|
||||||
CreationDate: config.CreationDate,
|
|
||||||
},
|
|
||||||
AppID: config.AppID,
|
|
||||||
ClientID: config.ClientID,
|
|
||||||
ClientSecret: config.ClientSecret,
|
|
||||||
RedirectUris: config.RedirectUris,
|
|
||||||
ResponseTypes: responseTypes,
|
|
||||||
GrantTypes: grantTypes,
|
|
||||||
ApplicationType: model.OIDCApplicationType(config.ApplicationType),
|
|
||||||
AuthMethodType: model.OIDCAuthMethodType(config.AuthMethodType),
|
|
||||||
PostLogoutRedirectUris: config.PostLogoutRedirectUris,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ProjectFromEvents(project *Project, events ...*es_models.Event) (*Project, error) {
|
|
||||||
if project == nil {
|
|
||||||
project = &Project{}
|
|
||||||
}
|
|
||||||
|
|
||||||
return project, project.AppendEvents(events...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Project) AppendEvents(events ...*es_models.Event) error {
|
|
||||||
for _, event := range events {
|
|
||||||
if err := p.AppendEvent(event); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Project) AppendEvent(event *es_models.Event) error {
|
|
||||||
p.ObjectRoot.AppendEvent(event)
|
|
||||||
|
|
||||||
switch event.Type {
|
|
||||||
case model.ProjectAdded, model.ProjectChanged:
|
|
||||||
if err := json.Unmarshal(event.Data, p); err != nil {
|
|
||||||
logging.Log("EVEN-idl93").WithError(err).Error("could not unmarshal event data")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
p.State = int32(model.PROJECTSTATE_ACTIVE)
|
|
||||||
return nil
|
|
||||||
case model.ProjectDeactivated:
|
|
||||||
return p.appendDeactivatedEvent()
|
|
||||||
case model.ProjectReactivated:
|
|
||||||
return p.appendReactivatedEvent()
|
|
||||||
case model.ProjectMemberAdded:
|
|
||||||
return p.appendAddMemberEvent(event)
|
|
||||||
case model.ProjectMemberChanged:
|
|
||||||
return p.appendChangeMemberEvent(event)
|
|
||||||
case model.ProjectMemberRemoved:
|
|
||||||
return p.appendRemoveMemberEvent(event)
|
|
||||||
case model.ProjectRoleAdded:
|
|
||||||
return p.appendAddRoleEvent(event)
|
|
||||||
case model.ProjectRoleChanged:
|
|
||||||
return p.appendChangeRoleEvent(event)
|
|
||||||
case model.ProjectRoleRemoved:
|
|
||||||
return p.appendRemoveRoleEvent(event)
|
|
||||||
case model.ApplicationAdded:
|
|
||||||
return p.appendAddAppEvent(event)
|
|
||||||
case model.ApplicationChanged:
|
|
||||||
return p.appendChangeAppEvent(event)
|
|
||||||
case model.ApplicationRemoved:
|
|
||||||
return p.appendRemoveAppEvent(event)
|
|
||||||
case model.ApplicationDeactivated:
|
|
||||||
return p.appendAppStateEvent(event, model.APPSTATE_INACTIVE)
|
|
||||||
case model.ApplicationReactivated:
|
|
||||||
return p.appendAppStateEvent(event, model.APPSTATE_ACTIVE)
|
|
||||||
case model.OIDCConfigAdded:
|
|
||||||
return p.appendAddOIDCConfigEvent(event)
|
|
||||||
case model.OIDCConfigChanged, model.OIDCConfigSecretChanged:
|
|
||||||
return p.appendChangeOIDCConfigEvent(event)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Project) appendDeactivatedEvent() error {
|
|
||||||
p.State = int32(model.PROJECTSTATE_INACTIVE)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Project) appendReactivatedEvent() error {
|
|
||||||
p.State = int32(model.PROJECTSTATE_ACTIVE)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Project) appendAddMemberEvent(event *es_models.Event) error {
|
|
||||||
member := &ProjectMember{}
|
|
||||||
err := member.setData(event)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
member.ObjectRoot.CreationDate = event.CreationDate
|
|
||||||
p.Members = append(p.Members, member)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Project) appendChangeMemberEvent(event *es_models.Event) error {
|
|
||||||
member := &ProjectMember{}
|
|
||||||
err := member.setData(event)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for i, m := range p.Members {
|
|
||||||
if m.UserID == member.UserID {
|
|
||||||
p.Members[i] = member
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Project) appendRemoveMemberEvent(event *es_models.Event) error {
|
|
||||||
member := &ProjectMember{}
|
|
||||||
err := member.setData(event)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for i, m := range p.Members {
|
|
||||||
if m.UserID == member.UserID {
|
|
||||||
p.Members[i] = p.Members[len(p.Members)-1]
|
|
||||||
p.Members[len(p.Members)-1] = nil
|
|
||||||
p.Members = p.Members[:len(p.Members)-1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *ProjectMember) setData(event *es_models.Event) error {
|
|
||||||
m.ObjectRoot.AppendEvent(event)
|
|
||||||
if err := json.Unmarshal(event.Data, m); err != nil {
|
|
||||||
logging.Log("EVEN-e4dkp").WithError(err).Error("could not unmarshal event data")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Project) appendAddRoleEvent(event *es_models.Event) error {
|
|
||||||
role := new(ProjectRole)
|
|
||||||
err := role.setData(event)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
role.ObjectRoot.CreationDate = event.CreationDate
|
|
||||||
p.Roles = append(p.Roles, role)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Project) appendChangeRoleEvent(event *es_models.Event) error {
|
|
||||||
role := new(ProjectRole)
|
|
||||||
err := role.setData(event)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for i, r := range p.Roles {
|
|
||||||
if r.Key == role.Key {
|
|
||||||
p.Roles[i] = role
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Project) appendRemoveRoleEvent(event *es_models.Event) error {
|
|
||||||
role := new(ProjectRole)
|
|
||||||
err := role.setData(event)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for i, r := range p.Roles {
|
|
||||||
if r.Key == role.Key {
|
|
||||||
p.Roles[i] = p.Roles[len(p.Roles)-1]
|
|
||||||
p.Roles[len(p.Roles)-1] = nil
|
|
||||||
p.Roles = p.Roles[:len(p.Roles)-1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *ProjectRole) setData(event *es_models.Event) error {
|
|
||||||
r.ObjectRoot.AppendEvent(event)
|
|
||||||
if err := json.Unmarshal(event.Data, r); err != nil {
|
|
||||||
logging.Log("EVEN-d9euw").WithError(err).Error("could not unmarshal event data")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Project) appendAddAppEvent(event *es_models.Event) error {
|
|
||||||
app := new(Application)
|
|
||||||
err := app.setData(event)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
app.ObjectRoot.CreationDate = event.CreationDate
|
|
||||||
p.Applications = append(p.Applications, app)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Project) appendChangeAppEvent(event *es_models.Event) error {
|
|
||||||
app := new(Application)
|
|
||||||
err := app.setData(event)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for i, a := range p.Applications {
|
|
||||||
if a.AppID == app.AppID {
|
|
||||||
p.Applications[i].setData(event)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Project) appendRemoveAppEvent(event *es_models.Event) error {
|
|
||||||
app := new(Application)
|
|
||||||
err := app.setData(event)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for i, a := range p.Applications {
|
|
||||||
if a.AppID == app.AppID {
|
|
||||||
p.Applications[i] = p.Applications[len(p.Applications)-1]
|
|
||||||
p.Applications[len(p.Applications)-1] = nil
|
|
||||||
p.Applications = p.Applications[:len(p.Applications)-1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Project) appendAppStateEvent(event *es_models.Event, state model.AppState) error {
|
|
||||||
app := new(Application)
|
|
||||||
err := app.setData(event)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for i, a := range p.Applications {
|
|
||||||
if a.AppID == app.AppID {
|
|
||||||
a.State = int32(state)
|
|
||||||
p.Applications[i] = a
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *Application) setData(event *es_models.Event) error {
|
|
||||||
a.ObjectRoot.AppendEvent(event)
|
|
||||||
if err := json.Unmarshal(event.Data, a); err != nil {
|
|
||||||
logging.Log("EVEN-8die3").WithError(err).Error("could not unmarshal event data")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Project) appendAddOIDCConfigEvent(event *es_models.Event) error {
|
|
||||||
config := new(OIDCConfig)
|
|
||||||
err := config.setData(event)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
config.ObjectRoot.CreationDate = event.CreationDate
|
|
||||||
for i, a := range p.Applications {
|
|
||||||
if a.AppID == config.AppID {
|
|
||||||
p.Applications[i].Type = int32(model.APPTYPE_OIDC)
|
|
||||||
p.Applications[i].OIDCConfig = config
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Project) appendChangeOIDCConfigEvent(event *es_models.Event) error {
|
|
||||||
config := new(OIDCConfig)
|
|
||||||
err := config.setData(event)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for i, a := range p.Applications {
|
|
||||||
if a.AppID == config.AppID {
|
|
||||||
p.Applications[i].OIDCConfig.setData(event)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *OIDCConfig) setData(event *es_models.Event) error {
|
|
||||||
o.ObjectRoot.AppendEvent(event)
|
|
||||||
if err := json.Unmarshal(event.Data, o); err != nil {
|
|
||||||
logging.Log("EVEN-d8e3s").WithError(err).Error("could not unmarshal event data")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
154
internal/project/repository/eventsourcing/model/application.go
Normal file
154
internal/project/repository/eventsourcing/model/application.go
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/caos/logging"
|
||||||
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
"github.com/caos/zitadel/internal/project/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Application struct {
|
||||||
|
es_models.ObjectRoot
|
||||||
|
AppID string `json:"appId"`
|
||||||
|
State int32 `json:"-"`
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
Type int32 `json:"appType,omitempty"`
|
||||||
|
OIDCConfig *OIDCConfig `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ApplicationID struct {
|
||||||
|
es_models.ObjectRoot
|
||||||
|
AppID string `json:"appId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetApplication(apps []*Application, id string) (int, *Application) {
|
||||||
|
for i, a := range apps {
|
||||||
|
if a.AppID == id {
|
||||||
|
return i, a
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *Application) Changes(changed *Application) map[string]interface{} {
|
||||||
|
changes := make(map[string]interface{}, 1)
|
||||||
|
changes["appId"] = a.AppID
|
||||||
|
if changed.Name != "" && a.Name != changed.Name {
|
||||||
|
changes["name"] = changed.Name
|
||||||
|
}
|
||||||
|
return changes
|
||||||
|
}
|
||||||
|
|
||||||
|
func AppsToModel(apps []*Application) []*model.Application {
|
||||||
|
convertedApps := make([]*model.Application, len(apps))
|
||||||
|
for i, a := range apps {
|
||||||
|
convertedApps[i] = AppToModel(a)
|
||||||
|
}
|
||||||
|
return convertedApps
|
||||||
|
}
|
||||||
|
|
||||||
|
func AppsFromModel(apps []*model.Application) []*Application {
|
||||||
|
convertedApps := make([]*Application, len(apps))
|
||||||
|
for i, a := range apps {
|
||||||
|
convertedApps[i] = AppFromModel(a)
|
||||||
|
}
|
||||||
|
return convertedApps
|
||||||
|
}
|
||||||
|
|
||||||
|
func AppFromModel(app *model.Application) *Application {
|
||||||
|
converted := &Application{
|
||||||
|
ObjectRoot: es_models.ObjectRoot{
|
||||||
|
AggregateID: app.ObjectRoot.AggregateID,
|
||||||
|
Sequence: app.Sequence,
|
||||||
|
ChangeDate: app.ChangeDate,
|
||||||
|
CreationDate: app.CreationDate,
|
||||||
|
},
|
||||||
|
AppID: app.AppID,
|
||||||
|
Name: app.Name,
|
||||||
|
State: int32(app.State),
|
||||||
|
Type: int32(app.Type),
|
||||||
|
}
|
||||||
|
if app.OIDCConfig != nil {
|
||||||
|
converted.OIDCConfig = OIDCConfigFromModel(app.OIDCConfig)
|
||||||
|
}
|
||||||
|
return converted
|
||||||
|
}
|
||||||
|
|
||||||
|
func AppToModel(app *Application) *model.Application {
|
||||||
|
converted := &model.Application{
|
||||||
|
ObjectRoot: es_models.ObjectRoot{
|
||||||
|
AggregateID: app.AggregateID,
|
||||||
|
ChangeDate: app.ChangeDate,
|
||||||
|
CreationDate: app.CreationDate,
|
||||||
|
Sequence: app.Sequence,
|
||||||
|
},
|
||||||
|
AppID: app.AppID,
|
||||||
|
Name: app.Name,
|
||||||
|
State: model.AppState(app.State),
|
||||||
|
Type: model.AppType(app.Type),
|
||||||
|
}
|
||||||
|
if app.OIDCConfig != nil {
|
||||||
|
converted.OIDCConfig = OIDCConfigToModel(app.OIDCConfig)
|
||||||
|
}
|
||||||
|
return converted
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendAddAppEvent(event *es_models.Event) error {
|
||||||
|
app := new(Application)
|
||||||
|
err := app.setData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
app.ObjectRoot.CreationDate = event.CreationDate
|
||||||
|
p.Applications = append(p.Applications, app)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendChangeAppEvent(event *es_models.Event) error {
|
||||||
|
app := new(Application)
|
||||||
|
err := app.setData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if i, a := GetApplication(p.Applications, app.AppID); a != nil {
|
||||||
|
p.Applications[i].setData(event)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendRemoveAppEvent(event *es_models.Event) error {
|
||||||
|
app := new(Application)
|
||||||
|
err := app.setData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if i, a := GetApplication(p.Applications, app.AppID); a != nil {
|
||||||
|
p.Applications[i] = p.Applications[len(p.Applications)-1]
|
||||||
|
p.Applications[len(p.Applications)-1] = nil
|
||||||
|
p.Applications = p.Applications[:len(p.Applications)-1]
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendAppStateEvent(event *es_models.Event, state model.AppState) error {
|
||||||
|
app := new(Application)
|
||||||
|
err := app.setData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if i, a := GetApplication(p.Applications, app.AppID); a != nil {
|
||||||
|
a.State = int32(state)
|
||||||
|
p.Applications[i] = a
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *Application) setData(event *es_models.Event) error {
|
||||||
|
a.ObjectRoot.AppendEvent(event)
|
||||||
|
if err := json.Unmarshal(event.Data, a); err != nil {
|
||||||
|
logging.Log("EVEN-8die3").WithError(err).Error("could not unmarshal event data")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,213 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
"github.com/caos/zitadel/internal/project/model"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestApplicationChanges(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
existing *Application
|
||||||
|
new *Application
|
||||||
|
}
|
||||||
|
type res struct {
|
||||||
|
changesLen int
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
res res
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "application name changes",
|
||||||
|
args: args{
|
||||||
|
existing: &Application{AppID: "AppID", Name: "Name"},
|
||||||
|
new: &Application{AppID: "AppID", Name: "NameChanged"},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
changesLen: 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no changes",
|
||||||
|
args: args{
|
||||||
|
existing: &Application{AppID: "AppID", Name: "Name"},
|
||||||
|
new: &Application{AppID: "AppID", Name: "Name"},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
changesLen: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
changes := tt.args.existing.Changes(tt.args.new)
|
||||||
|
if len(changes) != tt.res.changesLen {
|
||||||
|
t.Errorf("got wrong changes len: expected: %v, actual: %v ", tt.res.changesLen, len(changes))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendAddAppEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
app *Application
|
||||||
|
event *es_models.Event
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append add application event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{},
|
||||||
|
app: &Application{Name: "Application"},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
},
|
||||||
|
result: &Project{Applications: []*Application{&Application{Name: "Application"}}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.app != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.app)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendAddAppEvent(tt.args.event)
|
||||||
|
if len(tt.args.project.Applications) != 1 {
|
||||||
|
t.Errorf("got wrong result should have one app actual: %v ", len(tt.args.project.Applications))
|
||||||
|
}
|
||||||
|
if tt.args.project.Applications[0] == tt.result.Applications[0] {
|
||||||
|
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Applications[0], tt.args.project.Applications[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendChangeAppEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
app *Application
|
||||||
|
event *es_models.Event
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append change application event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{Applications: []*Application{&Application{Name: "Application"}}},
|
||||||
|
app: &Application{Name: "Application Change"},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
},
|
||||||
|
result: &Project{Applications: []*Application{&Application{Name: "Application Change"}}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.app != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.app)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendChangeAppEvent(tt.args.event)
|
||||||
|
if len(tt.args.project.Applications) != 1 {
|
||||||
|
t.Errorf("got wrong result should have one app actual: %v ", len(tt.args.project.Applications))
|
||||||
|
}
|
||||||
|
if tt.args.project.Applications[0] == tt.result.Applications[0] {
|
||||||
|
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Applications[0], tt.args.project.Applications[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendRemoveAppEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
app *Application
|
||||||
|
event *es_models.Event
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append remove application event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{Applications: []*Application{&Application{AppID: "AppID", Name: "Application"}}},
|
||||||
|
app: &Application{AppID: "AppID", Name: "Application"},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
},
|
||||||
|
result: &Project{Applications: []*Application{}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.app != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.app)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendRemoveAppEvent(tt.args.event)
|
||||||
|
if len(tt.args.project.Applications) != 0 {
|
||||||
|
t.Errorf("got wrong result should have no apps actual: %v ", len(tt.args.project.Applications))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendAppStateEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
app *ApplicationID
|
||||||
|
event *es_models.Event
|
||||||
|
state model.AppState
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append deactivate application event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{Applications: []*Application{&Application{AppID: "AppID", Name: "Application", State: int32(model.APPSTATE_ACTIVE)}}},
|
||||||
|
app: &ApplicationID{AppID: "AppID"},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
state: model.APPSTATE_INACTIVE,
|
||||||
|
},
|
||||||
|
result: &Project{Applications: []*Application{&Application{AppID: "AppID", Name: "Application", State: int32(model.APPSTATE_INACTIVE)}}},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "append reactivate application event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{Applications: []*Application{&Application{AppID: "AppID", Name: "Application", State: int32(model.APPSTATE_INACTIVE)}}},
|
||||||
|
app: &ApplicationID{AppID: "AppID"},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
state: model.APPSTATE_ACTIVE,
|
||||||
|
},
|
||||||
|
result: &Project{Applications: []*Application{&Application{AppID: "AppID", Name: "Application", State: int32(model.APPSTATE_ACTIVE)}}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.app != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.app)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendAppStateEvent(tt.args.event, tt.args.state)
|
||||||
|
if len(tt.args.project.Applications) != 1 {
|
||||||
|
t.Errorf("got wrong result should have one app actual: %v ", len(tt.args.project.Applications))
|
||||||
|
}
|
||||||
|
if tt.args.project.Applications[0] == tt.result.Applications[0] {
|
||||||
|
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Applications[0], tt.args.project.Applications[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
139
internal/project/repository/eventsourcing/model/oidc_config.go
Normal file
139
internal/project/repository/eventsourcing/model/oidc_config.go
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/caos/logging"
|
||||||
|
"github.com/caos/zitadel/internal/crypto"
|
||||||
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
"github.com/caos/zitadel/internal/project/model"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
type OIDCConfig struct {
|
||||||
|
es_models.ObjectRoot
|
||||||
|
AppID string `json:"appId"`
|
||||||
|
ClientID string `json:"clientId,omitempty"`
|
||||||
|
ClientSecret *crypto.CryptoValue `json:"clientSecret,omitempty"`
|
||||||
|
RedirectUris []string `json:"redirectUris,omitempty"`
|
||||||
|
ResponseTypes []int32 `json:"responseTypes,omitempty"`
|
||||||
|
GrantTypes []int32 `json:"grantTypes,omitempty"`
|
||||||
|
ApplicationType int32 `json:"applicationType,omitempty"`
|
||||||
|
AuthMethodType int32 `json:"authMethodType,omitempty"`
|
||||||
|
PostLogoutRedirectUris []string `json:"postLogoutRedirectUris,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *OIDCConfig) Changes(changed *OIDCConfig) map[string]interface{} {
|
||||||
|
changes := make(map[string]interface{}, 1)
|
||||||
|
changes["appId"] = c.AppID
|
||||||
|
if !reflect.DeepEqual(c.RedirectUris, changed.RedirectUris) {
|
||||||
|
changes["redirectUris"] = changed.RedirectUris
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(c.ResponseTypes, changed.ResponseTypes) {
|
||||||
|
changes["responseTypes"] = changed.ResponseTypes
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(c.GrantTypes, changed.GrantTypes) {
|
||||||
|
changes["grantTypes"] = changed.GrantTypes
|
||||||
|
}
|
||||||
|
if c.ApplicationType != changed.ApplicationType {
|
||||||
|
changes["applicationType"] = changed.ApplicationType
|
||||||
|
}
|
||||||
|
if c.AuthMethodType != changed.AuthMethodType {
|
||||||
|
changes["authMethodType"] = changed.AuthMethodType
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(c.PostLogoutRedirectUris, changed.PostLogoutRedirectUris) {
|
||||||
|
changes["postLogoutRedirectUris"] = changed.PostLogoutRedirectUris
|
||||||
|
}
|
||||||
|
return changes
|
||||||
|
}
|
||||||
|
|
||||||
|
func OIDCConfigFromModel(config *model.OIDCConfig) *OIDCConfig {
|
||||||
|
responseTypes := make([]int32, len(config.ResponseTypes))
|
||||||
|
for i, rt := range config.ResponseTypes {
|
||||||
|
responseTypes[i] = int32(rt)
|
||||||
|
}
|
||||||
|
grantTypes := make([]int32, len(config.GrantTypes))
|
||||||
|
for i, rt := range config.GrantTypes {
|
||||||
|
grantTypes[i] = int32(rt)
|
||||||
|
}
|
||||||
|
return &OIDCConfig{
|
||||||
|
ObjectRoot: es_models.ObjectRoot{
|
||||||
|
AggregateID: config.ObjectRoot.AggregateID,
|
||||||
|
Sequence: config.Sequence,
|
||||||
|
ChangeDate: config.ChangeDate,
|
||||||
|
CreationDate: config.CreationDate,
|
||||||
|
},
|
||||||
|
AppID: config.AppID,
|
||||||
|
ClientID: config.ClientID,
|
||||||
|
ClientSecret: config.ClientSecret,
|
||||||
|
RedirectUris: config.RedirectUris,
|
||||||
|
ResponseTypes: responseTypes,
|
||||||
|
GrantTypes: grantTypes,
|
||||||
|
ApplicationType: int32(config.ApplicationType),
|
||||||
|
AuthMethodType: int32(config.AuthMethodType),
|
||||||
|
PostLogoutRedirectUris: config.PostLogoutRedirectUris,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func OIDCConfigToModel(config *OIDCConfig) *model.OIDCConfig {
|
||||||
|
responseTypes := make([]model.OIDCResponseType, len(config.ResponseTypes))
|
||||||
|
for i, rt := range config.ResponseTypes {
|
||||||
|
responseTypes[i] = model.OIDCResponseType(rt)
|
||||||
|
}
|
||||||
|
grantTypes := make([]model.OIDCGrantType, len(config.GrantTypes))
|
||||||
|
for i, rt := range config.GrantTypes {
|
||||||
|
grantTypes[i] = model.OIDCGrantType(rt)
|
||||||
|
}
|
||||||
|
return &model.OIDCConfig{
|
||||||
|
ObjectRoot: es_models.ObjectRoot{
|
||||||
|
AggregateID: config.ObjectRoot.AggregateID,
|
||||||
|
Sequence: config.Sequence,
|
||||||
|
ChangeDate: config.ChangeDate,
|
||||||
|
CreationDate: config.CreationDate,
|
||||||
|
},
|
||||||
|
AppID: config.AppID,
|
||||||
|
ClientID: config.ClientID,
|
||||||
|
ClientSecret: config.ClientSecret,
|
||||||
|
RedirectUris: config.RedirectUris,
|
||||||
|
ResponseTypes: responseTypes,
|
||||||
|
GrantTypes: grantTypes,
|
||||||
|
ApplicationType: model.OIDCApplicationType(config.ApplicationType),
|
||||||
|
AuthMethodType: model.OIDCAuthMethodType(config.AuthMethodType),
|
||||||
|
PostLogoutRedirectUris: config.PostLogoutRedirectUris,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendAddOIDCConfigEvent(event *es_models.Event) error {
|
||||||
|
config := new(OIDCConfig)
|
||||||
|
err := config.setData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
config.ObjectRoot.CreationDate = event.CreationDate
|
||||||
|
if i, a := GetApplication(p.Applications, config.AppID); a != nil {
|
||||||
|
p.Applications[i].Type = int32(model.APPTYPE_OIDC)
|
||||||
|
p.Applications[i].OIDCConfig = config
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendChangeOIDCConfigEvent(event *es_models.Event) error {
|
||||||
|
config := new(OIDCConfig)
|
||||||
|
err := config.setData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if i, a := GetApplication(p.Applications, config.AppID); a != nil {
|
||||||
|
p.Applications[i].OIDCConfig.setData(event)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *OIDCConfig) setData(event *es_models.Event) error {
|
||||||
|
o.ObjectRoot.AppendEvent(event)
|
||||||
|
if err := json.Unmarshal(event.Data, o); err != nil {
|
||||||
|
logging.Log("EVEN-d8e3s").WithError(err).Error("could not unmarshal event data")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,181 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestOIDCConfigChanges(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
existing *OIDCConfig
|
||||||
|
new *OIDCConfig
|
||||||
|
}
|
||||||
|
type res struct {
|
||||||
|
changesLen int
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
res res
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "all possible values change",
|
||||||
|
args: args{
|
||||||
|
existing: &OIDCConfig{
|
||||||
|
AppID: "AppID",
|
||||||
|
RedirectUris: []string{"RedirectUris"},
|
||||||
|
ResponseTypes: []int32{1},
|
||||||
|
GrantTypes: []int32{1},
|
||||||
|
ApplicationType: 1,
|
||||||
|
AuthMethodType: 1,
|
||||||
|
PostLogoutRedirectUris: []string{"PostLogoutRedirectUris"},
|
||||||
|
},
|
||||||
|
new: &OIDCConfig{
|
||||||
|
AppID: "AppID",
|
||||||
|
RedirectUris: []string{"RedirectUrisChanged"},
|
||||||
|
ResponseTypes: []int32{2},
|
||||||
|
GrantTypes: []int32{2},
|
||||||
|
ApplicationType: 2,
|
||||||
|
AuthMethodType: 2,
|
||||||
|
PostLogoutRedirectUris: []string{"PostLogoutRedirectUrisChanged"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
changesLen: 7,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no changes",
|
||||||
|
args: args{
|
||||||
|
existing: &OIDCConfig{
|
||||||
|
AppID: "AppID",
|
||||||
|
RedirectUris: []string{"RedirectUris"},
|
||||||
|
ResponseTypes: []int32{1},
|
||||||
|
GrantTypes: []int32{1},
|
||||||
|
ApplicationType: 1,
|
||||||
|
AuthMethodType: 1,
|
||||||
|
PostLogoutRedirectUris: []string{"PostLogoutRedirectUris"},
|
||||||
|
},
|
||||||
|
new: &OIDCConfig{
|
||||||
|
AppID: "AppID",
|
||||||
|
RedirectUris: []string{"RedirectUris"},
|
||||||
|
ResponseTypes: []int32{1},
|
||||||
|
GrantTypes: []int32{1},
|
||||||
|
ApplicationType: 1,
|
||||||
|
AuthMethodType: 1,
|
||||||
|
PostLogoutRedirectUris: []string{"PostLogoutRedirectUris"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
changesLen: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "change not changeable attributes",
|
||||||
|
args: args{
|
||||||
|
existing: &OIDCConfig{
|
||||||
|
AppID: "AppID",
|
||||||
|
ClientID: "ClientID",
|
||||||
|
},
|
||||||
|
new: &OIDCConfig{
|
||||||
|
AppID: "AppIDChange",
|
||||||
|
ClientID: "ClientIDChange",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
changesLen: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
changes := tt.args.existing.Changes(tt.args.new)
|
||||||
|
if len(changes) != tt.res.changesLen {
|
||||||
|
t.Errorf("got wrong changes len: expected: %v, actual: %v ", tt.res.changesLen, len(changes))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendAddOIDCConfigEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
config *OIDCConfig
|
||||||
|
event *es_models.Event
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append add application event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{Applications: []*Application{&Application{AppID: "AppID"}}},
|
||||||
|
config: &OIDCConfig{AppID: "AppID", ClientID: "ClientID"},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
},
|
||||||
|
result: &Project{Applications: []*Application{&Application{AppID: "AppID", OIDCConfig: &OIDCConfig{AppID: "AppID", ClientID: "ClientID"}}}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.config != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.config)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendAddOIDCConfigEvent(tt.args.event)
|
||||||
|
if len(tt.args.project.Applications) != 1 {
|
||||||
|
t.Errorf("got wrong result should have one app actual: %v ", len(tt.args.project.Applications))
|
||||||
|
}
|
||||||
|
if tt.args.project.Applications[0].OIDCConfig == nil {
|
||||||
|
t.Errorf("got wrong result should have oidc config actual: %v ", tt.args.project.Applications[0].OIDCConfig)
|
||||||
|
}
|
||||||
|
if tt.args.project.Applications[0] == tt.result.Applications[0] {
|
||||||
|
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Applications[0], tt.args.project.Applications[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendChangeOIDCConfigEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
config *OIDCConfig
|
||||||
|
event *es_models.Event
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append change application event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{Applications: []*Application{&Application{AppID: "AppID", OIDCConfig: &OIDCConfig{AppID: "AppID", ClientID: "ClientID"}}}},
|
||||||
|
config: &OIDCConfig{AppID: "AppID", ClientID: "ClientID Changed"},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
},
|
||||||
|
result: &Project{Applications: []*Application{&Application{AppID: "AppID", OIDCConfig: &OIDCConfig{AppID: "AppID", ClientID: "ClientID Changed"}}}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.config != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.config)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendChangeOIDCConfigEvent(tt.args.event)
|
||||||
|
if len(tt.args.project.Applications) != 1 {
|
||||||
|
t.Errorf("got wrong result should have one app actual: %v ", len(tt.args.project.Applications))
|
||||||
|
}
|
||||||
|
if tt.args.project.Applications[0].OIDCConfig == nil {
|
||||||
|
t.Errorf("got wrong result should have oidc config actual: %v ", tt.args.project.Applications[0].OIDCConfig)
|
||||||
|
}
|
||||||
|
if tt.args.project.Applications[0] == tt.result.Applications[0] {
|
||||||
|
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Applications[0], tt.args.project.Applications[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
160
internal/project/repository/eventsourcing/model/project.go
Normal file
160
internal/project/repository/eventsourcing/model/project.go
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/caos/logging"
|
||||||
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
"github.com/caos/zitadel/internal/project/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
ProjectVersion = "v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Project struct {
|
||||||
|
es_models.ObjectRoot
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
State int32 `json:"-"`
|
||||||
|
Members []*ProjectMember `json:"-"`
|
||||||
|
Roles []*ProjectRole `json:"-"`
|
||||||
|
Applications []*Application `json:"-"`
|
||||||
|
Grants []*ProjectGrant `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) Changes(changed *Project) map[string]interface{} {
|
||||||
|
changes := make(map[string]interface{}, 1)
|
||||||
|
if changed.Name != "" && p.Name != changed.Name {
|
||||||
|
changes["name"] = changed.Name
|
||||||
|
}
|
||||||
|
return changes
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectFromModel(project *model.Project) *Project {
|
||||||
|
members := ProjectMembersFromModel(project.Members)
|
||||||
|
roles := ProjectRolesFromModel(project.Roles)
|
||||||
|
apps := AppsFromModel(project.Applications)
|
||||||
|
grants := GrantsFromModel(project.Grants)
|
||||||
|
return &Project{
|
||||||
|
ObjectRoot: es_models.ObjectRoot{
|
||||||
|
AggregateID: project.ObjectRoot.AggregateID,
|
||||||
|
Sequence: project.Sequence,
|
||||||
|
ChangeDate: project.ChangeDate,
|
||||||
|
CreationDate: project.CreationDate,
|
||||||
|
},
|
||||||
|
Name: project.Name,
|
||||||
|
State: int32(project.State),
|
||||||
|
Members: members,
|
||||||
|
Roles: roles,
|
||||||
|
Applications: apps,
|
||||||
|
Grants: grants,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectToModel(project *Project) *model.Project {
|
||||||
|
members := ProjectMembersToModel(project.Members)
|
||||||
|
roles := ProjectRolesToModel(project.Roles)
|
||||||
|
apps := AppsToModel(project.Applications)
|
||||||
|
grants := GrantsToModel(project.Grants)
|
||||||
|
return &model.Project{
|
||||||
|
ObjectRoot: es_models.ObjectRoot{
|
||||||
|
AggregateID: project.AggregateID,
|
||||||
|
ChangeDate: project.ChangeDate,
|
||||||
|
CreationDate: project.CreationDate,
|
||||||
|
Sequence: project.Sequence,
|
||||||
|
},
|
||||||
|
Name: project.Name,
|
||||||
|
State: model.ProjectState(project.State),
|
||||||
|
Members: members,
|
||||||
|
Roles: roles,
|
||||||
|
Applications: apps,
|
||||||
|
Grants: grants,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectFromEvents(project *Project, events ...*es_models.Event) (*Project, error) {
|
||||||
|
if project == nil {
|
||||||
|
project = &Project{}
|
||||||
|
}
|
||||||
|
|
||||||
|
return project, project.AppendEvents(events...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) AppendEvents(events ...*es_models.Event) error {
|
||||||
|
for _, event := range events {
|
||||||
|
if err := p.AppendEvent(event); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) AppendEvent(event *es_models.Event) error {
|
||||||
|
p.ObjectRoot.AppendEvent(event)
|
||||||
|
|
||||||
|
switch event.Type {
|
||||||
|
case model.ProjectAdded, model.ProjectChanged:
|
||||||
|
if err := json.Unmarshal(event.Data, p); err != nil {
|
||||||
|
logging.Log("EVEN-idl93").WithError(err).Error("could not unmarshal event data")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
p.State = int32(model.PROJECTSTATE_ACTIVE)
|
||||||
|
return nil
|
||||||
|
case model.ProjectDeactivated:
|
||||||
|
return p.appendDeactivatedEvent()
|
||||||
|
case model.ProjectReactivated:
|
||||||
|
return p.appendReactivatedEvent()
|
||||||
|
case model.ProjectMemberAdded:
|
||||||
|
return p.appendAddMemberEvent(event)
|
||||||
|
case model.ProjectMemberChanged:
|
||||||
|
return p.appendChangeMemberEvent(event)
|
||||||
|
case model.ProjectMemberRemoved:
|
||||||
|
return p.appendRemoveMemberEvent(event)
|
||||||
|
case model.ProjectRoleAdded:
|
||||||
|
return p.appendAddRoleEvent(event)
|
||||||
|
case model.ProjectRoleChanged:
|
||||||
|
return p.appendChangeRoleEvent(event)
|
||||||
|
case model.ProjectRoleRemoved:
|
||||||
|
return p.appendRemoveRoleEvent(event)
|
||||||
|
case model.ApplicationAdded:
|
||||||
|
return p.appendAddAppEvent(event)
|
||||||
|
case model.ApplicationChanged:
|
||||||
|
return p.appendChangeAppEvent(event)
|
||||||
|
case model.ApplicationRemoved:
|
||||||
|
return p.appendRemoveAppEvent(event)
|
||||||
|
case model.ApplicationDeactivated:
|
||||||
|
return p.appendAppStateEvent(event, model.APPSTATE_INACTIVE)
|
||||||
|
case model.ApplicationReactivated:
|
||||||
|
return p.appendAppStateEvent(event, model.APPSTATE_ACTIVE)
|
||||||
|
case model.OIDCConfigAdded:
|
||||||
|
return p.appendAddOIDCConfigEvent(event)
|
||||||
|
case model.OIDCConfigChanged, model.OIDCConfigSecretChanged:
|
||||||
|
return p.appendChangeOIDCConfigEvent(event)
|
||||||
|
case model.ProjectGrantAdded:
|
||||||
|
return p.appendAddGrantEvent(event)
|
||||||
|
case model.ProjectGrantChanged:
|
||||||
|
return p.appendChangeGrantEvent(event)
|
||||||
|
case model.ProjectGrantDeactivated:
|
||||||
|
return p.appendGrantStateEvent(event, model.PROJECTGRANTSTATE_INACTIVE)
|
||||||
|
case model.ProjectGrantReactivated:
|
||||||
|
return p.appendGrantStateEvent(event, model.PROJECTGRANTSTATE_ACTIVE)
|
||||||
|
case model.ProjectGrantRemoved:
|
||||||
|
return p.appendRemoveGrantEvent(event)
|
||||||
|
case model.ProjectGrantMemberAdded:
|
||||||
|
return p.appendAddGrantMemberEvent(event)
|
||||||
|
case model.ProjectGrantMemberChanged:
|
||||||
|
return p.appendChangeGrantMemberEvent(event)
|
||||||
|
case model.ProjectGrantMemberRemoved:
|
||||||
|
return p.appendRemoveGrantMemberEvent(event)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendDeactivatedEvent() error {
|
||||||
|
p.State = int32(model.PROJECTSTATE_INACTIVE)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendReactivatedEvent() error {
|
||||||
|
p.State = int32(model.PROJECTSTATE_ACTIVE)
|
||||||
|
return nil
|
||||||
|
}
|
151
internal/project/repository/eventsourcing/model/project_grant.go
Normal file
151
internal/project/repository/eventsourcing/model/project_grant.go
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/caos/logging"
|
||||||
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
"github.com/caos/zitadel/internal/project/model"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ProjectGrant struct {
|
||||||
|
es_models.ObjectRoot
|
||||||
|
State int32 `json:"-"`
|
||||||
|
GrantID string `json:"grantId,omitempty"`
|
||||||
|
GrantedOrgID string `json:"grantedOrgId,omitempty"`
|
||||||
|
RoleKeys []string `json:"roleKeys,omitempty"`
|
||||||
|
Members []*ProjectGrantMember `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ProjectGrantID struct {
|
||||||
|
es_models.ObjectRoot
|
||||||
|
GrantID string `json:"grantId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetProjectGrant(grants []*ProjectGrant, id string) (int, *ProjectGrant) {
|
||||||
|
for i, g := range grants {
|
||||||
|
if g.GrantID == id {
|
||||||
|
return i, g
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *ProjectGrant) Changes(changed *ProjectGrant) map[string]interface{} {
|
||||||
|
changes := make(map[string]interface{}, 1)
|
||||||
|
changes["grantId"] = g.GrantID
|
||||||
|
if !reflect.DeepEqual(g.RoleKeys, changed.RoleKeys) {
|
||||||
|
changes["roleKeys"] = changed.RoleKeys
|
||||||
|
}
|
||||||
|
return changes
|
||||||
|
}
|
||||||
|
|
||||||
|
func GrantsToModel(grants []*ProjectGrant) []*model.ProjectGrant {
|
||||||
|
convertedGrants := make([]*model.ProjectGrant, len(grants))
|
||||||
|
for i, g := range grants {
|
||||||
|
convertedGrants[i] = GrantToModel(g)
|
||||||
|
}
|
||||||
|
return convertedGrants
|
||||||
|
}
|
||||||
|
|
||||||
|
func GrantsFromModel(grants []*model.ProjectGrant) []*ProjectGrant {
|
||||||
|
convertedGrants := make([]*ProjectGrant, len(grants))
|
||||||
|
for i, g := range grants {
|
||||||
|
convertedGrants[i] = GrantFromModel(g)
|
||||||
|
}
|
||||||
|
return convertedGrants
|
||||||
|
}
|
||||||
|
|
||||||
|
func GrantFromModel(grant *model.ProjectGrant) *ProjectGrant {
|
||||||
|
members := GrantMembersFromModel(grant.Members)
|
||||||
|
return &ProjectGrant{
|
||||||
|
ObjectRoot: es_models.ObjectRoot{
|
||||||
|
AggregateID: grant.ObjectRoot.AggregateID,
|
||||||
|
Sequence: grant.Sequence,
|
||||||
|
ChangeDate: grant.ChangeDate,
|
||||||
|
CreationDate: grant.CreationDate,
|
||||||
|
},
|
||||||
|
GrantID: grant.GrantID,
|
||||||
|
GrantedOrgID: grant.GrantedOrgID,
|
||||||
|
State: int32(grant.State),
|
||||||
|
RoleKeys: grant.RoleKeys,
|
||||||
|
Members: members,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func GrantToModel(grant *ProjectGrant) *model.ProjectGrant {
|
||||||
|
members := GrantMembersToModel(grant.Members)
|
||||||
|
return &model.ProjectGrant{
|
||||||
|
ObjectRoot: es_models.ObjectRoot{
|
||||||
|
AggregateID: grant.AggregateID,
|
||||||
|
ChangeDate: grant.ChangeDate,
|
||||||
|
CreationDate: grant.CreationDate,
|
||||||
|
Sequence: grant.Sequence,
|
||||||
|
},
|
||||||
|
GrantID: grant.GrantID,
|
||||||
|
GrantedOrgID: grant.GrantedOrgID,
|
||||||
|
State: model.ProjectGrantState(grant.State),
|
||||||
|
RoleKeys: grant.RoleKeys,
|
||||||
|
Members: members,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendAddGrantEvent(event *es_models.Event) error {
|
||||||
|
grant := new(ProjectGrant)
|
||||||
|
err := grant.getData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
grant.ObjectRoot.CreationDate = event.CreationDate
|
||||||
|
p.Grants = append(p.Grants, grant)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendChangeGrantEvent(event *es_models.Event) error {
|
||||||
|
grant := new(ProjectGrant)
|
||||||
|
err := grant.getData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if i, g := GetProjectGrant(p.Grants, grant.GrantID); g != nil {
|
||||||
|
p.Grants[i].getData(event)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendGrantStateEvent(event *es_models.Event, state model.ProjectGrantState) error {
|
||||||
|
grant := new(ProjectGrant)
|
||||||
|
err := grant.getData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if i, g := GetProjectGrant(p.Grants, grant.GrantID); g != nil {
|
||||||
|
g.State = int32(state)
|
||||||
|
p.Grants[i] = g
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendRemoveGrantEvent(event *es_models.Event) error {
|
||||||
|
grant := new(ProjectGrant)
|
||||||
|
err := grant.getData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if i, g := GetProjectGrant(p.Grants, grant.GrantID); g != nil {
|
||||||
|
p.Grants[i] = p.Grants[len(p.Grants)-1]
|
||||||
|
p.Grants[len(p.Grants)-1] = nil
|
||||||
|
p.Grants = p.Grants[:len(p.Grants)-1]
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *ProjectGrant) getData(event *es_models.Event) error {
|
||||||
|
g.ObjectRoot.AppendEvent(event)
|
||||||
|
if err := json.Unmarshal(event.Data, g); err != nil {
|
||||||
|
logging.Log("EVEN-4h6gd").WithError(err).Error("could not unmarshal event data")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,122 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/caos/logging"
|
||||||
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
"github.com/caos/zitadel/internal/project/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ProjectGrantMember struct {
|
||||||
|
es_models.ObjectRoot
|
||||||
|
GrantID string `json:"grantId,omitempty"`
|
||||||
|
UserID string `json:"userId,omitempty"`
|
||||||
|
Roles []string `json:"roles,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetProjectGrantMember(members []*ProjectGrantMember, id string) (int, *ProjectGrantMember) {
|
||||||
|
for i, m := range members {
|
||||||
|
if m.UserID == id {
|
||||||
|
return i, m
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func GrantMembersToModel(members []*ProjectGrantMember) []*model.ProjectGrantMember {
|
||||||
|
convertedMembers := make([]*model.ProjectGrantMember, len(members))
|
||||||
|
for i, g := range members {
|
||||||
|
convertedMembers[i] = GrantMemberToModel(g)
|
||||||
|
}
|
||||||
|
return convertedMembers
|
||||||
|
}
|
||||||
|
|
||||||
|
func GrantMembersFromModel(members []*model.ProjectGrantMember) []*ProjectGrantMember {
|
||||||
|
convertedMembers := make([]*ProjectGrantMember, len(members))
|
||||||
|
for i, g := range members {
|
||||||
|
convertedMembers[i] = GrantMemberFromModel(g)
|
||||||
|
}
|
||||||
|
return convertedMembers
|
||||||
|
}
|
||||||
|
|
||||||
|
func GrantMemberFromModel(member *model.ProjectGrantMember) *ProjectGrantMember {
|
||||||
|
return &ProjectGrantMember{
|
||||||
|
ObjectRoot: es_models.ObjectRoot{
|
||||||
|
AggregateID: member.ObjectRoot.AggregateID,
|
||||||
|
Sequence: member.Sequence,
|
||||||
|
ChangeDate: member.ChangeDate,
|
||||||
|
CreationDate: member.CreationDate,
|
||||||
|
},
|
||||||
|
GrantID: member.GrantID,
|
||||||
|
UserID: member.UserID,
|
||||||
|
Roles: member.Roles,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func GrantMemberToModel(member *ProjectGrantMember) *model.ProjectGrantMember {
|
||||||
|
return &model.ProjectGrantMember{
|
||||||
|
ObjectRoot: es_models.ObjectRoot{
|
||||||
|
AggregateID: member.AggregateID,
|
||||||
|
ChangeDate: member.ChangeDate,
|
||||||
|
CreationDate: member.CreationDate,
|
||||||
|
Sequence: member.Sequence,
|
||||||
|
},
|
||||||
|
GrantID: member.GrantID,
|
||||||
|
UserID: member.UserID,
|
||||||
|
Roles: member.Roles,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendAddGrantMemberEvent(event *es_models.Event) error {
|
||||||
|
member := &ProjectGrantMember{}
|
||||||
|
err := member.getData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
member.ObjectRoot.CreationDate = event.CreationDate
|
||||||
|
|
||||||
|
if _, g := GetProjectGrant(p.Grants, member.GrantID); g != nil {
|
||||||
|
g.Members = append(g.Members, member)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendChangeGrantMemberEvent(event *es_models.Event) error {
|
||||||
|
member := &ProjectGrantMember{}
|
||||||
|
err := member.getData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, g := GetProjectGrant(p.Grants, member.GrantID); g != nil {
|
||||||
|
if i, m := GetProjectGrantMember(g.Members, member.UserID); m != nil {
|
||||||
|
g.Members[i].getData(event)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendRemoveGrantMemberEvent(event *es_models.Event) error {
|
||||||
|
member := &ProjectGrantMember{}
|
||||||
|
err := member.getData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, g := GetProjectGrant(p.Grants, member.GrantID); g != nil {
|
||||||
|
if i, member := GetProjectGrantMember(g.Members, member.UserID); member != nil {
|
||||||
|
g.Members[i] = g.Members[len(g.Members)-1]
|
||||||
|
g.Members[len(g.Members)-1] = nil
|
||||||
|
g.Members = g.Members[:len(g.Members)-1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ProjectGrantMember) getData(event *es_models.Event) error {
|
||||||
|
m.ObjectRoot.AppendEvent(event)
|
||||||
|
if err := json.Unmarshal(event.Data, m); err != nil {
|
||||||
|
logging.Log("EVEN-8die2").WithError(err).Error("could not unmarshal event data")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,145 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAppendAddGrantMemberEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
member *ProjectGrantMember
|
||||||
|
event *es_models.Event
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append add grant member",
|
||||||
|
args: args{
|
||||||
|
project: &Project{Grants: []*ProjectGrant{
|
||||||
|
&ProjectGrant{GrantID: "GrantID", GrantedOrgID: "OrgID", RoleKeys: []string{"Key"}}}},
|
||||||
|
member: &ProjectGrantMember{GrantID: "GrantID", UserID: "UserID", Roles: []string{"Role"}},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
},
|
||||||
|
result: &Project{
|
||||||
|
Grants: []*ProjectGrant{
|
||||||
|
&ProjectGrant{
|
||||||
|
GrantID: "GrantID",
|
||||||
|
GrantedOrgID: "OrgID",
|
||||||
|
RoleKeys: []string{"Key"},
|
||||||
|
Members: []*ProjectGrantMember{&ProjectGrantMember{GrantID: "GrantID", UserID: "UserID", Roles: []string{"Role"}}}}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.member != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.member)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendAddGrantMemberEvent(tt.args.event)
|
||||||
|
if len(tt.args.project.Grants[0].Members) != 1 {
|
||||||
|
t.Errorf("got wrong result should have one grant actual: %v ", len(tt.args.project.Grants[0].Members))
|
||||||
|
}
|
||||||
|
if tt.args.project.Grants[0].Members[0] == tt.result.Grants[0].Members[0] {
|
||||||
|
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Grants[0].Members[0], tt.args.project.Grants[0].Members[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendChangeGrantMemberEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
member *ProjectGrantMember
|
||||||
|
event *es_models.Event
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append change grant member",
|
||||||
|
args: args{
|
||||||
|
project: &Project{
|
||||||
|
Grants: []*ProjectGrant{
|
||||||
|
&ProjectGrant{
|
||||||
|
GrantID: "GrantID",
|
||||||
|
GrantedOrgID: "OrgID",
|
||||||
|
RoleKeys: []string{"Key"},
|
||||||
|
Members: []*ProjectGrantMember{&ProjectGrantMember{GrantID: "GrantID", UserID: "UserID", Roles: []string{"Role"}}}}},
|
||||||
|
},
|
||||||
|
member: &ProjectGrantMember{GrantID: "GrantID", UserID: "UserID", Roles: []string{"RoleChanged"}},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
},
|
||||||
|
result: &Project{
|
||||||
|
Grants: []*ProjectGrant{
|
||||||
|
&ProjectGrant{
|
||||||
|
GrantID: "GrantID",
|
||||||
|
GrantedOrgID: "OrgID",
|
||||||
|
RoleKeys: []string{"Key"},
|
||||||
|
Members: []*ProjectGrantMember{&ProjectGrantMember{GrantID: "GrantID", UserID: "UserID", Roles: []string{"RoleChanged"}}}}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.member != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.member)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendChangeGrantMemberEvent(tt.args.event)
|
||||||
|
if len(tt.args.project.Grants[0].Members) != 1 {
|
||||||
|
t.Errorf("got wrong result should have one grant actual: %v ", len(tt.args.project.Grants[0].Members))
|
||||||
|
}
|
||||||
|
if tt.args.project.Grants[0].Members[0] == tt.result.Grants[0].Members[0] {
|
||||||
|
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Grants[0].Members[0], tt.args.project.Grants[0].Members[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendRemoveGrantMemberEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
member *ProjectGrantMember
|
||||||
|
event *es_models.Event
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append remove grant member",
|
||||||
|
args: args{
|
||||||
|
project: &Project{
|
||||||
|
Grants: []*ProjectGrant{
|
||||||
|
&ProjectGrant{
|
||||||
|
GrantID: "GrantID",
|
||||||
|
GrantedOrgID: "OrgID",
|
||||||
|
RoleKeys: []string{"Key"},
|
||||||
|
Members: []*ProjectGrantMember{&ProjectGrantMember{GrantID: "GrantID", UserID: "UserID", Roles: []string{"Role"}}}}},
|
||||||
|
},
|
||||||
|
member: &ProjectGrantMember{GrantID: "GrantID", UserID: "UserID", Roles: []string{"RoleChanged"}},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.member != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.member)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendRemoveGrantMemberEvent(tt.args.event)
|
||||||
|
if len(tt.args.project.Grants[0].Members) != 0 {
|
||||||
|
t.Errorf("got wrong result should have no members actual: %v ", len(tt.args.project.Grants[0].Members))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,169 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
"github.com/caos/zitadel/internal/project/model"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAppendAddGrantEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
role *ProjectGrant
|
||||||
|
event *es_models.Event
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append add grant event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{},
|
||||||
|
role: &ProjectGrant{GrantID: "GrantID", GrantedOrgID: "OrgID", RoleKeys: []string{"Key"}},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
},
|
||||||
|
result: &Project{Grants: []*ProjectGrant{&ProjectGrant{GrantID: "GrantID", GrantedOrgID: "OrgID", RoleKeys: []string{"Key"}}}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.role != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.role)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendAddGrantEvent(tt.args.event)
|
||||||
|
if len(tt.args.project.Grants) != 1 {
|
||||||
|
t.Errorf("got wrong result should have one grant actual: %v ", len(tt.args.project.Grants))
|
||||||
|
}
|
||||||
|
if tt.args.project.Grants[0] == tt.result.Grants[0] {
|
||||||
|
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Grants[0], tt.args.project.Grants[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendChangeGrantEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
grant *ProjectGrant
|
||||||
|
event *es_models.Event
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append change grant event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{Grants: []*ProjectGrant{&ProjectGrant{GrantID: "GrantID", GrantedOrgID: "OrgID", RoleKeys: []string{"Key"}}}},
|
||||||
|
grant: &ProjectGrant{GrantID: "GrantID", GrantedOrgID: "OrgID", RoleKeys: []string{"KeyChanged"}},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
},
|
||||||
|
result: &Project{Grants: []*ProjectGrant{&ProjectGrant{GrantID: "GrantID", GrantedOrgID: "OrgID", RoleKeys: []string{"KeyChanged"}}}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.grant != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.grant)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendChangeGrantEvent(tt.args.event)
|
||||||
|
if len(tt.args.project.Grants) != 1 {
|
||||||
|
t.Errorf("got wrong result should have one grant actual: %v ", len(tt.args.project.Grants))
|
||||||
|
}
|
||||||
|
if tt.args.project.Grants[0] == tt.result.Grants[0] {
|
||||||
|
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Grants[0], tt.args.project.Grants[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendRemoveGrantEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
grant *ProjectGrant
|
||||||
|
event *es_models.Event
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append remove role event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{Grants: []*ProjectGrant{&ProjectGrant{GrantID: "GrantID", GrantedOrgID: "OrgID", RoleKeys: []string{"Key"}}}},
|
||||||
|
grant: &ProjectGrant{GrantID: "GrantID"},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
},
|
||||||
|
result: &Project{Grants: []*ProjectGrant{}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.grant != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.grant)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendRemoveGrantEvent(tt.args.event)
|
||||||
|
if len(tt.args.project.Grants) != 0 {
|
||||||
|
t.Errorf("got wrong result should have no grant actual: %v ", len(tt.args.project.Grants))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendGrantStateEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
grant *ProjectGrantID
|
||||||
|
event *es_models.Event
|
||||||
|
state model.ProjectGrantState
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append deactivate grant event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{Grants: []*ProjectGrant{&ProjectGrant{GrantID: "GrantID", GrantedOrgID: "OrgID", RoleKeys: []string{"Key"}}}},
|
||||||
|
grant: &ProjectGrantID{GrantID: "GrantID"},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
state: model.PROJECTGRANTSTATE_INACTIVE,
|
||||||
|
},
|
||||||
|
result: &Project{Grants: []*ProjectGrant{&ProjectGrant{GrantID: "GrantID", GrantedOrgID: "OrgID", RoleKeys: []string{"Key"}, State: int32(model.PROJECTGRANTSTATE_INACTIVE)}}},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "append reactivate grant event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{Grants: []*ProjectGrant{&ProjectGrant{GrantID: "GrantID", GrantedOrgID: "OrgID", RoleKeys: []string{"Key"}}}},
|
||||||
|
grant: &ProjectGrantID{GrantID: "GrantID"},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
state: model.PROJECTGRANTSTATE_ACTIVE,
|
||||||
|
},
|
||||||
|
result: &Project{Grants: []*ProjectGrant{&ProjectGrant{GrantID: "GrantID", GrantedOrgID: "OrgID", RoleKeys: []string{"Key"}, State: int32(model.PROJECTGRANTSTATE_ACTIVE)}}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.grant != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.grant)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendGrantStateEvent(tt.args.event, tt.args.state)
|
||||||
|
if len(tt.args.project.Grants) != 1 {
|
||||||
|
t.Errorf("got wrong result should have one grant actual: %v ", len(tt.args.project.Grants))
|
||||||
|
}
|
||||||
|
if tt.args.project.Grants[0] == tt.result.Grants[0] {
|
||||||
|
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Grants[0], tt.args.project.Grants[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,111 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/caos/logging"
|
||||||
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
"github.com/caos/zitadel/internal/project/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ProjectMember struct {
|
||||||
|
es_models.ObjectRoot
|
||||||
|
UserID string `json:"userId,omitempty"`
|
||||||
|
Roles []string `json:"roles,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetProjectMember(members []*ProjectMember, id string) (int, *ProjectMember) {
|
||||||
|
for i, m := range members {
|
||||||
|
if m.UserID == id {
|
||||||
|
return i, m
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectMembersToModel(members []*ProjectMember) []*model.ProjectMember {
|
||||||
|
convertedMembers := make([]*model.ProjectMember, len(members))
|
||||||
|
for i, m := range members {
|
||||||
|
convertedMembers[i] = ProjectMemberToModel(m)
|
||||||
|
}
|
||||||
|
return convertedMembers
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectMembersFromModel(members []*model.ProjectMember) []*ProjectMember {
|
||||||
|
convertedMembers := make([]*ProjectMember, len(members))
|
||||||
|
for i, m := range members {
|
||||||
|
convertedMembers[i] = ProjectMemberFromModel(m)
|
||||||
|
}
|
||||||
|
return convertedMembers
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectMemberFromModel(member *model.ProjectMember) *ProjectMember {
|
||||||
|
return &ProjectMember{
|
||||||
|
ObjectRoot: es_models.ObjectRoot{
|
||||||
|
AggregateID: member.ObjectRoot.AggregateID,
|
||||||
|
Sequence: member.Sequence,
|
||||||
|
ChangeDate: member.ChangeDate,
|
||||||
|
CreationDate: member.CreationDate,
|
||||||
|
},
|
||||||
|
UserID: member.UserID,
|
||||||
|
Roles: member.Roles,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectMemberToModel(member *ProjectMember) *model.ProjectMember {
|
||||||
|
return &model.ProjectMember{
|
||||||
|
ObjectRoot: es_models.ObjectRoot{
|
||||||
|
AggregateID: member.AggregateID,
|
||||||
|
ChangeDate: member.ChangeDate,
|
||||||
|
CreationDate: member.CreationDate,
|
||||||
|
Sequence: member.Sequence,
|
||||||
|
},
|
||||||
|
UserID: member.UserID,
|
||||||
|
Roles: member.Roles,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendAddMemberEvent(event *es_models.Event) error {
|
||||||
|
member := &ProjectMember{}
|
||||||
|
err := member.setData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
member.ObjectRoot.CreationDate = event.CreationDate
|
||||||
|
p.Members = append(p.Members, member)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendChangeMemberEvent(event *es_models.Event) error {
|
||||||
|
member := &ProjectMember{}
|
||||||
|
err := member.setData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if i, m := GetProjectMember(p.Members, member.UserID); m != nil {
|
||||||
|
p.Members[i] = member
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendRemoveMemberEvent(event *es_models.Event) error {
|
||||||
|
member := &ProjectMember{}
|
||||||
|
err := member.setData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if i, m := GetProjectMember(p.Members, member.UserID); m != nil {
|
||||||
|
p.Members[i] = p.Members[len(p.Members)-1]
|
||||||
|
p.Members[len(p.Members)-1] = nil
|
||||||
|
p.Members = p.Members[:len(p.Members)-1]
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ProjectMember) setData(event *es_models.Event) error {
|
||||||
|
m.ObjectRoot.AppendEvent(event)
|
||||||
|
if err := json.Unmarshal(event.Data, m); err != nil {
|
||||||
|
logging.Log("EVEN-e4dkp").WithError(err).Error("could not unmarshal event data")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,118 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAppendAddMemberEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
member *ProjectMember
|
||||||
|
event *es_models.Event
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append add member event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{},
|
||||||
|
member: &ProjectMember{UserID: "UserID", Roles: []string{"Role"}},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
},
|
||||||
|
result: &Project{Members: []*ProjectMember{&ProjectMember{UserID: "UserID", Roles: []string{"Role"}}}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.member != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.member)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendAddMemberEvent(tt.args.event)
|
||||||
|
if len(tt.args.project.Members) != 1 {
|
||||||
|
t.Errorf("got wrong result should have one member actual: %v ", len(tt.args.project.Members))
|
||||||
|
}
|
||||||
|
if tt.args.project.Members[0] == tt.result.Members[0] {
|
||||||
|
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Members[0], tt.args.project.Members[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendChangeMemberEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
member *ProjectMember
|
||||||
|
event *es_models.Event
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append change member event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{Members: []*ProjectMember{&ProjectMember{UserID: "UserID", Roles: []string{"Role"}}}},
|
||||||
|
member: &ProjectMember{UserID: "UserID", Roles: []string{"ChangedRole"}},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
},
|
||||||
|
result: &Project{Members: []*ProjectMember{&ProjectMember{UserID: "UserID", Roles: []string{"ChangedRole"}}}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.member != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.member)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendChangeMemberEvent(tt.args.event)
|
||||||
|
if len(tt.args.project.Members) != 1 {
|
||||||
|
t.Errorf("got wrong result should have one member actual: %v ", len(tt.args.project.Members))
|
||||||
|
}
|
||||||
|
if tt.args.project.Members[0] == tt.result.Members[0] {
|
||||||
|
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Members[0], tt.args.project.Members[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendRemoveMemberEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
member *ProjectMember
|
||||||
|
event *es_models.Event
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append remove member event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{Members: []*ProjectMember{&ProjectMember{UserID: "UserID", Roles: []string{"Role"}}}},
|
||||||
|
member: &ProjectMember{UserID: "UserID"},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
},
|
||||||
|
result: &Project{Members: []*ProjectMember{}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.member != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.member)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendRemoveMemberEvent(tt.args.event)
|
||||||
|
if len(tt.args.project.Members) != 0 {
|
||||||
|
t.Errorf("got wrong result should have no member actual: %v ", len(tt.args.project.Members))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
114
internal/project/repository/eventsourcing/model/project_role.go
Normal file
114
internal/project/repository/eventsourcing/model/project_role.go
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/caos/logging"
|
||||||
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
"github.com/caos/zitadel/internal/project/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ProjectRole struct {
|
||||||
|
es_models.ObjectRoot
|
||||||
|
Key string `json:"key,omitempty"`
|
||||||
|
DisplayName string `json:"displayName,omitempty"`
|
||||||
|
Group string `json:"group,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetProjectRole(roles []*ProjectRole, key string) (int, *ProjectRole) {
|
||||||
|
for i, r := range roles {
|
||||||
|
if r.Key == key {
|
||||||
|
return i, r
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectRolesToModel(roles []*ProjectRole) []*model.ProjectRole {
|
||||||
|
convertedRoles := make([]*model.ProjectRole, len(roles))
|
||||||
|
for i, r := range roles {
|
||||||
|
convertedRoles[i] = ProjectRoleToModel(r)
|
||||||
|
}
|
||||||
|
return convertedRoles
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectRolesFromModel(roles []*model.ProjectRole) []*ProjectRole {
|
||||||
|
convertedRoles := make([]*ProjectRole, len(roles))
|
||||||
|
for i, r := range roles {
|
||||||
|
convertedRoles[i] = ProjectRoleFromModel(r)
|
||||||
|
}
|
||||||
|
return convertedRoles
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectRoleFromModel(role *model.ProjectRole) *ProjectRole {
|
||||||
|
return &ProjectRole{
|
||||||
|
ObjectRoot: es_models.ObjectRoot{
|
||||||
|
AggregateID: role.ObjectRoot.AggregateID,
|
||||||
|
Sequence: role.Sequence,
|
||||||
|
ChangeDate: role.ChangeDate,
|
||||||
|
CreationDate: role.CreationDate,
|
||||||
|
},
|
||||||
|
Key: role.Key,
|
||||||
|
DisplayName: role.DisplayName,
|
||||||
|
Group: role.Group,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectRoleToModel(role *ProjectRole) *model.ProjectRole {
|
||||||
|
return &model.ProjectRole{
|
||||||
|
ObjectRoot: es_models.ObjectRoot{
|
||||||
|
AggregateID: role.AggregateID,
|
||||||
|
ChangeDate: role.ChangeDate,
|
||||||
|
CreationDate: role.CreationDate,
|
||||||
|
Sequence: role.Sequence,
|
||||||
|
},
|
||||||
|
Key: role.Key,
|
||||||
|
DisplayName: role.DisplayName,
|
||||||
|
Group: role.Group,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendAddRoleEvent(event *es_models.Event) error {
|
||||||
|
role := new(ProjectRole)
|
||||||
|
err := role.setData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
role.ObjectRoot.CreationDate = event.CreationDate
|
||||||
|
p.Roles = append(p.Roles, role)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendChangeRoleEvent(event *es_models.Event) error {
|
||||||
|
role := new(ProjectRole)
|
||||||
|
err := role.setData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if i, r := GetProjectRole(p.Roles, role.Key); r != nil {
|
||||||
|
p.Roles[i] = role
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Project) appendRemoveRoleEvent(event *es_models.Event) error {
|
||||||
|
role := new(ProjectRole)
|
||||||
|
err := role.setData(event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if i, r := GetProjectRole(p.Roles, role.Key); r != nil {
|
||||||
|
p.Roles[i] = p.Roles[len(p.Roles)-1]
|
||||||
|
p.Roles[len(p.Roles)-1] = nil
|
||||||
|
p.Roles = p.Roles[:len(p.Roles)-1]
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *ProjectRole) setData(event *es_models.Event) error {
|
||||||
|
r.ObjectRoot.AppendEvent(event)
|
||||||
|
if err := json.Unmarshal(event.Data, r); err != nil {
|
||||||
|
logging.Log("EVEN-d9euw").WithError(err).Error("could not unmarshal event data")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,118 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAppendAddRoleEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
role *ProjectRole
|
||||||
|
event *es_models.Event
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append add role event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{},
|
||||||
|
role: &ProjectRole{Key: "Key", DisplayName: "DisplayName", Group: "Group"},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
},
|
||||||
|
result: &Project{Roles: []*ProjectRole{&ProjectRole{Key: "Key", DisplayName: "DisplayName", Group: "Group"}}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.role != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.role)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendAddRoleEvent(tt.args.event)
|
||||||
|
if len(tt.args.project.Roles) != 1 {
|
||||||
|
t.Errorf("got wrong result should have one role actual: %v ", len(tt.args.project.Roles))
|
||||||
|
}
|
||||||
|
if tt.args.project.Roles[0] == tt.result.Roles[0] {
|
||||||
|
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Roles[0], tt.args.project.Roles[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendChangeRoleEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
role *ProjectRole
|
||||||
|
event *es_models.Event
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append change role event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{Roles: []*ProjectRole{&ProjectRole{Key: "Key", DisplayName: "DisplayName", Group: "Group"}}},
|
||||||
|
role: &ProjectRole{Key: "Key", DisplayName: "DisplayNameChanged", Group: "Group"},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
},
|
||||||
|
result: &Project{Roles: []*ProjectRole{&ProjectRole{Key: "Key", DisplayName: "DisplayNameChanged", Group: "Group"}}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.role != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.role)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendChangeRoleEvent(tt.args.event)
|
||||||
|
if len(tt.args.project.Roles) != 1 {
|
||||||
|
t.Errorf("got wrong result should have one role actual: %v ", len(tt.args.project.Roles))
|
||||||
|
}
|
||||||
|
if tt.args.project.Roles[0] == tt.result.Roles[0] {
|
||||||
|
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Roles[0], tt.args.project.Roles[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendRemoveRoleEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
role *ProjectRole
|
||||||
|
event *es_models.Event
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append remove role event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{Roles: []*ProjectRole{&ProjectRole{Key: "Key", DisplayName: "DisplayName", Group: "Group"}}},
|
||||||
|
role: &ProjectRole{Key: "Key"},
|
||||||
|
event: &es_models.Event{},
|
||||||
|
},
|
||||||
|
result: &Project{Roles: []*ProjectRole{}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.role != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.role)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
tt.args.project.appendRemoveRoleEvent(tt.args.event)
|
||||||
|
if len(tt.args.project.Roles) != 0 {
|
||||||
|
t.Errorf("got wrong result should have no role actual: %v ", len(tt.args.project.Roles))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
213
internal/project/repository/eventsourcing/model/project_test.go
Normal file
213
internal/project/repository/eventsourcing/model/project_test.go
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
"github.com/caos/zitadel/internal/project/model"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestProjectChanges(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
existing *Project
|
||||||
|
new *Project
|
||||||
|
}
|
||||||
|
type res struct {
|
||||||
|
changesLen int
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
res res
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "project name changes",
|
||||||
|
args: args{
|
||||||
|
existing: &Project{Name: "Name"},
|
||||||
|
new: &Project{Name: "NameChanged"},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
changesLen: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no changes",
|
||||||
|
args: args{
|
||||||
|
existing: &Project{Name: "Name"},
|
||||||
|
new: &Project{Name: "Name"},
|
||||||
|
},
|
||||||
|
res: res{
|
||||||
|
changesLen: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
changes := tt.args.existing.Changes(tt.args.new)
|
||||||
|
if len(changes) != tt.res.changesLen {
|
||||||
|
t.Errorf("got wrong changes len: expected: %v, actual: %v ", tt.res.changesLen, len(changes))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestProjectFromEvents(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
event []*es_models.Event
|
||||||
|
project *Project
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "project from events, ok",
|
||||||
|
args: args{
|
||||||
|
event: []*es_models.Event{
|
||||||
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectAdded},
|
||||||
|
},
|
||||||
|
project: &Project{Name: "ProjectName"},
|
||||||
|
},
|
||||||
|
result: &Project{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, State: int32(model.PROJECTSTATE_ACTIVE), Name: "ProjectName"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "project from events, nil project",
|
||||||
|
args: args{
|
||||||
|
event: []*es_models.Event{
|
||||||
|
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectAdded},
|
||||||
|
},
|
||||||
|
project: nil,
|
||||||
|
},
|
||||||
|
result: &Project{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, State: int32(model.PROJECTSTATE_ACTIVE)},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.project != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.project)
|
||||||
|
tt.args.event[0].Data = data
|
||||||
|
}
|
||||||
|
result, _ := ProjectFromEvents(tt.args.project, tt.args.event...)
|
||||||
|
if result.Name != tt.result.Name {
|
||||||
|
t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.result.Name, result.Name)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
event *es_models.Event
|
||||||
|
project *Project
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append added event",
|
||||||
|
args: args{
|
||||||
|
event: &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectAdded},
|
||||||
|
project: &Project{Name: "ProjectName"},
|
||||||
|
},
|
||||||
|
result: &Project{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, State: int32(model.PROJECTSTATE_ACTIVE), Name: "ProjectName"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "append change event",
|
||||||
|
args: args{
|
||||||
|
event: &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectChanged},
|
||||||
|
project: &Project{Name: "ProjectName"},
|
||||||
|
},
|
||||||
|
result: &Project{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, State: int32(model.PROJECTSTATE_ACTIVE), Name: "ProjectName"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "append deactivate event",
|
||||||
|
args: args{
|
||||||
|
event: &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectDeactivated},
|
||||||
|
},
|
||||||
|
result: &Project{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, State: int32(model.PROJECTSTATE_INACTIVE)},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "append reactivate event",
|
||||||
|
args: args{
|
||||||
|
event: &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectReactivated},
|
||||||
|
},
|
||||||
|
result: &Project{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, State: int32(model.PROJECTSTATE_ACTIVE)},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if tt.args.project != nil {
|
||||||
|
data, _ := json.Marshal(tt.args.project)
|
||||||
|
tt.args.event.Data = data
|
||||||
|
}
|
||||||
|
result := new(Project)
|
||||||
|
result.AppendEvent(tt.args.event)
|
||||||
|
if result.State != tt.result.State {
|
||||||
|
t.Errorf("got wrong result state: expected: %v, actual: %v ", tt.result.State, result.State)
|
||||||
|
}
|
||||||
|
if result.Name != tt.result.Name {
|
||||||
|
t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.result.Name, result.Name)
|
||||||
|
}
|
||||||
|
if result.ObjectRoot.AggregateID != tt.result.ObjectRoot.AggregateID {
|
||||||
|
t.Errorf("got wrong result id: expected: %v, actual: %v ", tt.result.ObjectRoot.AggregateID, result.ObjectRoot.AggregateID)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendDeactivatedEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append reactivate event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{},
|
||||||
|
},
|
||||||
|
result: &Project{State: int32(model.PROJECTSTATE_INACTIVE)},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
tt.args.project.appendDeactivatedEvent()
|
||||||
|
if tt.args.project.State != tt.result.State {
|
||||||
|
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result, tt.args.project)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendReactivatedEvent(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
project *Project
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
result *Project
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "append reactivate event",
|
||||||
|
args: args{
|
||||||
|
project: &Project{},
|
||||||
|
},
|
||||||
|
result: &Project{State: int32(model.PROJECTSTATE_ACTIVE)},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
tt.args.project.appendReactivatedEvent()
|
||||||
|
if tt.args.project.State != tt.result.State {
|
||||||
|
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result, tt.args.project)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -1,815 +0,0 @@
|
|||||||
package eventsourcing
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
|
||||||
"github.com/caos/zitadel/internal/project/model"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestProjectChanges(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
existing *Project
|
|
||||||
new *Project
|
|
||||||
}
|
|
||||||
type res struct {
|
|
||||||
changesLen int
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
res res
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "project name changes",
|
|
||||||
args: args{
|
|
||||||
existing: &Project{Name: "Name"},
|
|
||||||
new: &Project{Name: "NameChanged"},
|
|
||||||
},
|
|
||||||
res: res{
|
|
||||||
changesLen: 1,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "no changes",
|
|
||||||
args: args{
|
|
||||||
existing: &Project{Name: "Name"},
|
|
||||||
new: &Project{Name: "Name"},
|
|
||||||
},
|
|
||||||
res: res{
|
|
||||||
changesLen: 0,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
changes := tt.args.existing.Changes(tt.args.new)
|
|
||||||
if len(changes) != tt.res.changesLen {
|
|
||||||
t.Errorf("got wrong changes len: expected: %v, actual: %v ", tt.res.changesLen, len(changes))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestApplicationChanges(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
existing *Application
|
|
||||||
new *Application
|
|
||||||
}
|
|
||||||
type res struct {
|
|
||||||
changesLen int
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
res res
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "application name changes",
|
|
||||||
args: args{
|
|
||||||
existing: &Application{AppID: "AppID", Name: "Name"},
|
|
||||||
new: &Application{AppID: "AppID", Name: "NameChanged"},
|
|
||||||
},
|
|
||||||
res: res{
|
|
||||||
changesLen: 2,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "no changes",
|
|
||||||
args: args{
|
|
||||||
existing: &Application{AppID: "AppID", Name: "Name"},
|
|
||||||
new: &Application{AppID: "AppID", Name: "Name"},
|
|
||||||
},
|
|
||||||
res: res{
|
|
||||||
changesLen: 1,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
changes := tt.args.existing.Changes(tt.args.new)
|
|
||||||
if len(changes) != tt.res.changesLen {
|
|
||||||
t.Errorf("got wrong changes len: expected: %v, actual: %v ", tt.res.changesLen, len(changes))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestOIDCConfigChanges(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
existing *OIDCConfig
|
|
||||||
new *OIDCConfig
|
|
||||||
}
|
|
||||||
type res struct {
|
|
||||||
changesLen int
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
res res
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "all possible values change",
|
|
||||||
args: args{
|
|
||||||
existing: &OIDCConfig{
|
|
||||||
AppID: "AppID",
|
|
||||||
RedirectUris: []string{"RedirectUris"},
|
|
||||||
ResponseTypes: []int32{1},
|
|
||||||
GrantTypes: []int32{1},
|
|
||||||
ApplicationType: 1,
|
|
||||||
AuthMethodType: 1,
|
|
||||||
PostLogoutRedirectUris: []string{"PostLogoutRedirectUris"},
|
|
||||||
},
|
|
||||||
new: &OIDCConfig{
|
|
||||||
AppID: "AppID",
|
|
||||||
RedirectUris: []string{"RedirectUrisChanged"},
|
|
||||||
ResponseTypes: []int32{2},
|
|
||||||
GrantTypes: []int32{2},
|
|
||||||
ApplicationType: 2,
|
|
||||||
AuthMethodType: 2,
|
|
||||||
PostLogoutRedirectUris: []string{"PostLogoutRedirectUrisChanged"},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
res: res{
|
|
||||||
changesLen: 7,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "no changes",
|
|
||||||
args: args{
|
|
||||||
existing: &OIDCConfig{
|
|
||||||
AppID: "AppID",
|
|
||||||
RedirectUris: []string{"RedirectUris"},
|
|
||||||
ResponseTypes: []int32{1},
|
|
||||||
GrantTypes: []int32{1},
|
|
||||||
ApplicationType: 1,
|
|
||||||
AuthMethodType: 1,
|
|
||||||
PostLogoutRedirectUris: []string{"PostLogoutRedirectUris"},
|
|
||||||
},
|
|
||||||
new: &OIDCConfig{
|
|
||||||
AppID: "AppID",
|
|
||||||
RedirectUris: []string{"RedirectUris"},
|
|
||||||
ResponseTypes: []int32{1},
|
|
||||||
GrantTypes: []int32{1},
|
|
||||||
ApplicationType: 1,
|
|
||||||
AuthMethodType: 1,
|
|
||||||
PostLogoutRedirectUris: []string{"PostLogoutRedirectUris"},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
res: res{
|
|
||||||
changesLen: 1,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "change not changeable attributes",
|
|
||||||
args: args{
|
|
||||||
existing: &OIDCConfig{
|
|
||||||
AppID: "AppID",
|
|
||||||
ClientID: "ClientID",
|
|
||||||
},
|
|
||||||
new: &OIDCConfig{
|
|
||||||
AppID: "AppIDChange",
|
|
||||||
ClientID: "ClientIDChange",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
res: res{
|
|
||||||
changesLen: 1,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
changes := tt.args.existing.Changes(tt.args.new)
|
|
||||||
if len(changes) != tt.res.changesLen {
|
|
||||||
t.Errorf("got wrong changes len: expected: %v, actual: %v ", tt.res.changesLen, len(changes))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestProjectFromEvents(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
event []*es_models.Event
|
|
||||||
project *Project
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
result *Project
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "project from events, ok",
|
|
||||||
args: args{
|
|
||||||
event: []*es_models.Event{
|
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectAdded},
|
|
||||||
},
|
|
||||||
project: &Project{Name: "ProjectName"},
|
|
||||||
},
|
|
||||||
result: &Project{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, State: int32(model.PROJECTSTATE_ACTIVE), Name: "ProjectName"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "project from events, nil project",
|
|
||||||
args: args{
|
|
||||||
event: []*es_models.Event{
|
|
||||||
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectAdded},
|
|
||||||
},
|
|
||||||
project: nil,
|
|
||||||
},
|
|
||||||
result: &Project{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, State: int32(model.PROJECTSTATE_ACTIVE)},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if tt.args.project != nil {
|
|
||||||
data, _ := json.Marshal(tt.args.project)
|
|
||||||
tt.args.event[0].Data = data
|
|
||||||
}
|
|
||||||
result, _ := ProjectFromEvents(tt.args.project, tt.args.event...)
|
|
||||||
if result.Name != tt.result.Name {
|
|
||||||
t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.result.Name, result.Name)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppendEvent(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
event *es_models.Event
|
|
||||||
project *Project
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
result *Project
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "append added event",
|
|
||||||
args: args{
|
|
||||||
event: &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectAdded},
|
|
||||||
project: &Project{Name: "ProjectName"},
|
|
||||||
},
|
|
||||||
result: &Project{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, State: int32(model.PROJECTSTATE_ACTIVE), Name: "ProjectName"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "append change event",
|
|
||||||
args: args{
|
|
||||||
event: &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectChanged},
|
|
||||||
project: &Project{Name: "ProjectName"},
|
|
||||||
},
|
|
||||||
result: &Project{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, State: int32(model.PROJECTSTATE_ACTIVE), Name: "ProjectName"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "append deactivate event",
|
|
||||||
args: args{
|
|
||||||
event: &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectDeactivated},
|
|
||||||
},
|
|
||||||
result: &Project{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, State: int32(model.PROJECTSTATE_INACTIVE)},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "append reactivate event",
|
|
||||||
args: args{
|
|
||||||
event: &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.ProjectReactivated},
|
|
||||||
},
|
|
||||||
result: &Project{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, State: int32(model.PROJECTSTATE_ACTIVE)},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if tt.args.project != nil {
|
|
||||||
data, _ := json.Marshal(tt.args.project)
|
|
||||||
tt.args.event.Data = data
|
|
||||||
}
|
|
||||||
result := new(Project)
|
|
||||||
result.AppendEvent(tt.args.event)
|
|
||||||
if result.State != tt.result.State {
|
|
||||||
t.Errorf("got wrong result state: expected: %v, actual: %v ", tt.result.State, result.State)
|
|
||||||
}
|
|
||||||
if result.Name != tt.result.Name {
|
|
||||||
t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.result.Name, result.Name)
|
|
||||||
}
|
|
||||||
if result.ObjectRoot.AggregateID != tt.result.ObjectRoot.AggregateID {
|
|
||||||
t.Errorf("got wrong result id: expected: %v, actual: %v ", tt.result.ObjectRoot.AggregateID, result.ObjectRoot.AggregateID)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppendDeactivatedEvent(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
project *Project
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
result *Project
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "append reactivate event",
|
|
||||||
args: args{
|
|
||||||
project: &Project{},
|
|
||||||
},
|
|
||||||
result: &Project{State: int32(model.PROJECTSTATE_INACTIVE)},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
tt.args.project.appendDeactivatedEvent()
|
|
||||||
if tt.args.project.State != tt.result.State {
|
|
||||||
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result, tt.args.project)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppendReactivatedEvent(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
project *Project
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
result *Project
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "append reactivate event",
|
|
||||||
args: args{
|
|
||||||
project: &Project{},
|
|
||||||
},
|
|
||||||
result: &Project{State: int32(model.PROJECTSTATE_ACTIVE)},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
tt.args.project.appendReactivatedEvent()
|
|
||||||
if tt.args.project.State != tt.result.State {
|
|
||||||
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result, tt.args.project)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppendAddMemberEvent(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
project *Project
|
|
||||||
member *ProjectMember
|
|
||||||
event *es_models.Event
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
result *Project
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "append add member event",
|
|
||||||
args: args{
|
|
||||||
project: &Project{},
|
|
||||||
member: &ProjectMember{UserID: "UserID", Roles: []string{"Role"}},
|
|
||||||
event: &es_models.Event{},
|
|
||||||
},
|
|
||||||
result: &Project{Members: []*ProjectMember{&ProjectMember{UserID: "UserID", Roles: []string{"Role"}}}},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if tt.args.member != nil {
|
|
||||||
data, _ := json.Marshal(tt.args.member)
|
|
||||||
tt.args.event.Data = data
|
|
||||||
}
|
|
||||||
tt.args.project.appendAddMemberEvent(tt.args.event)
|
|
||||||
if len(tt.args.project.Members) != 1 {
|
|
||||||
t.Errorf("got wrong result should have one member actual: %v ", len(tt.args.project.Members))
|
|
||||||
}
|
|
||||||
if tt.args.project.Members[0] == tt.result.Members[0] {
|
|
||||||
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Members[0], tt.args.project.Members[0])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppendChangeMemberEvent(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
project *Project
|
|
||||||
member *ProjectMember
|
|
||||||
event *es_models.Event
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
result *Project
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "append change member event",
|
|
||||||
args: args{
|
|
||||||
project: &Project{Members: []*ProjectMember{&ProjectMember{UserID: "UserID", Roles: []string{"Role"}}}},
|
|
||||||
member: &ProjectMember{UserID: "UserID", Roles: []string{"ChangedRole"}},
|
|
||||||
event: &es_models.Event{},
|
|
||||||
},
|
|
||||||
result: &Project{Members: []*ProjectMember{&ProjectMember{UserID: "UserID", Roles: []string{"ChangedRole"}}}},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if tt.args.member != nil {
|
|
||||||
data, _ := json.Marshal(tt.args.member)
|
|
||||||
tt.args.event.Data = data
|
|
||||||
}
|
|
||||||
tt.args.project.appendChangeMemberEvent(tt.args.event)
|
|
||||||
if len(tt.args.project.Members) != 1 {
|
|
||||||
t.Errorf("got wrong result should have one member actual: %v ", len(tt.args.project.Members))
|
|
||||||
}
|
|
||||||
if tt.args.project.Members[0] == tt.result.Members[0] {
|
|
||||||
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Members[0], tt.args.project.Members[0])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppendRemoveMemberEvent(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
project *Project
|
|
||||||
member *ProjectMember
|
|
||||||
event *es_models.Event
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
result *Project
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "append remove member event",
|
|
||||||
args: args{
|
|
||||||
project: &Project{Members: []*ProjectMember{&ProjectMember{UserID: "UserID", Roles: []string{"Role"}}}},
|
|
||||||
member: &ProjectMember{UserID: "UserID"},
|
|
||||||
event: &es_models.Event{},
|
|
||||||
},
|
|
||||||
result: &Project{Members: []*ProjectMember{}},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if tt.args.member != nil {
|
|
||||||
data, _ := json.Marshal(tt.args.member)
|
|
||||||
tt.args.event.Data = data
|
|
||||||
}
|
|
||||||
tt.args.project.appendRemoveMemberEvent(tt.args.event)
|
|
||||||
if len(tt.args.project.Members) != 0 {
|
|
||||||
t.Errorf("got wrong result should have no member actual: %v ", len(tt.args.project.Members))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppendAddRoleEvent(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
project *Project
|
|
||||||
role *ProjectRole
|
|
||||||
event *es_models.Event
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
result *Project
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "append add role event",
|
|
||||||
args: args{
|
|
||||||
project: &Project{},
|
|
||||||
role: &ProjectRole{Key: "Key", DisplayName: "DisplayName", Group: "Group"},
|
|
||||||
event: &es_models.Event{},
|
|
||||||
},
|
|
||||||
result: &Project{Roles: []*ProjectRole{&ProjectRole{Key: "Key", DisplayName: "DisplayName", Group: "Group"}}},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if tt.args.role != nil {
|
|
||||||
data, _ := json.Marshal(tt.args.role)
|
|
||||||
tt.args.event.Data = data
|
|
||||||
}
|
|
||||||
tt.args.project.appendAddRoleEvent(tt.args.event)
|
|
||||||
if len(tt.args.project.Roles) != 1 {
|
|
||||||
t.Errorf("got wrong result should have one role actual: %v ", len(tt.args.project.Roles))
|
|
||||||
}
|
|
||||||
if tt.args.project.Roles[0] == tt.result.Roles[0] {
|
|
||||||
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Roles[0], tt.args.project.Roles[0])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppendChangeRoleEvent(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
project *Project
|
|
||||||
role *ProjectRole
|
|
||||||
event *es_models.Event
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
result *Project
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "append change role event",
|
|
||||||
args: args{
|
|
||||||
project: &Project{Roles: []*ProjectRole{&ProjectRole{Key: "Key", DisplayName: "DisplayName", Group: "Group"}}},
|
|
||||||
role: &ProjectRole{Key: "Key", DisplayName: "DisplayNameChanged", Group: "Group"},
|
|
||||||
event: &es_models.Event{},
|
|
||||||
},
|
|
||||||
result: &Project{Roles: []*ProjectRole{&ProjectRole{Key: "Key", DisplayName: "DisplayNameChanged", Group: "Group"}}},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if tt.args.role != nil {
|
|
||||||
data, _ := json.Marshal(tt.args.role)
|
|
||||||
tt.args.event.Data = data
|
|
||||||
}
|
|
||||||
tt.args.project.appendChangeRoleEvent(tt.args.event)
|
|
||||||
if len(tt.args.project.Roles) != 1 {
|
|
||||||
t.Errorf("got wrong result should have one role actual: %v ", len(tt.args.project.Roles))
|
|
||||||
}
|
|
||||||
if tt.args.project.Roles[0] == tt.result.Roles[0] {
|
|
||||||
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Roles[0], tt.args.project.Roles[0])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppendRemoveRoleEvent(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
project *Project
|
|
||||||
role *ProjectRole
|
|
||||||
event *es_models.Event
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
result *Project
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "append remove role event",
|
|
||||||
args: args{
|
|
||||||
project: &Project{Roles: []*ProjectRole{&ProjectRole{Key: "Key", DisplayName: "DisplayName", Group: "Group"}}},
|
|
||||||
role: &ProjectRole{Key: "Key"},
|
|
||||||
event: &es_models.Event{},
|
|
||||||
},
|
|
||||||
result: &Project{Roles: []*ProjectRole{}},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if tt.args.role != nil {
|
|
||||||
data, _ := json.Marshal(tt.args.role)
|
|
||||||
tt.args.event.Data = data
|
|
||||||
}
|
|
||||||
tt.args.project.appendRemoveRoleEvent(tt.args.event)
|
|
||||||
if len(tt.args.project.Roles) != 0 {
|
|
||||||
t.Errorf("got wrong result should have no role actual: %v ", len(tt.args.project.Roles))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppendAddAppEvent(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
project *Project
|
|
||||||
app *Application
|
|
||||||
event *es_models.Event
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
result *Project
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "append add application event",
|
|
||||||
args: args{
|
|
||||||
project: &Project{},
|
|
||||||
app: &Application{Name: "Application"},
|
|
||||||
event: &es_models.Event{},
|
|
||||||
},
|
|
||||||
result: &Project{Applications: []*Application{&Application{Name: "Application"}}},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if tt.args.app != nil {
|
|
||||||
data, _ := json.Marshal(tt.args.app)
|
|
||||||
tt.args.event.Data = data
|
|
||||||
}
|
|
||||||
tt.args.project.appendAddAppEvent(tt.args.event)
|
|
||||||
if len(tt.args.project.Applications) != 1 {
|
|
||||||
t.Errorf("got wrong result should have one app actual: %v ", len(tt.args.project.Applications))
|
|
||||||
}
|
|
||||||
if tt.args.project.Applications[0] == tt.result.Applications[0] {
|
|
||||||
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Applications[0], tt.args.project.Applications[0])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppendChangeAppEvent(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
project *Project
|
|
||||||
app *Application
|
|
||||||
event *es_models.Event
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
result *Project
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "append change application event",
|
|
||||||
args: args{
|
|
||||||
project: &Project{Applications: []*Application{&Application{Name: "Application"}}},
|
|
||||||
app: &Application{Name: "Application Change"},
|
|
||||||
event: &es_models.Event{},
|
|
||||||
},
|
|
||||||
result: &Project{Applications: []*Application{&Application{Name: "Application Change"}}},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if tt.args.app != nil {
|
|
||||||
data, _ := json.Marshal(tt.args.app)
|
|
||||||
tt.args.event.Data = data
|
|
||||||
}
|
|
||||||
tt.args.project.appendChangeAppEvent(tt.args.event)
|
|
||||||
if len(tt.args.project.Applications) != 1 {
|
|
||||||
t.Errorf("got wrong result should have one app actual: %v ", len(tt.args.project.Applications))
|
|
||||||
}
|
|
||||||
if tt.args.project.Applications[0] == tt.result.Applications[0] {
|
|
||||||
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Applications[0], tt.args.project.Applications[0])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppendRemoveAppEvent(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
project *Project
|
|
||||||
app *Application
|
|
||||||
event *es_models.Event
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
result *Project
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "append remove application event",
|
|
||||||
args: args{
|
|
||||||
project: &Project{Applications: []*Application{&Application{AppID: "AppID", Name: "Application"}}},
|
|
||||||
app: &Application{AppID: "AppID", Name: "Application"},
|
|
||||||
event: &es_models.Event{},
|
|
||||||
},
|
|
||||||
result: &Project{Applications: []*Application{}},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if tt.args.app != nil {
|
|
||||||
data, _ := json.Marshal(tt.args.app)
|
|
||||||
tt.args.event.Data = data
|
|
||||||
}
|
|
||||||
tt.args.project.appendRemoveAppEvent(tt.args.event)
|
|
||||||
if len(tt.args.project.Applications) != 0 {
|
|
||||||
t.Errorf("got wrong result should have no apps actual: %v ", len(tt.args.project.Applications))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppendAppStateEvent(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
project *Project
|
|
||||||
app *ApplicationID
|
|
||||||
event *es_models.Event
|
|
||||||
state model.AppState
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
result *Project
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "append deactivate application event",
|
|
||||||
args: args{
|
|
||||||
project: &Project{Applications: []*Application{&Application{AppID: "AppID", Name: "Application", State: int32(model.APPSTATE_ACTIVE)}}},
|
|
||||||
app: &ApplicationID{AppID: "AppID"},
|
|
||||||
event: &es_models.Event{},
|
|
||||||
state: model.APPSTATE_INACTIVE,
|
|
||||||
},
|
|
||||||
result: &Project{Applications: []*Application{&Application{AppID: "AppID", Name: "Application", State: int32(model.APPSTATE_INACTIVE)}}},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "append reactivate application event",
|
|
||||||
args: args{
|
|
||||||
project: &Project{Applications: []*Application{&Application{AppID: "AppID", Name: "Application", State: int32(model.APPSTATE_INACTIVE)}}},
|
|
||||||
app: &ApplicationID{AppID: "AppID"},
|
|
||||||
event: &es_models.Event{},
|
|
||||||
state: model.APPSTATE_ACTIVE,
|
|
||||||
},
|
|
||||||
result: &Project{Applications: []*Application{&Application{AppID: "AppID", Name: "Application", State: int32(model.APPSTATE_ACTIVE)}}},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if tt.args.app != nil {
|
|
||||||
data, _ := json.Marshal(tt.args.app)
|
|
||||||
tt.args.event.Data = data
|
|
||||||
}
|
|
||||||
tt.args.project.appendAppStateEvent(tt.args.event, tt.args.state)
|
|
||||||
if len(tt.args.project.Applications) != 1 {
|
|
||||||
t.Errorf("got wrong result should have one app actual: %v ", len(tt.args.project.Applications))
|
|
||||||
}
|
|
||||||
if tt.args.project.Applications[0] == tt.result.Applications[0] {
|
|
||||||
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Applications[0], tt.args.project.Applications[0])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppendAddOIDCConfigEvent(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
project *Project
|
|
||||||
config *OIDCConfig
|
|
||||||
event *es_models.Event
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
result *Project
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "append add application event",
|
|
||||||
args: args{
|
|
||||||
project: &Project{Applications: []*Application{&Application{AppID: "AppID"}}},
|
|
||||||
config: &OIDCConfig{AppID: "AppID", ClientID: "ClientID"},
|
|
||||||
event: &es_models.Event{},
|
|
||||||
},
|
|
||||||
result: &Project{Applications: []*Application{&Application{AppID: "AppID", OIDCConfig: &OIDCConfig{AppID: "AppID", ClientID: "ClientID"}}}},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if tt.args.config != nil {
|
|
||||||
data, _ := json.Marshal(tt.args.config)
|
|
||||||
tt.args.event.Data = data
|
|
||||||
}
|
|
||||||
tt.args.project.appendAddOIDCConfigEvent(tt.args.event)
|
|
||||||
if len(tt.args.project.Applications) != 1 {
|
|
||||||
t.Errorf("got wrong result should have one app actual: %v ", len(tt.args.project.Applications))
|
|
||||||
}
|
|
||||||
if tt.args.project.Applications[0].OIDCConfig == nil {
|
|
||||||
t.Errorf("got wrong result should have oidc config actual: %v ", tt.args.project.Applications[0].OIDCConfig)
|
|
||||||
}
|
|
||||||
if tt.args.project.Applications[0] == tt.result.Applications[0] {
|
|
||||||
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Applications[0], tt.args.project.Applications[0])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppendChangeOIDCConfigEvent(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
project *Project
|
|
||||||
config *OIDCConfig
|
|
||||||
event *es_models.Event
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
result *Project
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "append change application event",
|
|
||||||
args: args{
|
|
||||||
project: &Project{Applications: []*Application{&Application{AppID: "AppID", OIDCConfig: &OIDCConfig{AppID: "AppID", ClientID: "ClientID"}}}},
|
|
||||||
config: &OIDCConfig{AppID: "AppID", ClientID: "ClientID Changed"},
|
|
||||||
event: &es_models.Event{},
|
|
||||||
},
|
|
||||||
result: &Project{Applications: []*Application{&Application{AppID: "AppID", OIDCConfig: &OIDCConfig{AppID: "AppID", ClientID: "ClientID Changed"}}}},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if tt.args.config != nil {
|
|
||||||
data, _ := json.Marshal(tt.args.config)
|
|
||||||
tt.args.event.Data = data
|
|
||||||
}
|
|
||||||
tt.args.project.appendChangeOIDCConfigEvent(tt.args.event)
|
|
||||||
if len(tt.args.project.Applications) != 1 {
|
|
||||||
t.Errorf("got wrong result should have one app actual: %v ", len(tt.args.project.Applications))
|
|
||||||
}
|
|
||||||
if tt.args.project.Applications[0].OIDCConfig == nil {
|
|
||||||
t.Errorf("got wrong result should have oidc config actual: %v ", tt.args.project.Applications[0].OIDCConfig)
|
|
||||||
}
|
|
||||||
if tt.args.project.Applications[0] == tt.result.Applications[0] {
|
|
||||||
t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.Applications[0], tt.args.project.Applications[0])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
@ -6,7 +6,8 @@ import (
|
|||||||
"github.com/caos/zitadel/internal/errors"
|
"github.com/caos/zitadel/internal/errors"
|
||||||
"github.com/caos/zitadel/internal/eventstore/models"
|
"github.com/caos/zitadel/internal/eventstore/models"
|
||||||
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
es_models "github.com/caos/zitadel/internal/eventstore/models"
|
||||||
"github.com/caos/zitadel/internal/project/model"
|
proj_model "github.com/caos/zitadel/internal/project/model"
|
||||||
|
"github.com/caos/zitadel/internal/project/repository/eventsourcing/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ProjectByIDQuery(id string, latestSequence uint64) (*es_models.SearchQuery, error) {
|
func ProjectByIDQuery(id string, latestSequence uint64) (*es_models.SearchQuery, error) {
|
||||||
@ -19,18 +20,18 @@ func ProjectByIDQuery(id string, latestSequence uint64) (*es_models.SearchQuery,
|
|||||||
|
|
||||||
func ProjectQuery(latestSequence uint64) *es_models.SearchQuery {
|
func ProjectQuery(latestSequence uint64) *es_models.SearchQuery {
|
||||||
return es_models.NewSearchQuery().
|
return es_models.NewSearchQuery().
|
||||||
AggregateTypeFilter(model.ProjectAggregate).
|
AggregateTypeFilter(proj_model.ProjectAggregate).
|
||||||
LatestSequenceFilter(latestSequence)
|
LatestSequenceFilter(latestSequence)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ProjectAggregate(ctx context.Context, aggCreator *es_models.AggregateCreator, project *Project) (*es_models.Aggregate, error) {
|
func ProjectAggregate(ctx context.Context, aggCreator *es_models.AggregateCreator, project *model.Project) (*es_models.Aggregate, error) {
|
||||||
if project == nil {
|
if project == nil {
|
||||||
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-doe93", "existing project should not be nil")
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-doe93", "existing project should not be nil")
|
||||||
}
|
}
|
||||||
return aggCreator.NewAggregate(ctx, project.AggregateID, model.ProjectAggregate, projectVersion, project.Sequence)
|
return aggCreator.NewAggregate(ctx, project.AggregateID, proj_model.ProjectAggregate, model.ProjectVersion, project.Sequence)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ProjectCreateAggregate(aggCreator *es_models.AggregateCreator, project *Project) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func ProjectCreateAggregate(aggCreator *es_models.AggregateCreator, project *model.Project) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
if project == nil {
|
if project == nil {
|
||||||
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-kdie6", "project should not be nil")
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-kdie6", "project should not be nil")
|
||||||
@ -41,11 +42,11 @@ func ProjectCreateAggregate(aggCreator *es_models.AggregateCreator, project *Pro
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return agg.AppendEvent(model.ProjectAdded, project)
|
return agg.AppendEvent(proj_model.ProjectAdded, project)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ProjectUpdateAggregate(aggCreator *es_models.AggregateCreator, existing *Project, new *Project) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func ProjectUpdateAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, new *model.Project) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
if new == nil {
|
if new == nil {
|
||||||
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-dhr74", "new project should not be nil")
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-dhr74", "new project should not be nil")
|
||||||
@ -55,19 +56,19 @@ func ProjectUpdateAggregate(aggCreator *es_models.AggregateCreator, existing *Pr
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
changes := existing.Changes(new)
|
changes := existing.Changes(new)
|
||||||
return agg.AppendEvent(model.ProjectChanged, changes)
|
return agg.AppendEvent(proj_model.ProjectChanged, changes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ProjectDeactivateAggregate(aggCreator *es_models.AggregateCreator, project *Project) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func ProjectDeactivateAggregate(aggCreator *es_models.AggregateCreator, project *model.Project) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return projectStateAggregate(aggCreator, project, model.ProjectDeactivated)
|
return projectStateAggregate(aggCreator, project, proj_model.ProjectDeactivated)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ProjectReactivateAggregate(aggCreator *es_models.AggregateCreator, project *Project) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func ProjectReactivateAggregate(aggCreator *es_models.AggregateCreator, project *model.Project) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return projectStateAggregate(aggCreator, project, model.ProjectReactivated)
|
return projectStateAggregate(aggCreator, project, proj_model.ProjectReactivated)
|
||||||
}
|
}
|
||||||
|
|
||||||
func projectStateAggregate(aggCreator *es_models.AggregateCreator, project *Project, state models.EventType) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func projectStateAggregate(aggCreator *es_models.AggregateCreator, project *model.Project, state models.EventType) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
agg, err := ProjectAggregate(ctx, aggCreator, project)
|
agg, err := ProjectAggregate(ctx, aggCreator, project)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -77,7 +78,7 @@ func projectStateAggregate(aggCreator *es_models.AggregateCreator, project *Proj
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ProjectMemberAddedAggregate(aggCreator *es_models.AggregateCreator, existing *Project, member *ProjectMember) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func ProjectMemberAddedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, member *model.ProjectMember) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
if member == nil {
|
if member == nil {
|
||||||
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-ie34f", "member should not be nil")
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-ie34f", "member should not be nil")
|
||||||
@ -86,11 +87,11 @@ func ProjectMemberAddedAggregate(aggCreator *es_models.AggregateCreator, existin
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return agg.AppendEvent(model.ProjectMemberAdded, member)
|
return agg.AppendEvent(proj_model.ProjectMemberAdded, member)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ProjectMemberChangedAggregate(aggCreator *es_models.AggregateCreator, existing *Project, member *ProjectMember) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func ProjectMemberChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, member *model.ProjectMember) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
if member == nil {
|
if member == nil {
|
||||||
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-d34fs", "member should not be nil")
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-d34fs", "member should not be nil")
|
||||||
@ -100,11 +101,11 @@ func ProjectMemberChangedAggregate(aggCreator *es_models.AggregateCreator, exist
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return agg.AppendEvent(model.ProjectMemberChanged, member)
|
return agg.AppendEvent(proj_model.ProjectMemberChanged, member)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ProjectMemberRemovedAggregate(aggCreator *es_models.AggregateCreator, existing *Project, member *ProjectMember) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func ProjectMemberRemovedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, member *model.ProjectMember) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
if member == nil {
|
if member == nil {
|
||||||
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-dieu7", "member should not be nil")
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-dieu7", "member should not be nil")
|
||||||
@ -113,11 +114,11 @@ func ProjectMemberRemovedAggregate(aggCreator *es_models.AggregateCreator, exist
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return agg.AppendEvent(model.ProjectMemberRemoved, member)
|
return agg.AppendEvent(proj_model.ProjectMemberRemoved, member)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ProjectRoleAddedAggregate(aggCreator *es_models.AggregateCreator, existing *Project, role *ProjectRole) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func ProjectRoleAddedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, role *model.ProjectRole) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
if role == nil {
|
if role == nil {
|
||||||
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-sleo9", "role should not be nil")
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-sleo9", "role should not be nil")
|
||||||
@ -126,11 +127,11 @@ func ProjectRoleAddedAggregate(aggCreator *es_models.AggregateCreator, existing
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return agg.AppendEvent(model.ProjectRoleAdded, role)
|
return agg.AppendEvent(proj_model.ProjectRoleAdded, role)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ProjectRoleChangedAggregate(aggCreator *es_models.AggregateCreator, existing *Project, role *ProjectRole) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func ProjectRoleChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, role *model.ProjectRole) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
if role == nil {
|
if role == nil {
|
||||||
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-oe8sf", "member should not be nil")
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-oe8sf", "member should not be nil")
|
||||||
@ -139,11 +140,11 @@ func ProjectRoleChangedAggregate(aggCreator *es_models.AggregateCreator, existin
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return agg.AppendEvent(model.ProjectRoleChanged, role)
|
return agg.AppendEvent(proj_model.ProjectRoleChanged, role)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ProjectRoleRemovedAggregate(aggCreator *es_models.AggregateCreator, existing *Project, role *ProjectRole) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func ProjectRoleRemovedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, role *model.ProjectRole) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
if role == nil {
|
if role == nil {
|
||||||
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-d8eis", "member should not be nil")
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-d8eis", "member should not be nil")
|
||||||
@ -152,11 +153,11 @@ func ProjectRoleRemovedAggregate(aggCreator *es_models.AggregateCreator, existin
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return agg.AppendEvent(model.ProjectRoleRemoved, role)
|
return agg.AppendEvent(proj_model.ProjectRoleRemoved, role)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ApplicationAddedAggregate(aggCreator *es_models.AggregateCreator, existing *Project, app *Application) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func ApplicationAddedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, app *model.Application) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
if app == nil {
|
if app == nil {
|
||||||
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-09du7", "app should not be nil")
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-09du7", "app should not be nil")
|
||||||
@ -165,15 +166,15 @@ func ApplicationAddedAggregate(aggCreator *es_models.AggregateCreator, existing
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
agg.AppendEvent(model.ApplicationAdded, app)
|
agg.AppendEvent(proj_model.ApplicationAdded, app)
|
||||||
if app.OIDCConfig != nil {
|
if app.OIDCConfig != nil {
|
||||||
agg.AppendEvent(model.OIDCConfigAdded, app.OIDCConfig)
|
agg.AppendEvent(proj_model.OIDCConfigAdded, app.OIDCConfig)
|
||||||
}
|
}
|
||||||
return agg, nil
|
return agg, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ApplicationChangedAggregate(aggCreator *es_models.AggregateCreator, existing *Project, app *Application) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func ApplicationChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, app *model.Application) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
if app == nil {
|
if app == nil {
|
||||||
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-sleo9", "app should not be nil")
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-sleo9", "app should not be nil")
|
||||||
@ -188,13 +189,13 @@ func ApplicationChangedAggregate(aggCreator *es_models.AggregateCreator, existin
|
|||||||
changes = a.Changes(app)
|
changes = a.Changes(app)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
agg.AppendEvent(model.ApplicationChanged, changes)
|
agg.AppendEvent(proj_model.ApplicationChanged, changes)
|
||||||
|
|
||||||
return agg, nil
|
return agg, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ApplicationRemovedAggregate(aggCreator *es_models.AggregateCreator, existing *Project, app *Application) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func ApplicationRemovedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, app *model.Application) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
if app == nil {
|
if app == nil {
|
||||||
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-se23g", "app should not be nil")
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-se23g", "app should not be nil")
|
||||||
@ -203,13 +204,13 @@ func ApplicationRemovedAggregate(aggCreator *es_models.AggregateCreator, existin
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
agg.AppendEvent(model.ApplicationRemoved, &ApplicationID{AppID: app.AppID})
|
agg.AppendEvent(proj_model.ApplicationRemoved, &model.ApplicationID{AppID: app.AppID})
|
||||||
|
|
||||||
return agg, nil
|
return agg, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ApplicationDeactivatedAggregate(aggCreator *es_models.AggregateCreator, existing *Project, app *Application) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func ApplicationDeactivatedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, app *model.Application) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
if app == nil {
|
if app == nil {
|
||||||
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-slfi3", "app should not be nil")
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-slfi3", "app should not be nil")
|
||||||
@ -218,13 +219,13 @@ func ApplicationDeactivatedAggregate(aggCreator *es_models.AggregateCreator, exi
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
agg.AppendEvent(model.ApplicationDeactivated, &ApplicationID{AppID: app.AppID})
|
agg.AppendEvent(proj_model.ApplicationDeactivated, &model.ApplicationID{AppID: app.AppID})
|
||||||
|
|
||||||
return agg, nil
|
return agg, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ApplicationReactivatedAggregate(aggCreator *es_models.AggregateCreator, existing *Project, app *Application) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func ApplicationReactivatedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, app *model.Application) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
if app == nil {
|
if app == nil {
|
||||||
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-slf32", "app should not be nil")
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-slf32", "app should not be nil")
|
||||||
@ -233,13 +234,13 @@ func ApplicationReactivatedAggregate(aggCreator *es_models.AggregateCreator, exi
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
agg.AppendEvent(model.ApplicationReactivated, &ApplicationID{AppID: app.AppID})
|
agg.AppendEvent(proj_model.ApplicationReactivated, &model.ApplicationID{AppID: app.AppID})
|
||||||
|
|
||||||
return agg, nil
|
return agg, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func OIDCConfigChangedAggregate(aggCreator *es_models.AggregateCreator, existing *Project, config *OIDCConfig) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func OIDCConfigChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, config *model.OIDCConfig) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-slf32", "config should not be nil")
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-slf32", "config should not be nil")
|
||||||
@ -256,13 +257,13 @@ func OIDCConfigChangedAggregate(aggCreator *es_models.AggregateCreator, existing
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
agg.AppendEvent(model.OIDCConfigChanged, changes)
|
agg.AppendEvent(proj_model.OIDCConfigChanged, changes)
|
||||||
|
|
||||||
return agg, nil
|
return agg, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func OIDCConfigSecretChangedAggregate(aggCreator *es_models.AggregateCreator, existing *Project, appID string, secret *crypto.CryptoValue) func(ctx context.Context) (*es_models.Aggregate, error) {
|
func OIDCConfigSecretChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, appID string, secret *crypto.CryptoValue) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
agg, err := ProjectAggregate(ctx, aggCreator, existing)
|
agg, err := ProjectAggregate(ctx, aggCreator, existing)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -272,8 +273,134 @@ func OIDCConfigSecretChangedAggregate(aggCreator *es_models.AggregateCreator, ex
|
|||||||
changes["appId"] = appID
|
changes["appId"] = appID
|
||||||
changes["clientSecret"] = secret
|
changes["clientSecret"] = secret
|
||||||
|
|
||||||
agg.AppendEvent(model.OIDCConfigSecretChanged, changes)
|
agg.AppendEvent(proj_model.OIDCConfigSecretChanged, changes)
|
||||||
|
|
||||||
return agg, nil
|
return agg, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ProjectGrantAddedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, grant *model.ProjectGrant) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
|
if grant == nil {
|
||||||
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-kd89w", "grant should not be nil")
|
||||||
|
}
|
||||||
|
agg, err := ProjectAggregate(ctx, aggCreator, existing)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
agg.AppendEvent(proj_model.ProjectGrantAdded, grant)
|
||||||
|
return agg, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectGrantChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, grant *model.ProjectGrant) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
|
if grant == nil {
|
||||||
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-d9ie2", "grant should not be nil")
|
||||||
|
}
|
||||||
|
agg, err := ProjectAggregate(ctx, aggCreator, existing)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var changes map[string]interface{}
|
||||||
|
for _, g := range existing.Grants {
|
||||||
|
if g.GrantID == grant.GrantID {
|
||||||
|
changes = g.Changes(grant)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
agg.AppendEvent(proj_model.ProjectGrantChanged, changes)
|
||||||
|
|
||||||
|
return agg, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectGrantRemovedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, grant *model.ProjectGrant) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
|
if grant == nil {
|
||||||
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-kci8d", "grant should not be nil")
|
||||||
|
}
|
||||||
|
agg, err := ProjectAggregate(ctx, aggCreator, existing)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
agg.AppendEvent(proj_model.ProjectGrantRemoved, &model.ProjectGrantID{GrantID: grant.GrantID})
|
||||||
|
|
||||||
|
return agg, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectGrantDeactivatedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, grant *model.ProjectGrant) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
|
if grant == nil {
|
||||||
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-id832", "grant should not be nil")
|
||||||
|
}
|
||||||
|
agg, err := ProjectAggregate(ctx, aggCreator, existing)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
agg.AppendEvent(proj_model.ProjectGrantDeactivated, &model.ProjectGrantID{GrantID: grant.GrantID})
|
||||||
|
|
||||||
|
return agg, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectGrantReactivatedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, grant *model.ProjectGrant) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
|
if grant == nil {
|
||||||
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-8diw2", "grant should not be nil")
|
||||||
|
}
|
||||||
|
agg, err := ProjectAggregate(ctx, aggCreator, existing)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
agg.AppendEvent(proj_model.ProjectGrantReactivated, &model.ProjectGrantID{GrantID: grant.GrantID})
|
||||||
|
|
||||||
|
return agg, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectGrantMemberAddedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, member *model.ProjectGrantMember) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
|
if member == nil {
|
||||||
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-4ufh6", "grant should not be nil")
|
||||||
|
}
|
||||||
|
agg, err := ProjectAggregate(ctx, aggCreator, existing)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
agg.AppendEvent(proj_model.ProjectGrantMemberAdded, member)
|
||||||
|
return agg, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectGrantMemberChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, member *model.ProjectGrantMember) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
|
if member == nil {
|
||||||
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-d8i4h", "member should not be nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
agg, err := ProjectAggregate(ctx, aggCreator, existing)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
changes := make(map[string]interface{}, 1)
|
||||||
|
changes["grantId"] = member.GrantID
|
||||||
|
changes["userId"] = member.UserID
|
||||||
|
changes["roles"] = member.Roles
|
||||||
|
|
||||||
|
return agg.AppendEvent(proj_model.ProjectGrantMemberChanged, changes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProjectGrantMemberRemovedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Project, member *model.ProjectGrantMember) func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
|
return func(ctx context.Context) (*es_models.Aggregate, error) {
|
||||||
|
if member == nil {
|
||||||
|
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-slp0r", "member should not be nil")
|
||||||
|
}
|
||||||
|
agg, err := ProjectAggregate(ctx, aggCreator, existing)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return agg.AppendEvent(proj_model.ProjectGrantMemberRemoved, member)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -410,6 +410,11 @@ var ManagementService_AuthMethods = utils_auth.MethodMapping{
|
|||||||
CheckParam: "",
|
CheckParam: "",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"/caos.zitadel.management.api.v1.ManagementService/RemoveProjectGrant": utils_auth.Option{
|
||||||
|
Permission: "project.grant.delete",
|
||||||
|
CheckParam: "",
|
||||||
|
},
|
||||||
|
|
||||||
"/caos.zitadel.management.api.v1.ManagementService/GetProjectGrantMemberRoles": utils_auth.Option{
|
"/caos.zitadel.management.api.v1.ManagementService/GetProjectGrantMemberRoles": utils_auth.Option{
|
||||||
Permission: "project.grant.member.read",
|
Permission: "project.grant.member.read",
|
||||||
CheckParam: "",
|
CheckParam: "",
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -2566,6 +2566,44 @@ func request_ManagementService_ReactivateProjectGrant_0(ctx context.Context, mar
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func request_ManagementService_RemoveProjectGrant_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||||
|
var protoReq ProjectGrantID
|
||||||
|
var metadata runtime.ServerMetadata
|
||||||
|
|
||||||
|
var (
|
||||||
|
val string
|
||||||
|
ok bool
|
||||||
|
err error
|
||||||
|
_ = err
|
||||||
|
)
|
||||||
|
|
||||||
|
val, ok = pathParams["project_id"]
|
||||||
|
if !ok {
|
||||||
|
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "project_id")
|
||||||
|
}
|
||||||
|
|
||||||
|
protoReq.ProjectId, err = runtime.String(val)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "project_id", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
val, ok = pathParams["id"]
|
||||||
|
if !ok {
|
||||||
|
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id")
|
||||||
|
}
|
||||||
|
|
||||||
|
protoReq.Id, err = runtime.String(val)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
msg, err := client.RemoveProjectGrant(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
|
||||||
|
return msg, metadata, err
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func request_ManagementService_GetProjectGrantMemberRoles_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
func request_ManagementService_GetProjectGrantMemberRoles_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||||
var protoReq empty.Empty
|
var protoReq empty.Empty
|
||||||
var metadata runtime.ServerMetadata
|
var metadata runtime.ServerMetadata
|
||||||
@ -5298,6 +5336,26 @@ func RegisterManagementServiceHandlerClient(ctx context.Context, mux *runtime.Se
|
|||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
mux.Handle("DELETE", pattern_ManagementService_RemoveProjectGrant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||||
|
ctx, cancel := context.WithCancel(req.Context())
|
||||||
|
defer cancel()
|
||||||
|
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||||
|
rctx, err := runtime.AnnotateContext(ctx, mux, req)
|
||||||
|
if err != nil {
|
||||||
|
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp, md, err := request_ManagementService_RemoveProjectGrant_0(rctx, inboundMarshaler, client, req, pathParams)
|
||||||
|
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||||
|
if err != nil {
|
||||||
|
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
forward_ManagementService_RemoveProjectGrant_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
mux.Handle("GET", pattern_ManagementService_GetProjectGrantMemberRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
mux.Handle("GET", pattern_ManagementService_GetProjectGrantMemberRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||||
ctx, cancel := context.WithCancel(req.Context())
|
ctx, cancel := context.WithCancel(req.Context())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
@ -5946,6 +6004,8 @@ var (
|
|||||||
|
|
||||||
pattern_ManagementService_ReactivateProjectGrant_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"projects", "project_id", "grants", "id", "_reactivate"}, ""))
|
pattern_ManagementService_ReactivateProjectGrant_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"projects", "project_id", "grants", "id", "_reactivate"}, ""))
|
||||||
|
|
||||||
|
pattern_ManagementService_RemoveProjectGrant_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"projects", "project_id", "grants", "id"}, ""))
|
||||||
|
|
||||||
pattern_ManagementService_GetProjectGrantMemberRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"projects", "grants", "members", "roles"}, ""))
|
pattern_ManagementService_GetProjectGrantMemberRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"projects", "grants", "members", "roles"}, ""))
|
||||||
|
|
||||||
pattern_ManagementService_SearchProjectGrantMembers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"projects", "project_id", "grants", "grant_id", "members", "_search"}, ""))
|
pattern_ManagementService_SearchProjectGrantMembers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"projects", "project_id", "grants", "grant_id", "members", "_search"}, ""))
|
||||||
@ -6160,6 +6220,8 @@ var (
|
|||||||
|
|
||||||
forward_ManagementService_ReactivateProjectGrant_0 = runtime.ForwardResponseMessage
|
forward_ManagementService_ReactivateProjectGrant_0 = runtime.ForwardResponseMessage
|
||||||
|
|
||||||
|
forward_ManagementService_RemoveProjectGrant_0 = runtime.ForwardResponseMessage
|
||||||
|
|
||||||
forward_ManagementService_GetProjectGrantMemberRoles_0 = runtime.ForwardResponseMessage
|
forward_ManagementService_GetProjectGrantMemberRoles_0 = runtime.ForwardResponseMessage
|
||||||
|
|
||||||
forward_ManagementService_SearchProjectGrantMembers_0 = runtime.ForwardResponseMessage
|
forward_ManagementService_SearchProjectGrantMembers_0 = runtime.ForwardResponseMessage
|
||||||
|
@ -1760,7 +1760,7 @@
|
|||||||
"200": {
|
"200": {
|
||||||
"description": "A successful response.",
|
"description": "A successful response.",
|
||||||
"schema": {
|
"schema": {
|
||||||
"properties": {}
|
"$ref": "#/definitions/v1ProjectGrantMember"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1870,7 +1870,7 @@
|
|||||||
"200": {
|
"200": {
|
||||||
"description": "A successful response.",
|
"description": "A successful response.",
|
||||||
"schema": {
|
"schema": {
|
||||||
"properties": {}
|
"$ref": "#/definitions/v1ProjectGrantMember"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1936,6 +1936,34 @@
|
|||||||
"ManagementService"
|
"ManagementService"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"delete": {
|
||||||
|
"operationId": "RemoveProjectGrant",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "A successful response.",
|
||||||
|
"schema": {
|
||||||
|
"properties": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "project_id",
|
||||||
|
"in": "path",
|
||||||
|
"required": true,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "id",
|
||||||
|
"in": "path",
|
||||||
|
"required": true,
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"ManagementService"
|
||||||
|
]
|
||||||
|
},
|
||||||
"put": {
|
"put": {
|
||||||
"operationId": "UpdateProjectGrant",
|
"operationId": "UpdateProjectGrant",
|
||||||
"responses": {
|
"responses": {
|
||||||
@ -4435,7 +4463,7 @@
|
|||||||
"granted_org_domain": {
|
"granted_org_domain": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"role_names": {
|
"role_keys": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
@ -4470,7 +4498,7 @@
|
|||||||
"granted_org_id": {
|
"granted_org_id": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"role_names": {
|
"role_keys": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
@ -4708,7 +4736,7 @@
|
|||||||
"id": {
|
"id": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"role_names": {
|
"role_keys": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
@ -4731,7 +4759,7 @@
|
|||||||
"project_id": {
|
"project_id": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"role_names": {
|
"role_keys": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
@ -4787,7 +4815,7 @@
|
|||||||
"id": {
|
"id": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"role_names": {
|
"role_keys": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
@ -5228,7 +5256,7 @@
|
|||||||
"id": {
|
"id": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"role_names": {
|
"role_keys": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
@ -5486,7 +5514,7 @@
|
|||||||
"project_id": {
|
"project_id": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"role_names": {
|
"role_keys": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
@ -5542,7 +5570,7 @@
|
|||||||
"project_id": {
|
"project_id": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"role_names": {
|
"role_keys": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
@ -5645,7 +5673,7 @@
|
|||||||
"id": {
|
"id": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"role_names": {
|
"role_keys": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
|
@ -58,14 +58,14 @@ func (mr *MockManagementServiceClientMockRecorder) AddOrgMember(arg0, arg1 inter
|
|||||||
}
|
}
|
||||||
|
|
||||||
// AddProjectGrantMember mocks base method
|
// AddProjectGrantMember mocks base method
|
||||||
func (m *MockManagementServiceClient) AddProjectGrantMember(arg0 context.Context, arg1 *grpc.ProjectGrantMemberAdd, arg2 ...grpc0.CallOption) (*emptypb.Empty, error) {
|
func (m *MockManagementServiceClient) AddProjectGrantMember(arg0 context.Context, arg1 *grpc.ProjectGrantMemberAdd, arg2 ...grpc0.CallOption) (*grpc.ProjectGrantMember, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
varargs := []interface{}{arg0, arg1}
|
varargs := []interface{}{arg0, arg1}
|
||||||
for _, a := range arg2 {
|
for _, a := range arg2 {
|
||||||
varargs = append(varargs, a)
|
varargs = append(varargs, a)
|
||||||
}
|
}
|
||||||
ret := m.ctrl.Call(m, "AddProjectGrantMember", varargs...)
|
ret := m.ctrl.Call(m, "AddProjectGrantMember", varargs...)
|
||||||
ret0, _ := ret[0].(*emptypb.Empty)
|
ret0, _ := ret[0].(*grpc.ProjectGrantMember)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
@ -178,14 +178,14 @@ func (mr *MockManagementServiceClientMockRecorder) ChangeOrgMember(arg0, arg1 in
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ChangeProjectGrantMember mocks base method
|
// ChangeProjectGrantMember mocks base method
|
||||||
func (m *MockManagementServiceClient) ChangeProjectGrantMember(arg0 context.Context, arg1 *grpc.ProjectGrantMemberChange, arg2 ...grpc0.CallOption) (*emptypb.Empty, error) {
|
func (m *MockManagementServiceClient) ChangeProjectGrantMember(arg0 context.Context, arg1 *grpc.ProjectGrantMemberChange, arg2 ...grpc0.CallOption) (*grpc.ProjectGrantMember, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
varargs := []interface{}{arg0, arg1}
|
varargs := []interface{}{arg0, arg1}
|
||||||
for _, a := range arg2 {
|
for _, a := range arg2 {
|
||||||
varargs = append(varargs, a)
|
varargs = append(varargs, a)
|
||||||
}
|
}
|
||||||
ret := m.ctrl.Call(m, "ChangeProjectGrantMember", varargs...)
|
ret := m.ctrl.Call(m, "ChangeProjectGrantMember", varargs...)
|
||||||
ret0, _ := ret[0].(*emptypb.Empty)
|
ret0, _ := ret[0].(*grpc.ProjectGrantMember)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
@ -1417,6 +1417,26 @@ func (mr *MockManagementServiceClientMockRecorder) RegenerateOIDCClientSecret(ar
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegenerateOIDCClientSecret", reflect.TypeOf((*MockManagementServiceClient)(nil).RegenerateOIDCClientSecret), varargs...)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegenerateOIDCClientSecret", reflect.TypeOf((*MockManagementServiceClient)(nil).RegenerateOIDCClientSecret), varargs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RemoveApplication mocks base method
|
||||||
|
func (m *MockManagementServiceClient) RemoveApplication(arg0 context.Context, arg1 *grpc.ApplicationID, arg2 ...grpc0.CallOption) (*emptypb.Empty, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
varargs := []interface{}{arg0, arg1}
|
||||||
|
for _, a := range arg2 {
|
||||||
|
varargs = append(varargs, a)
|
||||||
|
}
|
||||||
|
ret := m.ctrl.Call(m, "RemoveApplication", varargs...)
|
||||||
|
ret0, _ := ret[0].(*emptypb.Empty)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveApplication indicates an expected call of RemoveApplication
|
||||||
|
func (mr *MockManagementServiceClientMockRecorder) RemoveApplication(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
varargs := append([]interface{}{arg0, arg1}, arg2...)
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveApplication", reflect.TypeOf((*MockManagementServiceClient)(nil).RemoveApplication), varargs...)
|
||||||
|
}
|
||||||
|
|
||||||
// RemoveOrgMember mocks base method
|
// RemoveOrgMember mocks base method
|
||||||
func (m *MockManagementServiceClient) RemoveOrgMember(arg0 context.Context, arg1 *grpc.RemoveOrgMemberRequest, arg2 ...grpc0.CallOption) (*emptypb.Empty, error) {
|
func (m *MockManagementServiceClient) RemoveOrgMember(arg0 context.Context, arg1 *grpc.RemoveOrgMemberRequest, arg2 ...grpc0.CallOption) (*emptypb.Empty, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@ -1437,6 +1457,26 @@ func (mr *MockManagementServiceClientMockRecorder) RemoveOrgMember(arg0, arg1 in
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveOrgMember", reflect.TypeOf((*MockManagementServiceClient)(nil).RemoveOrgMember), varargs...)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveOrgMember", reflect.TypeOf((*MockManagementServiceClient)(nil).RemoveOrgMember), varargs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RemoveProjectGrant mocks base method
|
||||||
|
func (m *MockManagementServiceClient) RemoveProjectGrant(arg0 context.Context, arg1 *grpc.ProjectGrantID, arg2 ...grpc0.CallOption) (*emptypb.Empty, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
varargs := []interface{}{arg0, arg1}
|
||||||
|
for _, a := range arg2 {
|
||||||
|
varargs = append(varargs, a)
|
||||||
|
}
|
||||||
|
ret := m.ctrl.Call(m, "RemoveProjectGrant", varargs...)
|
||||||
|
ret0, _ := ret[0].(*emptypb.Empty)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveProjectGrant indicates an expected call of RemoveProjectGrant
|
||||||
|
func (mr *MockManagementServiceClientMockRecorder) RemoveProjectGrant(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
varargs := append([]interface{}{arg0, arg1}, arg2...)
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveProjectGrant", reflect.TypeOf((*MockManagementServiceClient)(nil).RemoveProjectGrant), varargs...)
|
||||||
|
}
|
||||||
|
|
||||||
// RemoveProjectGrantMember mocks base method
|
// RemoveProjectGrantMember mocks base method
|
||||||
func (m *MockManagementServiceClient) RemoveProjectGrantMember(arg0 context.Context, arg1 *grpc.ProjectGrantMemberRemove, arg2 ...grpc0.CallOption) (*emptypb.Empty, error) {
|
func (m *MockManagementServiceClient) RemoveProjectGrantMember(arg0 context.Context, arg1 *grpc.ProjectGrantMemberRemove, arg2 ...grpc0.CallOption) (*emptypb.Empty, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
|
@ -10,23 +10,49 @@ func (s *Server) GetProjectGrantMemberRoles(ctx context.Context, _ *empty.Empty)
|
|||||||
return nil, errors.ThrowUnimplemented(nil, "GRPC-mGo89", "Not implemented")
|
return nil, errors.ThrowUnimplemented(nil, "GRPC-mGo89", "Not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) SearchProjectGrants(ctx context.Context, request *ProjectGrantSearchRequest) (*ProjectGrantSearchResponse, error) {
|
func (s *Server) SearchProjectGrants(ctx context.Context, in *ProjectGrantSearchRequest) (*ProjectGrantSearchResponse, error) {
|
||||||
return nil, errors.ThrowUnimplemented(nil, "GRPC-po9fs", "Not implemented")
|
return nil, errors.ThrowUnimplemented(nil, "GRPC-po9fs", "Not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) ProjectGrantByID(ctx context.Context, request *ProjectGrantID) (*ProjectGrant, error) {
|
func (s *Server) ProjectGrantByID(ctx context.Context, in *ProjectGrantID) (*ProjectGrant, error) {
|
||||||
return nil, errors.ThrowUnimplemented(nil, "GRPC-nmr54", "Not implemented")
|
grant, err := s.project.ProjectGrantByID(ctx, in.ProjectId, in.Id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return projectGrantFromModel(grant), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) CreateProjectGrant(ctx context.Context, in *ProjectGrantCreate) (*ProjectGrant, error) {
|
func (s *Server) CreateProjectGrant(ctx context.Context, in *ProjectGrantCreate) (*ProjectGrant, error) {
|
||||||
return nil, errors.ThrowUnimplemented(nil, "GRPC-fi45f", "Not implemented")
|
grant, err := s.project.AddProjectGrant(ctx, projectGrantCreateToModel(in))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return projectGrantFromModel(grant), nil
|
||||||
}
|
}
|
||||||
func (s *Server) UpdateProjectGrant(ctx context.Context, in *ProjectGrantUpdate) (*ProjectGrant, error) {
|
func (s *Server) UpdateProjectGrant(ctx context.Context, in *ProjectGrantUpdate) (*ProjectGrant, error) {
|
||||||
return nil, errors.ThrowUnimplemented(nil, "GRPC-nm7Ds", "Not implemented")
|
grant, err := s.project.ChangeProjectGrant(ctx, projectGrantUpdateToModel(in))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return projectGrantFromModel(grant), nil
|
||||||
}
|
}
|
||||||
func (s *Server) DeactivateProjectGrant(ctx context.Context, in *ProjectGrantID) (*ProjectGrant, error) {
|
func (s *Server) DeactivateProjectGrant(ctx context.Context, in *ProjectGrantID) (*ProjectGrant, error) {
|
||||||
return nil, errors.ThrowUnimplemented(nil, "GRPC-xkwpr", "Not implemented")
|
grant, err := s.project.DeactivateProjectGrant(ctx, in.ProjectId, in.Id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return projectGrantFromModel(grant), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) ReactivateProjectGrant(ctx context.Context, in *ProjectGrantID) (*ProjectGrant, error) {
|
func (s *Server) ReactivateProjectGrant(ctx context.Context, in *ProjectGrantID) (*ProjectGrant, error) {
|
||||||
return nil, errors.ThrowUnimplemented(nil, "GRPC-mdk23", "Not implemented")
|
grant, err := s.project.ReactivateProjectGrant(ctx, in.ProjectId, in.Id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return projectGrantFromModel(grant), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) RemoveProjectGrant(ctx context.Context, in *ProjectGrantID) (*empty.Empty, error) {
|
||||||
|
err := s.project.RemoveProjectGrant(ctx, in.ProjectId, in.Id)
|
||||||
|
return &empty.Empty{}, err
|
||||||
}
|
}
|
||||||
|
57
pkg/management/api/grpc/project_grant_converter.go
Normal file
57
pkg/management/api/grpc/project_grant_converter.go
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
package grpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/caos/logging"
|
||||||
|
"github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
proj_model "github.com/caos/zitadel/internal/project/model"
|
||||||
|
"github.com/golang/protobuf/ptypes"
|
||||||
|
)
|
||||||
|
|
||||||
|
func projectGrantFromModel(grant *proj_model.ProjectGrant) *ProjectGrant {
|
||||||
|
creationDate, err := ptypes.TimestampProto(grant.CreationDate)
|
||||||
|
logging.Log("GRPC-8d73s").OnError(err).Debug("unable to parse timestamp")
|
||||||
|
|
||||||
|
changeDate, err := ptypes.TimestampProto(grant.ChangeDate)
|
||||||
|
logging.Log("GRPC-dlso3").OnError(err).Debug("unable to parse timestamp")
|
||||||
|
|
||||||
|
return &ProjectGrant{
|
||||||
|
Id: grant.GrantID,
|
||||||
|
State: projectGrantStateFromModel(grant.State),
|
||||||
|
CreationDate: creationDate,
|
||||||
|
ChangeDate: changeDate,
|
||||||
|
GrantedOrgId: grant.GrantedOrgID,
|
||||||
|
RoleKeys: grant.RoleKeys,
|
||||||
|
Sequence: grant.Sequence,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func projectGrantCreateToModel(grant *ProjectGrantCreate) *proj_model.ProjectGrant {
|
||||||
|
return &proj_model.ProjectGrant{
|
||||||
|
ObjectRoot: models.ObjectRoot{
|
||||||
|
AggregateID: grant.ProjectId,
|
||||||
|
},
|
||||||
|
GrantedOrgID: grant.GrantedOrgId,
|
||||||
|
RoleKeys: grant.RoleKeys,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func projectGrantUpdateToModel(grant *ProjectGrantUpdate) *proj_model.ProjectGrant {
|
||||||
|
return &proj_model.ProjectGrant{
|
||||||
|
ObjectRoot: models.ObjectRoot{
|
||||||
|
AggregateID: grant.ProjectId,
|
||||||
|
},
|
||||||
|
GrantID: grant.Id,
|
||||||
|
RoleKeys: grant.RoleKeys,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func projectGrantStateFromModel(state proj_model.ProjectGrantState) ProjectGrantState {
|
||||||
|
switch state {
|
||||||
|
case proj_model.PROJECTGRANTSTATE_ACTIVE:
|
||||||
|
return ProjectGrantState_PROJECTGRANTSTATE_ACTIVE
|
||||||
|
case proj_model.PROJECTGRANTSTATE_INACTIVE:
|
||||||
|
return ProjectGrantState_PROJECTGRANTSTATE_INACTIVE
|
||||||
|
default:
|
||||||
|
return ProjectGrantState_PROJECTGRANTSTATE_UNSPECIFIED
|
||||||
|
}
|
||||||
|
}
|
@ -10,14 +10,23 @@ func (s *Server) SearchProjectGrantMembers(ctx context.Context, request *Project
|
|||||||
return nil, errors.ThrowUnimplemented(nil, "GRPC-pldE4", "Not implemented")
|
return nil, errors.ThrowUnimplemented(nil, "GRPC-pldE4", "Not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) AddProjectGrantMember(ctx context.Context, in *ProjectGrantMemberAdd) (*empty.Empty, error) {
|
func (s *Server) AddProjectGrantMember(ctx context.Context, in *ProjectGrantMemberAdd) (*ProjectGrantMember, error) {
|
||||||
return nil, errors.ThrowUnimplemented(nil, "GRPC-po8r3", "Not implemented")
|
member, err := s.project.AddProjectGrantMember(ctx, projectGrantMemberAddToModel(in))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return projectGrantMemberFromModel(member), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) ChangeProjectGrantMember(ctx context.Context, in *ProjectGrantMemberChange) (*empty.Empty, error) {
|
func (s *Server) ChangeProjectGrantMember(ctx context.Context, in *ProjectGrantMemberChange) (*ProjectGrantMember, error) {
|
||||||
return nil, errors.ThrowUnimplemented(nil, "GRPC-asd3c", "Not implemented")
|
member, err := s.project.ChangeProjectGrantMember(ctx, projectGrantMemberChangeToModel(in))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return projectGrantMemberFromModel(member), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) RemoveProjectGrantMember(ctx context.Context, in *ProjectGrantMemberRemove) (*empty.Empty, error) {
|
func (s *Server) RemoveProjectGrantMember(ctx context.Context, in *ProjectGrantMemberRemove) (*empty.Empty, error) {
|
||||||
return nil, errors.ThrowUnimplemented(nil, "GRPC-04kfs", "Not implemented")
|
err := s.project.RemoveProjectGrantMember(ctx, in.ProjectId, in.GrantId, in.UserId)
|
||||||
|
return &empty.Empty{}, err
|
||||||
}
|
}
|
||||||
|
46
pkg/management/api/grpc/project_grant_member_converter.go
Normal file
46
pkg/management/api/grpc/project_grant_member_converter.go
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
package grpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/caos/logging"
|
||||||
|
"github.com/caos/zitadel/internal/eventstore/models"
|
||||||
|
proj_model "github.com/caos/zitadel/internal/project/model"
|
||||||
|
"github.com/golang/protobuf/ptypes"
|
||||||
|
)
|
||||||
|
|
||||||
|
func projectGrantMemberFromModel(member *proj_model.ProjectGrantMember) *ProjectGrantMember {
|
||||||
|
creationDate, err := ptypes.TimestampProto(member.CreationDate)
|
||||||
|
logging.Log("GRPC-7du3s").OnError(err).Debug("unable to parse timestamp")
|
||||||
|
|
||||||
|
changeDate, err := ptypes.TimestampProto(member.ChangeDate)
|
||||||
|
logging.Log("GRPC-8duew").OnError(err).Debug("unable to parse timestamp")
|
||||||
|
|
||||||
|
return &ProjectGrantMember{
|
||||||
|
CreationDate: creationDate,
|
||||||
|
ChangeDate: changeDate,
|
||||||
|
Sequence: member.Sequence,
|
||||||
|
UserId: member.UserID,
|
||||||
|
Roles: member.Roles,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func projectGrantMemberAddToModel(member *ProjectGrantMemberAdd) *proj_model.ProjectGrantMember {
|
||||||
|
return &proj_model.ProjectGrantMember{
|
||||||
|
ObjectRoot: models.ObjectRoot{
|
||||||
|
AggregateID: member.ProjectId,
|
||||||
|
},
|
||||||
|
GrantID: member.GrantId,
|
||||||
|
UserID: member.UserId,
|
||||||
|
Roles: member.Roles,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func projectGrantMemberChangeToModel(member *ProjectGrantMemberChange) *proj_model.ProjectGrantMember {
|
||||||
|
return &proj_model.ProjectGrantMember{
|
||||||
|
ObjectRoot: models.ObjectRoot{
|
||||||
|
AggregateID: member.ProjectId,
|
||||||
|
},
|
||||||
|
GrantID: member.GrantId,
|
||||||
|
UserID: member.UserId,
|
||||||
|
Roles: member.Roles,
|
||||||
|
}
|
||||||
|
}
|
@ -931,6 +931,15 @@ service ManagementService {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rpc RemoveProjectGrant(ProjectGrantID) returns (google.protobuf.Empty) {
|
||||||
|
option (google.api.http) = {
|
||||||
|
delete: "/projects/{project_id}/grants/{id}"
|
||||||
|
};
|
||||||
|
|
||||||
|
option (caos.zitadel.utils.v1.auth_option) = {
|
||||||
|
permission: "project.grant.delete"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
//PROJECT_GRANT_MEMBER
|
//PROJECT_GRANT_MEMBER
|
||||||
rpc GetProjectGrantMemberRoles(google.protobuf.Empty) returns (ProjectGrantMemberRoles) {
|
rpc GetProjectGrantMemberRoles(google.protobuf.Empty) returns (ProjectGrantMemberRoles) {
|
||||||
@ -953,7 +962,7 @@ service ManagementService {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
rpc AddProjectGrantMember(ProjectGrantMemberAdd) returns (google.protobuf.Empty) {
|
rpc AddProjectGrantMember(ProjectGrantMemberAdd) returns (ProjectGrantMember) {
|
||||||
option (google.api.http) = {
|
option (google.api.http) = {
|
||||||
post: "/projects/{project_id}/grants/{grant_id}/members"
|
post: "/projects/{project_id}/grants/{grant_id}/members"
|
||||||
body: "*"
|
body: "*"
|
||||||
@ -964,7 +973,7 @@ service ManagementService {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
rpc ChangeProjectGrantMember(ProjectGrantMemberChange) returns (google.protobuf.Empty) {
|
rpc ChangeProjectGrantMember(ProjectGrantMemberChange) returns (ProjectGrantMember) {
|
||||||
option (google.api.http) = {
|
option (google.api.http) = {
|
||||||
put: "/projects/{project_id}/grants/{grant_id}/members/{user_id}"
|
put: "/projects/{project_id}/grants/{grant_id}/members/{user_id}"
|
||||||
body: "*"
|
body: "*"
|
||||||
@ -1946,7 +1955,7 @@ message ProjectGrant {
|
|||||||
string granted_org_id = 3;
|
string granted_org_id = 3;
|
||||||
string granted_org_name = 4;
|
string granted_org_name = 4;
|
||||||
string granted_org_domain = 5;
|
string granted_org_domain = 5;
|
||||||
repeated string role_names = 6;
|
repeated string role_keys = 6;
|
||||||
ProjectGrantState state = 7;
|
ProjectGrantState state = 7;
|
||||||
google.protobuf.Timestamp creation_date = 8;
|
google.protobuf.Timestamp creation_date = 8;
|
||||||
google.protobuf.Timestamp change_date = 9;
|
google.protobuf.Timestamp change_date = 9;
|
||||||
@ -1957,13 +1966,13 @@ message ProjectGrant {
|
|||||||
message ProjectGrantCreate {
|
message ProjectGrantCreate {
|
||||||
string project_id = 1;
|
string project_id = 1;
|
||||||
string granted_org_id = 2;
|
string granted_org_id = 2;
|
||||||
repeated string role_names = 3;
|
repeated string role_keys = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
message ProjectGrantUpdate {
|
message ProjectGrantUpdate {
|
||||||
string project_id = 1;
|
string project_id = 1;
|
||||||
string id = 2;
|
string id = 2;
|
||||||
repeated string role_names = 3;
|
repeated string role_keys = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
message ProjectGrantID {
|
message ProjectGrantID {
|
||||||
@ -2064,7 +2073,7 @@ message UserGrant {
|
|||||||
string user_id = 2;
|
string user_id = 2;
|
||||||
string org_id = 3;
|
string org_id = 3;
|
||||||
string project_id = 4;
|
string project_id = 4;
|
||||||
repeated string role_names = 5;
|
repeated string role_keys = 5;
|
||||||
UserGrantState state = 6;
|
UserGrantState state = 6;
|
||||||
google.protobuf.Timestamp creation_date = 7;
|
google.protobuf.Timestamp creation_date = 7;
|
||||||
google.protobuf.Timestamp change_date = 8;
|
google.protobuf.Timestamp change_date = 8;
|
||||||
@ -2082,13 +2091,13 @@ message UserGrantCreate {
|
|||||||
string user_id = 1;
|
string user_id = 1;
|
||||||
string org_id = 2;
|
string org_id = 2;
|
||||||
string project_id = 3;
|
string project_id = 3;
|
||||||
repeated string role_names = 4;
|
repeated string role_keys = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
message UserGrantUpdate {
|
message UserGrantUpdate {
|
||||||
string user_id = 1;
|
string user_id = 1;
|
||||||
string id = 2;
|
string id = 2;
|
||||||
repeated string role_names = 3;
|
repeated string role_keys = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
message UserGrantID {
|
message UserGrantID {
|
||||||
@ -2106,7 +2115,7 @@ message ProjectUserGrantUpdate {
|
|||||||
string project_id = 1;
|
string project_id = 1;
|
||||||
string user_id = 2;
|
string user_id = 2;
|
||||||
string id = 3;
|
string id = 3;
|
||||||
repeated string role_names = 4;
|
repeated string role_keys = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
message ProjectGrantUserGrantID {
|
message ProjectGrantUserGrantID {
|
||||||
@ -2120,14 +2129,14 @@ message ProjectGrantUserGrantCreate {
|
|||||||
string org_id = 2;
|
string org_id = 2;
|
||||||
string project_grant_id = 3;
|
string project_grant_id = 3;
|
||||||
string project_id = 4 [(validate.rules).string.min_len = 1];
|
string project_id = 4 [(validate.rules).string.min_len = 1];
|
||||||
repeated string role_names = 5;
|
repeated string role_keys = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
message ProjectGrantUserGrantUpdate {
|
message ProjectGrantUserGrantUpdate {
|
||||||
string project_grant_id = 1;
|
string project_grant_id = 1;
|
||||||
string user_id = 2;
|
string user_id = 2;
|
||||||
string id = 3;
|
string id = 3;
|
||||||
repeated string role_names = 4;
|
repeated string role_keys = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum UserGrantState {
|
enum UserGrantState {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user