mirror of
https://github.com/zitadel/zitadel.git
synced 2025-02-28 20:47:22 +00:00
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 <silvan.reusser@gmail.com> Co-authored-by: Max Peintner <max@caos.ch>
This commit is contained in:
parent
fc08229679
commit
cf727b7fff
@ -12,14 +12,14 @@ import { InfoSectionType } from '../info-section/info-section.component';
|
|||||||
})
|
})
|
||||||
export class EditTextComponent implements OnInit, OnDestroy {
|
export class EditTextComponent implements OnInit, OnDestroy {
|
||||||
@Input() label: string = '';
|
@Input() label: string = '';
|
||||||
@Input() current$!: Observable<{ [key: string]: any | string; }>;
|
@Input() current$!: Observable<{ [key: string]: any | string }>;
|
||||||
@Input() default$!: Observable<{ [key: string]: any | string; }>;
|
@Input() default$!: Observable<{ [key: string]: any | string }>;
|
||||||
@Input() currentlyDragged: string = '';
|
@Input() currentlyDragged: string = '';
|
||||||
@Output() changedValues: EventEmitter<{ [key: string]: string; }> = new EventEmitter();
|
@Output() changedValues: EventEmitter<{ [key: string]: string }> = new EventEmitter();
|
||||||
public currentMap: { [key: string]: string; } = {};
|
public currentMap: { [key: string]: string } = {};
|
||||||
private destroy$: Subject<void> = new Subject();
|
private destroy$: Subject<void> = new Subject();
|
||||||
public form!: FormGroup;
|
public form!: FormGroup;
|
||||||
public warnText: { [key: string]: string | undefined; } = {};
|
public warnText: { [key: string]: string | undefined } = {};
|
||||||
|
|
||||||
@Input() public chips: any[] = [];
|
@Input() public chips: any[] = [];
|
||||||
@Input() public disabled: boolean = true;
|
@Input() public disabled: boolean = true;
|
||||||
@ -28,17 +28,18 @@ export class EditTextComponent implements OnInit, OnDestroy {
|
|||||||
public InfoSectionType: any = InfoSectionType;
|
public InfoSectionType: any = InfoSectionType;
|
||||||
|
|
||||||
public ngOnInit(): void {
|
public ngOnInit(): void {
|
||||||
this.current$.pipe(takeUntil(this.destroy$)).subscribe(value => {
|
this.current$.pipe(takeUntil(this.destroy$)).subscribe((value) => {
|
||||||
this.currentMap = value;
|
this.currentMap = value;
|
||||||
this.form = new FormGroup({});
|
this.form = new FormGroup({});
|
||||||
Object.keys(value).map(key => {
|
Object.keys(value).map((key) => {
|
||||||
const control = new FormControl({ value: value[key], disabled: this.disabled });
|
if (key !== 'isDefault') {
|
||||||
this.form.addControl(key, control);
|
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 {
|
public ngOnDestroy(): void {
|
||||||
|
@ -233,7 +233,7 @@ Changes the username
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
GET: /users/{user_id}/username
|
PUT: /users/{user_id}/username
|
||||||
|
|
||||||
|
|
||||||
### SetUserMetadata
|
### SetUserMetadata
|
||||||
|
@ -343,6 +343,7 @@ title: zitadel/text.proto
|
|||||||
| text | string | - | |
|
| text | string | - | |
|
||||||
| button_text | string | - | |
|
| button_text | string | - | |
|
||||||
| footer_text | string | - | |
|
| footer_text | string | - | |
|
||||||
|
| is_default | bool | - | |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -22,24 +22,7 @@ func ModelCustomMessageTextToPb(msg *query.MessageText) *text_pb.MessageCustomTe
|
|||||||
msg.ChangeDate,
|
msg.ChangeDate,
|
||||||
msg.AggregateID,
|
msg.AggregateID,
|
||||||
),
|
),
|
||||||
}
|
IsDefault: msg.AggregateID == domain.IAMID,
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package handler
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"runtime/debug"
|
||||||
"sort"
|
"sort"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
@ -106,7 +107,7 @@ func (h *ProjectionHandler) Process(
|
|||||||
//handle panic
|
//handle panic
|
||||||
defer func() {
|
defer func() {
|
||||||
cause := recover()
|
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)
|
execBulk := h.prepareExecuteBulk(query, reduce, update)
|
||||||
|
@ -161,12 +161,24 @@ func (q *Queries) DefaultMessageTextByTypeAndLanguageFromFileSystem(messageType,
|
|||||||
func (q *Queries) CustomMessageTextByTypeAndLanguage(ctx context.Context, aggregateID, messageType, language string) (*MessageText, error) {
|
func (q *Queries) CustomMessageTextByTypeAndLanguage(ctx context.Context, aggregateID, messageType, language string) (*MessageText, error) {
|
||||||
stmt, scan := prepareMessageTextQuery()
|
stmt, scan := prepareMessageTextQuery()
|
||||||
query, args, err := stmt.Where(
|
query, args, err := stmt.Where(
|
||||||
sq.Eq{
|
sq.And{
|
||||||
MessageTextColAggregateID.identifier(): aggregateID,
|
sq.Eq{
|
||||||
MessageTextColType.identifier(): messageType,
|
MessageTextColLanguage.identifier(): language,
|
||||||
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()
|
Limit(1).ToSql()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.ThrowInternal(err, "QUERY-1b9mf", "Errors.Query.SQLStatement")
|
return nil, errors.ThrowInternal(err, "QUERY-1b9mf", "Errors.Query.SQLStatement")
|
||||||
|
@ -147,7 +147,7 @@ func (p *MessageTextProjection) reduceRemoved(event eventstore.EventReader) (*ha
|
|||||||
return nil, errors.ThrowInvalidArgument(nil, "PROJE-fm0ge", "reduce.wrong.event.type")
|
return nil, errors.ThrowInvalidArgument(nil, "PROJE-fm0ge", "reduce.wrong.event.type")
|
||||||
}
|
}
|
||||||
if !isMessageTemplate(templateEvent.Template) {
|
if !isMessageTemplate(templateEvent.Template) {
|
||||||
return nil, nil
|
return crdb.NewNoOpStatement(event), nil
|
||||||
}
|
}
|
||||||
cols := []handler.Column{
|
cols := []handler.Column{
|
||||||
handler.NewCol(MessageTextChangeDateCol, templateEvent.CreationDate()),
|
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) {
|
func (p *MessageTextProjection) reduceTemplateRemoved(event eventstore.EventReader) (*handler.Statement, error) {
|
||||||
templateEvent, ok := event.(*org.CustomTextTemplateRemovedEvent)
|
var templateEvent policy.CustomTextTemplateRemovedEvent
|
||||||
if !ok {
|
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")
|
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")
|
return nil, errors.ThrowInvalidArgument(nil, "PROJE-2n9rs", "reduce.wrong.event.type")
|
||||||
}
|
}
|
||||||
if !isMessageTemplate(templateEvent.Template) {
|
if !isMessageTemplate(templateEvent.Template) {
|
||||||
return nil, nil
|
return crdb.NewNoOpStatement(event), nil
|
||||||
}
|
}
|
||||||
return crdb.NewDeleteStatement(
|
return crdb.NewDeleteStatement(
|
||||||
templateEvent,
|
event,
|
||||||
[]handler.Condition{
|
[]handler.Condition{
|
||||||
handler.NewCond(MessageTextAggregateIDCol, templateEvent.Aggregate().ID),
|
handler.NewCond(MessageTextAggregateIDCol, templateEvent.Aggregate().ID),
|
||||||
handler.NewCond(MessageTextTypeCol, templateEvent.Template),
|
handler.NewCond(MessageTextTypeCol, templateEvent.Template),
|
||||||
|
@ -45,6 +45,7 @@ message MessageCustomText {
|
|||||||
description: "custom text for email footer_text"
|
description: "custom text for email footer_text"
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
bool is_default = 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
message LoginCustomText {
|
message LoginCustomText {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user