Skip to content

Commit

Permalink
fix: User checks (#139)
Browse files Browse the repository at this point in the history
* check uniqueness on create and register user

* change user email, reserve release unique email

* usergrant unique aggregate

* usergrant uniqueness

* validate UserGrant

* fix tests
  • Loading branch information
hifabienne committed May 28, 2020
1 parent 71626f2 commit d447f68
Show file tree
Hide file tree
Showing 19 changed files with 447 additions and 123 deletions.
4 changes: 2 additions & 2 deletions internal/admin/repository/eventsourcing/eventstore/org.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,12 @@ func (repo *OrgRepo) SetUpOrg(ctx context.Context, setUp *admin_model.SetupOrg)
return nil, err
}

user, userAggregate, err := repo.UserEventstore.PrepareCreateUser(ctx, setUp.User, org.AggregateID)
user, userAggregates, err := repo.UserEventstore.PrepareCreateUser(ctx, setUp.User, org.AggregateID)
if err != nil {
return nil, err
}

aggregates = append(aggregates, userAggregate)
aggregates = append(aggregates, userAggregates...)
setupModel := &Setup{Org: org, User: user}

member := org_model.NewOrgMemberWithRoles(org.AggregateID, user.AggregateID, "ORG_ADMIN") //TODO: role as const
Expand Down
2 changes: 1 addition & 1 deletion internal/auth/repository/eventsourcing/handler/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ func (p *User) Process(event *models.Event) (err error) {
return err
}
err = user.AppendEvent(event)
case es_model.UserDeleted:
case es_model.UserRemoved:
err = p.view.DeleteUser(event.AggregateID, event.Sequence)
default:
return p.view.ProcessedUserSequence(event.Sequence)
Expand Down
1 change: 0 additions & 1 deletion internal/eventstore/eventstore.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ func (es *eventstore) PushAggregates(ctx context.Context, aggregates ...*models.
if err != nil {
return err
}

return nil
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ func (p *User) Process(event *models.Event) (err error) {
return err
}
err = user.AppendEvent(event)
case es_model.UserDeleted:
case es_model.UserRemoved:
err = p.view.DeleteUser(event.AggregateID, event.Sequence)
default:
return p.view.ProcessedUserSequence(event.Sequence)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ func (p *NotifyUser) Process(event *models.Event) (err error) {
return err
}
err = user.AppendEvent(event)
case es_model.UserDeleted:
case es_model.UserRemoved:
err = p.view.DeleteNotifyUser(event.AggregateID, event.Sequence)
default:
return p.view.ProcessedNotifyUserSequence(event.Sequence)
Expand Down
1 change: 1 addition & 0 deletions internal/org/model/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ const (
OrgChanged models.EventType = "org.changed"
OrgDeactivated models.EventType = "org.deactivated"
OrgReactivated models.EventType = "org.reactivated"
OrgRemoved models.EventType = "org.removed"

OrgNameReserved models.EventType = "org.name.reserved"
OrgNameReleased models.EventType = "org.name.released"
Expand Down
2 changes: 1 addition & 1 deletion internal/org/repository/eventsourcing/org_member.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ func orgMemberAddedAggregate(ctx context.Context, aggCreator *es_models.Aggregat
}

validationQuery := es_models.NewSearchQuery().
AggregateTypeFilter("org", "user").
AggregateTypeFilter(org_model.OrgAggregate, usr_model.UserAggregate).
AggregateIDsFilter(member.AggregateID, member.UserID)

validation := addMemberValidation(aggregate, member)
Expand Down
1 change: 1 addition & 0 deletions internal/project/model/project.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ type ProjectState int32
const (
PROJECTSTATE_ACTIVE ProjectState = iota
PROJECTSTATE_INACTIVE
PROJECTSTATE_REMOVED
)

func NewProject(id string) *Project {
Expand Down
7 changes: 7 additions & 0 deletions internal/project/repository/eventsourcing/model/project.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ func (p *Project) AppendEvent(event *es_models.Event) error {
return p.appendDeactivatedEvent()
case ProjectReactivated:
return p.appendReactivatedEvent()
case ProjectRemoved:
return p.appendRemovedEvent()
case ProjectMemberAdded:
return p.appendAddMemberEvent(event)
case ProjectMemberChanged:
Expand Down Expand Up @@ -150,6 +152,11 @@ func (p *Project) appendReactivatedEvent() error {
return nil
}

func (p *Project) appendRemovedEvent() error {
p.State = int32(model.PROJECTSTATE_REMOVED)
return nil
}

func (p *Project) setData(event *es_models.Event) error {
if err := json.Unmarshal(event.Data, p); err != nil {
logging.Log("EVEN-lo9sr").WithError(err).Error("could not unmarshal event data")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,15 @@ func GetProjectGrant(grants []*ProjectGrant, id string) (int, *ProjectGrant) {
return -1, nil
}

func GetProjectGrantByResourceOwner(grants []*ProjectGrant, resourceOwner string) (int, *ProjectGrant) {
for i, g := range grants {
if g.ResourceOwner == resourceOwner {
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
Expand Down
1 change: 1 addition & 0 deletions internal/project/repository/eventsourcing/model/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ const (
ProjectChanged models.EventType = "project.changed"
ProjectDeactivated models.EventType = "project.deactivated"
ProjectReactivated models.EventType = "project.reactivated"
ProjectRemoved models.EventType = "project.removed"

ProjectMemberAdded models.EventType = "project.member.added"
ProjectMemberChanged models.EventType = "project.member.changed"
Expand Down
29 changes: 15 additions & 14 deletions internal/user/repository/eventsourcing/eventstore.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,12 +90,11 @@ func (es *UserEventstore) UserByID(ctx context.Context, id string) (*usr_model.U
return model.UserToModel(user), nil
}

func (es *UserEventstore) PrepareCreateUser(ctx context.Context, user *usr_model.User, resourceOwner string) (*model.User, *es_models.Aggregate, error) {
func (es *UserEventstore) PrepareCreateUser(ctx context.Context, user *usr_model.User, resourceOwner string) (*model.User, []*es_models.Aggregate, error) {
user.SetEmailAsUsername()
if !user.IsValid() {
return nil, nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-9dk45", "User is invalid")
}
//TODO: Check Uniqueness
id, err := es.idGenerator.NextID()
if err != nil {
return nil, nil, err
Expand All @@ -119,18 +118,18 @@ func (es *UserEventstore) PrepareCreateUser(ctx context.Context, user *usr_model
repoInitCode := model.InitCodeFromModel(user.InitCode)
repoPhoneCode := model.PhoneCodeFromModel(user.PhoneCode)

createAggregate, err := UserCreateAggregate(ctx, es.AggregateCreator(), repoUser, repoInitCode, repoPhoneCode, resourceOwner)
createAggregates, err := UserCreateAggregate(ctx, es.AggregateCreator(), repoUser, repoInitCode, repoPhoneCode, resourceOwner)

return repoUser, createAggregate, err
return repoUser, createAggregates, err
}

func (es *UserEventstore) CreateUser(ctx context.Context, user *usr_model.User) (*usr_model.User, error) {
repoUser, aggregate, err := es.PrepareCreateUser(ctx, user, "")
repoUser, aggregates, err := es.PrepareCreateUser(ctx, user, "")
if err != nil {
return nil, err
}

err = es_sdk.PushAggregates(ctx, es.PushAggregates, repoUser.AppendEvents, aggregate)
err = es_sdk.PushAggregates(ctx, es.PushAggregates, repoUser.AppendEvents, aggregates...)
if err != nil {
return nil, err
}
Expand All @@ -139,12 +138,11 @@ func (es *UserEventstore) CreateUser(ctx context.Context, user *usr_model.User)
return model.UserToModel(repoUser), nil
}

func (es *UserEventstore) PrepareRegisterUser(ctx context.Context, user *usr_model.User, resourceOwner string) (*model.User, *es_models.Aggregate, error) {
func (es *UserEventstore) PrepareRegisterUser(ctx context.Context, user *usr_model.User, resourceOwner string) (*model.User, []*es_models.Aggregate, error) {
user.SetEmailAsUsername()
if !user.IsValid() || user.Password == nil || user.SecretString == "" {
return nil, nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-9dk45", "user is invalid")
}
//TODO: Check Uniqueness
id, err := es.idGenerator.NextID()
if err != nil {
return nil, nil, err
Expand All @@ -163,17 +161,17 @@ func (es *UserEventstore) PrepareRegisterUser(ctx context.Context, user *usr_mod
repoUser := model.UserFromModel(user)
repoEmailCode := model.EmailCodeFromModel(user.EmailCode)

aggregate, err := UserRegisterAggregate(ctx, es.AggregateCreator(), repoUser, resourceOwner, repoEmailCode)
return repoUser, aggregate, err
aggregates, err := UserRegisterAggregate(ctx, es.AggregateCreator(), repoUser, resourceOwner, repoEmailCode)
return repoUser, aggregates, err
}

func (es *UserEventstore) RegisterUser(ctx context.Context, user *usr_model.User, resourceOwner string) (*usr_model.User, error) {
repoUser, createAggregate, err := es.PrepareRegisterUser(ctx, user, resourceOwner)
repoUser, createAggregates, err := es.PrepareRegisterUser(ctx, user, resourceOwner)
if err != nil {
return nil, err
}

err = es_sdk.PushAggregates(ctx, es.PushAggregates, repoUser.AppendEvents, createAggregate)
err = es_sdk.PushAggregates(ctx, es.PushAggregates, repoUser.AppendEvents, createAggregates...)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -550,8 +548,11 @@ func (es *UserEventstore) ChangeEmail(ctx context.Context, email *usr_model.Emai
repoNew := model.EmailFromModel(email)
repoEmailCode := model.EmailCodeFromModel(emailCode)

updateAggregate := EmailChangeAggregate(es.AggregateCreator(), repoExisting, repoNew, repoEmailCode)
err = es_sdk.Push(ctx, es.PushAggregates, repoExisting.AppendEvents, updateAggregate)
updateAggregates, err := EmailChangeAggregate(ctx, es.AggregateCreator(), repoExisting, repoNew, repoEmailCode)
if err != nil {
return nil, err
}
err = es_sdk.PushAggregates(ctx, es.PushAggregates, repoExisting.AppendEvents, updateAggregates...)
if err != nil {
return nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion internal/user/repository/eventsourcing/model/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const (
UserUnlocked models.EventType = "user.unlocked"
UserDeactivated models.EventType = "user.deactivated"
UserReactivated models.EventType = "user.reactivated"
UserDeleted models.EventType = "user.deleted"
UserRemoved models.EventType = "user.removed"

UserPasswordChanged models.EventType = "user.password.changed"
UserPasswordCodeAdded models.EventType = "user.password.code.added"
Expand Down

0 comments on commit d447f68

Please sign in to comment.