feat: projections auto create their tables (#3324)

* begin init checks for projections

* first projection checks

* debug notification providers with query fixes

* more projections and first index

* more projections

* more projections

* finish projections

* fix tests (remove db name)

* create tables in setup

* fix logging / error handling

* add tenant to views

* rename tenant to instance_id

* add instance_id to all projections

* add instance_id to all queries

* correct instance_id on projections

* add instance_id to failed_events

* use separate context for instance

* implement features projection

* implement features projection

* remove unique constraint from setup when migration failed

* add error to failed setup event

* add instance_id to primary keys

* fix IAM projection

* remove old migrations folder

* fix keysFromYAML test
This commit is contained in:
Livio Amstutz
2022-03-23 09:02:39 +01:00
committed by GitHub
parent 9e13b70a3d
commit 56b916a2b0
400 changed files with 6508 additions and 8890 deletions

View File

@@ -2,12 +2,14 @@ package model
import (
"encoding/json"
"time"
"github.com/caos/logging"
caos_errs "github.com/caos/zitadel/internal/errors"
"github.com/caos/zitadel/internal/eventstore/v1/models"
"github.com/caos/zitadel/internal/user/model"
es_model "github.com/caos/zitadel/internal/user/repository/eventsourcing/model"
"time"
)
const (
@@ -27,6 +29,7 @@ type ExternalIDPView struct {
ChangeDate time.Time `json:"-" gorm:"column:change_date"`
ResourceOwner string `json:"-" gorm:"column:resource_owner"`
Sequence uint64 `json:"-" gorm:"column:sequence"`
InstanceID string `json:"instanceID" gorm:"column:instance_id"`
}
func ExternalIDPViewFromModel(externalIDP *model.ExternalIDPView) *ExternalIDPView {
@@ -80,6 +83,7 @@ func (i *ExternalIDPView) AppendEvent(event *models.Event) (err error) {
func (r *ExternalIDPView) setRootData(event *models.Event) {
r.UserID = event.AggregateID
r.ResourceOwner = event.ResourceOwner
r.InstanceID = event.InstanceID
}
func (r *ExternalIDPView) SetData(event *models.Event) error {

View File

@@ -42,6 +42,7 @@ type NotifyUser struct {
PasswordSet bool `json:"-" gorm:"column:password_set"`
Sequence uint64 `json:"-" gorm:"column:sequence"`
State int32 `json:"-" gorm:"-"`
InstanceID string `json:"instanceID" gorm:"column:instance_id"`
}
func NotifyUserFromModel(user *model.NotifyUser) *NotifyUser {
@@ -158,6 +159,7 @@ func (u *NotifyUser) AppendEvent(event *models.Event) (err error) {
func (u *NotifyUser) setRootData(event *models.Event) {
u.ID = event.AggregateID
u.ResourceOwner = event.ResourceOwner
u.InstanceID = event.InstanceID
}
func (u *NotifyUser) setData(event *models.Event) error {

View File

@@ -21,6 +21,7 @@ const (
RefreshTokenKeyUserAgentID = "user_agent_id"
RefreshTokenKeyExpiration = "expiration"
RefreshTokenKeyResourceOwner = "resource_owner"
RefreshTokenKeyInstanceID = "instance_id"
)
type RefreshTokenView struct {
@@ -39,6 +40,7 @@ type RefreshTokenView struct {
IdleExpiration time.Time `json:"-" gorm:"column:idle_expiration"`
Expiration time.Time `json:"-" gorm:"column:expiration"`
Sequence uint64 `json:"-" gorm:"column:sequence"`
InstanceID string `json:"instanceID" gorm:"column:instance_id"`
}
func RefreshTokenViewsToModel(tokens []*RefreshTokenView) []*usr_model.RefreshTokenView {
@@ -115,6 +117,7 @@ func (t *RefreshTokenView) AppendEvent(event *es_models.Event) error {
func (t *RefreshTokenView) setRootData(event *es_models.Event) {
t.UserID = event.AggregateID
t.ResourceOwner = event.ResourceOwner
t.InstanceID = event.InstanceID
}
func (t *RefreshTokenView) appendAddedEvent(event *es_models.Event) error {

View File

@@ -63,6 +63,8 @@ func (key RefreshTokenSearchKey) ToColumnName() string {
return RefreshTokenKeyExpiration
case model.RefreshTokenSearchKeyResourceOwner:
return RefreshTokenKeyResourceOwner
case model.RefreshTokenSearchKeyInstanceID:
return RefreshTokenKeyInstanceID
default:
return ""
}

View File

@@ -23,6 +23,7 @@ const (
TokenKeyUserAgentID = "user_agent_id"
TokenKeyExpiration = "expiration"
TokenKeyResourceOwner = "resource_owner"
TokenKeyInstanceID = "instance_id"
)
type TokenView struct {
@@ -41,6 +42,7 @@ type TokenView struct {
RefreshTokenID string `json:"refreshTokenID,omitempty" gorm:"refresh_token_id"`
IsPAT bool `json:"-" gorm:"is_pat"`
Deactivated bool `json:"-" gorm:"-"`
InstanceID string `json:"instanceID" gorm:"column:instance_id"`
}
func TokenViewToModel(token *TokenView) *usr_model.TokenView {
@@ -125,6 +127,7 @@ func (t *TokenView) AppendEvent(event *es_models.Event) error {
func (t *TokenView) setRootData(event *es_models.Event) {
t.UserID = event.AggregateID
t.ResourceOwner = event.ResourceOwner
t.InstanceID = event.InstanceID
}
func (t *TokenView) setData(event *es_models.Event) error {

View File

@@ -65,6 +65,8 @@ func (key TokenSearchKey) ToColumnName() string {
return TokenKeyExpiration
case model.TokenSearchKeyResourceOwner:
return TokenKeyResourceOwner
case model.TokenSearchKeyInstanceID:
return TokenKeyInstanceID
default:
return ""
}

View File

@@ -6,9 +6,10 @@ import (
"time"
"github.com/caos/logging"
"github.com/caos/zitadel/internal/query"
"github.com/lib/pq"
"github.com/caos/zitadel/internal/query"
req_model "github.com/caos/zitadel/internal/auth_request/model"
"github.com/caos/zitadel/internal/domain"
caos_errs "github.com/caos/zitadel/internal/errors"
@@ -32,6 +33,7 @@ const (
UserKeyLoginNames = "login_names"
UserKeyPreferredLoginName = "preferred_login_name"
UserKeyType = "user_type"
UserKeyInstanceID = "instance_id"
)
type userType string
@@ -53,6 +55,7 @@ type UserView struct {
Sequence uint64 `json:"-" gorm:"column:sequence"`
Type userType `json:"-" gorm:"column:user_type"`
UserName string `json:"userName" gorm:"column:user_name"`
InstanceID string `json:"instanceID" gorm:"column:instance_id"`
*MachineView
*HumanView
}
@@ -363,6 +366,7 @@ func (u *UserView) AppendEvent(event *models.Event) (err error) {
func (u *UserView) setRootData(event *models.Event) {
u.ID = event.AggregateID
u.ResourceOwner = event.ResourceOwner
u.InstanceID = event.InstanceID
}
func (u *UserView) setData(event *models.Event) error {

View File

@@ -21,6 +21,7 @@ const (
UserMembershipKeyObjectID = "object_id"
UserMembershipKeyResourceOwner = "resource_owner"
UserMembershipKeyMemberType = "member_type"
UserMembershipKeyInstanceID = "instance_id"
)
type UserMembershipView struct {
@@ -36,6 +37,7 @@ type UserMembershipView struct {
ResourceOwner string `json:"-" gorm:"column:resource_owner"`
ResourceOwnerName string `json:"-" gorm:"column:resource_owner_name"`
Sequence uint64 `json:"-" gorm:"column:sequence"`
InstanceID string `json:"instanceID" gorm:"column:instance_id"`
}
func UserMembershipToModel(membership *UserMembershipView) *model.UserMembershipView {
@@ -105,6 +107,7 @@ func (u *UserMembershipView) setRootData(event *models.Event, memberType model.M
u.ObjectID = event.AggregateID
u.ResourceOwner = event.ResourceOwner
u.MemberType = int32(memberType)
u.InstanceID = event.InstanceID
}
func (u *UserMembershipView) setIamMemberData(event *models.Event) error {

View File

@@ -61,6 +61,9 @@ func (key UserMembershipSearchKey) ToColumnName() string {
return UserMembershipKeyAggregateID
case usr_model.UserMembershipSearchKeyObjectID:
return UserMembershipKeyObjectID
case usr_model.UserMembershipSearchKeyInstanceID:
return UserMembershipKeyInstanceID
default:
return ""
}

View File

@@ -75,6 +75,8 @@ func (key UserSearchKey) ToColumnName() string {
return UserKeyPreferredLoginName
case usr_model.UserSearchKeyType:
return UserKeyType
case usr_model.UserSearchKeyInstanceID:
return UserKeyInstanceID
default:
return ""
}

View File

@@ -41,6 +41,7 @@ type UserSessionView struct {
MultiFactorVerification time.Time `json:"-" gorm:"column:multi_factor_verification"`
MultiFactorVerificationType int32 `json:"-" gorm:"column:multi_factor_verification_type"`
Sequence uint64 `json:"-" gorm:"column:sequence"`
InstanceID string `json:"instanceID" gorm:"column:instance_id"`
}
func UserSessionFromEvent(event *models.Event) (*UserSessionView, error) {