From cf727b7fff7a7853e3ca217caeeaa61b14b8792a Mon Sep 17 00:00:00 2001 From: Fabi <38692350+fgerschwiler@users.noreply.github.com> Date: Tue, 21 Dec 2021 15:18:05 +0100 Subject: [PATCH] fix: Custom texts (#2875) * feat: delete org * fix: return is default on custom message text * fix(projeciton): print stack trace on recover panic * chore: print panic line * fix: custom message text retunr nil, nil * fix: custom message text template * fix: remove isDefault from selection (#2876) * fix: custom message text query Co-authored-by: adlerhurst Co-authored-by: Max Peintner --- .../modules/edit-text/edit-text.component.ts | 23 ++++++++++--------- docs/docs/apis/proto/management.md | 2 +- docs/docs/apis/proto/text.md | 1 + internal/api/grpc/text/custom_text.go | 19 +-------------- .../eventstore/handler/handler_projection.go | 3 ++- internal/query/message_text.go | 20 ++++++++++++---- internal/query/projection/message_texts.go | 15 ++++++++---- proto/zitadel/text.proto | 1 + 8 files changed, 44 insertions(+), 40 deletions(-) diff --git a/console/src/app/modules/edit-text/edit-text.component.ts b/console/src/app/modules/edit-text/edit-text.component.ts index 623581ee7b..1de32cf156 100644 --- a/console/src/app/modules/edit-text/edit-text.component.ts +++ b/console/src/app/modules/edit-text/edit-text.component.ts @@ -12,14 +12,14 @@ import { InfoSectionType } from '../info-section/info-section.component'; }) export class EditTextComponent implements OnInit, OnDestroy { @Input() label: string = ''; - @Input() current$!: Observable<{ [key: string]: any | string; }>; - @Input() default$!: Observable<{ [key: string]: any | string; }>; + @Input() current$!: Observable<{ [key: string]: any | string }>; + @Input() default$!: Observable<{ [key: string]: any | string }>; @Input() currentlyDragged: string = ''; - @Output() changedValues: EventEmitter<{ [key: string]: string; }> = new EventEmitter(); - public currentMap: { [key: string]: string; } = {}; + @Output() changedValues: EventEmitter<{ [key: string]: string }> = new EventEmitter(); + public currentMap: { [key: string]: string } = {}; private destroy$: Subject = new Subject(); public form!: FormGroup; - public warnText: { [key: string]: string | undefined; } = {}; + public warnText: { [key: string]: string | undefined } = {}; @Input() public chips: any[] = []; @Input() public disabled: boolean = true; @@ -28,17 +28,18 @@ export class EditTextComponent implements OnInit, OnDestroy { public InfoSectionType: any = InfoSectionType; public ngOnInit(): void { - this.current$.pipe(takeUntil(this.destroy$)).subscribe(value => { + this.current$.pipe(takeUntil(this.destroy$)).subscribe((value) => { this.currentMap = value; this.form = new FormGroup({}); - Object.keys(value).map(key => { - const control = new FormControl({ value: value[key], disabled: this.disabled }); - this.form.addControl(key, control); + Object.keys(value).map((key) => { + if (key !== 'isDefault') { + const control = new FormControl({ value: value[key], disabled: this.disabled }); + this.form.addControl(key, control); + } }); - this.form.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(values => this.changedValues.emit(values)); + this.form.valueChanges.pipe(takeUntil(this.destroy$)).subscribe((values) => this.changedValues.emit(values)); }); - } public ngOnDestroy(): void { diff --git a/docs/docs/apis/proto/management.md b/docs/docs/apis/proto/management.md index 7ff2c66fab..a916e49a2d 100644 --- a/docs/docs/apis/proto/management.md +++ b/docs/docs/apis/proto/management.md @@ -233,7 +233,7 @@ Changes the username - GET: /users/{user_id}/username + PUT: /users/{user_id}/username ### SetUserMetadata diff --git a/docs/docs/apis/proto/text.md b/docs/docs/apis/proto/text.md index 438ac6b369..b5a9012cf8 100644 --- a/docs/docs/apis/proto/text.md +++ b/docs/docs/apis/proto/text.md @@ -343,6 +343,7 @@ title: zitadel/text.proto | text | string | - | | | button_text | string | - | | | footer_text | string | - | | +| is_default | bool | - | | diff --git a/internal/api/grpc/text/custom_text.go b/internal/api/grpc/text/custom_text.go index 523a30fd56..917cbb193e 100644 --- a/internal/api/grpc/text/custom_text.go +++ b/internal/api/grpc/text/custom_text.go @@ -22,24 +22,7 @@ func ModelCustomMessageTextToPb(msg *query.MessageText) *text_pb.MessageCustomTe msg.ChangeDate, msg.AggregateID, ), - } -} - -func DomainCustomMsgTextToPb(msg *domain.CustomMessageText) *text_pb.MessageCustomText { - return &text_pb.MessageCustomText{ - Title: msg.Title, - PreHeader: msg.PreHeader, - Subject: msg.Subject, - Greeting: msg.Greeting, - Text: msg.Text, - ButtonText: msg.ButtonText, - FooterText: msg.FooterText, - Details: object.ToViewDetailsPb( - msg.Sequence, - msg.CreationDate, - msg.ChangeDate, - "", //TODO: resourceowner - ), + IsDefault: msg.AggregateID == domain.IAMID, } } diff --git a/internal/eventstore/handler/handler_projection.go b/internal/eventstore/handler/handler_projection.go index f8da244205..ef68444147 100644 --- a/internal/eventstore/handler/handler_projection.go +++ b/internal/eventstore/handler/handler_projection.go @@ -2,6 +2,7 @@ package handler import ( "context" + "runtime/debug" "sort" "sync" "time" @@ -106,7 +107,7 @@ func (h *ProjectionHandler) Process( //handle panic defer func() { cause := recover() - logging.LogWithFields("HANDL-utWkv", "projection", h.ProjectionName, "cause", cause).Error("projection handler paniced") + logging.LogWithFields("HANDL-utWkv", "projection", h.ProjectionName, "cause", cause, "stack", string(debug.Stack())).Error("projection handler paniced") }() execBulk := h.prepareExecuteBulk(query, reduce, update) diff --git a/internal/query/message_text.go b/internal/query/message_text.go index f98bffb22d..44d82258f4 100644 --- a/internal/query/message_text.go +++ b/internal/query/message_text.go @@ -161,12 +161,24 @@ func (q *Queries) DefaultMessageTextByTypeAndLanguageFromFileSystem(messageType, func (q *Queries) CustomMessageTextByTypeAndLanguage(ctx context.Context, aggregateID, messageType, language string) (*MessageText, error) { stmt, scan := prepareMessageTextQuery() query, args, err := stmt.Where( - sq.Eq{ - MessageTextColAggregateID.identifier(): aggregateID, - MessageTextColType.identifier(): messageType, - MessageTextColLanguage.identifier(): language, + sq.And{ + sq.Eq{ + MessageTextColLanguage.identifier(): language, + }, + sq.Eq{ + MessageTextColType.identifier(): messageType, + }, + sq.Or{ + sq.Eq{ + MessageTextColAggregateID.identifier(): aggregateID, + }, + sq.Eq{ + MessageTextColAggregateID.identifier(): domain.IAMID, + }, + }, }, ). + OrderBy(MessageTextColAggregateID.identifier()). Limit(1).ToSql() if err != nil { return nil, errors.ThrowInternal(err, "QUERY-1b9mf", "Errors.Query.SQLStatement") diff --git a/internal/query/projection/message_texts.go b/internal/query/projection/message_texts.go index 53219c3c2e..5b385ff27d 100644 --- a/internal/query/projection/message_texts.go +++ b/internal/query/projection/message_texts.go @@ -147,7 +147,7 @@ func (p *MessageTextProjection) reduceRemoved(event eventstore.EventReader) (*ha return nil, errors.ThrowInvalidArgument(nil, "PROJE-fm0ge", "reduce.wrong.event.type") } if !isMessageTemplate(templateEvent.Template) { - return nil, nil + return crdb.NewNoOpStatement(event), nil } cols := []handler.Column{ handler.NewCol(MessageTextChangeDateCol, templateEvent.CreationDate()), @@ -186,16 +186,21 @@ func (p *MessageTextProjection) reduceRemoved(event eventstore.EventReader) (*ha } func (p *MessageTextProjection) reduceTemplateRemoved(event eventstore.EventReader) (*handler.Statement, error) { - templateEvent, ok := event.(*org.CustomTextTemplateRemovedEvent) - if !ok { + var templateEvent policy.CustomTextTemplateRemovedEvent + switch e := event.(type) { + case *org.CustomTextTemplateRemovedEvent: + templateEvent = e.CustomTextTemplateRemovedEvent + case *iam.CustomTextTemplateRemovedEvent: + templateEvent = e.CustomTextTemplateRemovedEvent + default: logging.LogWithFields("PROJE-m03ng", "seq", event.Sequence(), "expectedType", org.CustomTextTemplateRemovedEventType).Error("wrong event type") return nil, errors.ThrowInvalidArgument(nil, "PROJE-2n9rs", "reduce.wrong.event.type") } if !isMessageTemplate(templateEvent.Template) { - return nil, nil + return crdb.NewNoOpStatement(event), nil } return crdb.NewDeleteStatement( - templateEvent, + event, []handler.Condition{ handler.NewCond(MessageTextAggregateIDCol, templateEvent.Aggregate().ID), handler.NewCond(MessageTextTypeCol, templateEvent.Template), diff --git a/proto/zitadel/text.proto b/proto/zitadel/text.proto index 3c8f3f3058..ed01b6efa0 100644 --- a/proto/zitadel/text.proto +++ b/proto/zitadel/text.proto @@ -45,6 +45,7 @@ message MessageCustomText { description: "custom text for email footer_text" } ]; + bool is_default = 9; } message LoginCustomText {