zitadel/internal/query/projection/member.go
Silvan d2ea9a1b8c
feat: member queries (#2796)
* refactor(domain): add user type

* fix(projections): start with login names

* fix(login_policy): correct handling of user domain claimed event

* fix(projections): add members

* refactor: simplify member projections

* add migration for members

* add metadata to member projections

* refactor: login name projection

* fix: set correct suffixes on login name projections

* test(projections): login name reduces

* fix: correct cols in reduce member

* test(projections): org, iam, project members

* member additional cols and conds as opt,
add project grant members

* fix(migration): members

* fix(migration): correct database name

* migration version

* migs

* better naming for member cond and col

* split project and project grant members

* prepare member columns

* feat(queries): membership query

* test(queries): membership prepare

* fix(queries): multiple projections for latest sequence

* fix(api): use query for membership queries in auth and management

* feat: org member queries

* fix(api): use query for iam member calls

* fix(queries): org members

* fix(queries): project members

* fix(queries): project grant members

* fix(query): member queries and user avatar column

* member cols

* fix(queries): membership stmt

* fix user test

* fix user test

* fix(membership): correct display name

* fix(projection): additional member manipulation events

* additional member tests

* fix(projections): additional events of idp links

* fix: use query for memberships (#2797)

* fix(api): use query for memberships

* remove comment

* handle err

* refactor(projections): idp user link user aggregate type

* fix(projections): handle old user events

* fix(api): add asset prefix

* no image for iam members
2021-12-16 13:25:38 +00:00

100 lines
2.8 KiB
Go

package projection
import (
"github.com/caos/zitadel/internal/eventstore"
"github.com/caos/zitadel/internal/eventstore/handler"
"github.com/caos/zitadel/internal/eventstore/handler/crdb"
"github.com/caos/zitadel/internal/repository/member"
"github.com/lib/pq"
)
const (
MemberUserIDCol = "user_id"
MemberRolesCol = "roles"
MemberCreationDate = "creation_date"
MemberChangeDate = "change_date"
MemberSequence = "sequence"
MemberResourceOwner = "resource_owner"
)
type reduceMemberConfig struct {
cols []handler.Column
conds []handler.Condition
}
type reduceMemberOpt func(reduceMemberConfig) reduceMemberConfig
func withMemberCol(col string, value interface{}) reduceMemberOpt {
return func(opt reduceMemberConfig) reduceMemberConfig {
opt.cols = append(opt.cols, handler.NewCol(col, value))
return opt
}
}
func withMemberCond(cond string, value interface{}) reduceMemberOpt {
return func(opt reduceMemberConfig) reduceMemberConfig {
opt.conds = append(opt.conds, handler.NewCond(cond, value))
return opt
}
}
func reduceMemberAdded(e member.MemberAddedEvent, opts ...reduceMemberOpt) (*handler.Statement, error) {
config := reduceMemberConfig{
cols: []handler.Column{
handler.NewCol(MemberUserIDCol, e.UserID),
handler.NewCol(MemberRolesCol, pq.StringArray(e.Roles)),
handler.NewCol(MemberCreationDate, e.CreationDate()),
handler.NewCol(MemberChangeDate, e.CreationDate()),
handler.NewCol(MemberSequence, e.Sequence()),
handler.NewCol(MemberResourceOwner, e.Aggregate().ResourceOwner),
}}
for _, opt := range opts {
config = opt(config)
}
return crdb.NewCreateStatement(&e, config.cols), nil
}
func reduceMemberChanged(e member.MemberChangedEvent, opts ...reduceMemberOpt) (*handler.Statement, error) {
config := reduceMemberConfig{
cols: []handler.Column{
handler.NewCol(MemberRolesCol, pq.StringArray(e.Roles)),
handler.NewCol(MemberChangeDate, e.CreationDate()),
handler.NewCol(MemberSequence, e.Sequence()),
},
conds: []handler.Condition{
handler.NewCond(MemberUserIDCol, e.UserID),
}}
for _, opt := range opts {
config = opt(config)
}
return crdb.NewUpdateStatement(&e, config.cols, config.conds), nil
}
func reduceMemberCascadeRemoved(e member.MemberCascadeRemovedEvent, opts ...reduceMemberOpt) (*handler.Statement, error) {
config := reduceMemberConfig{
conds: []handler.Condition{
handler.NewCond(MemberUserIDCol, e.UserID),
}}
for _, opt := range opts {
config = opt(config)
}
return crdb.NewDeleteStatement(&e, config.conds), nil
}
func reduceMemberRemoved(e eventstore.EventReader, opts ...reduceMemberOpt) (*handler.Statement, error) {
config := reduceMemberConfig{
conds: []handler.Condition{},
}
for _, opt := range opts {
config = opt(config)
}
return crdb.NewDeleteStatement(e, config.conds), nil
}