mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-11 19:17:32 +00:00
feat: custom message text (#1801)
* feat: default custom message text * feat: org custom message text * feat: org custom message text * feat: custom messages query side * feat: default messages * feat: message text user fields * feat: check for inactive user * feat: fix send password reset * feat: fix custom org text * feat: add variables to docs * feat: custom text tests * feat: fix notifications * feat: add custom text feature * feat: add custom text feature * feat: feature in custom message texts * feat: add custom text feature in frontend * feat: merge main * feat: feature tests * feat: change phone message in setup * fix: remove unused code, add event translation * fix: merge main and fix problems * fix: english translation file * fix: migration versions * fix: setup * feat: fix pr requests * feat: fix phone code message * feat: migration * feat: setup * fix: remove unused tests Co-authored-by: Livio Amstutz <livio.a@gmail.com>
This commit is contained in:
@@ -35,6 +35,7 @@ type FeaturesSetEvent struct {
|
||||
LabelPolicyPrivateLabel *bool `json:"labelPolicyPrivateLabel,omitempty"`
|
||||
LabelPolicyWatermark *bool `json:"labelPolicyWatermark,omitempty"`
|
||||
CustomDomain *bool `json:"customDomain,omitempty"`
|
||||
CustomText *bool `json:"customText,omitempty"`
|
||||
}
|
||||
|
||||
func (e *FeaturesSetEvent) Data() interface{} {
|
||||
@@ -153,6 +154,11 @@ func ChangeCustomDomain(customDomain bool) func(event *FeaturesSetEvent) {
|
||||
}
|
||||
}
|
||||
|
||||
func ChangeCustomText(customText bool) func(event *FeaturesSetEvent) {
|
||||
return func(e *FeaturesSetEvent) {
|
||||
e.CustomText = &customText
|
||||
}
|
||||
}
|
||||
func FeaturesSetEventMapper(event *repository.Event) (eventstore.EventReader, error) {
|
||||
e := &FeaturesSetEvent{
|
||||
BaseEvent: *eventstore.BaseEventFromRepo(event),
|
||||
|
46
internal/repository/iam/custom_text.go
Normal file
46
internal/repository/iam/custom_text.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package iam
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"golang.org/x/text/language"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"github.com/caos/zitadel/internal/eventstore/repository"
|
||||
"github.com/caos/zitadel/internal/repository/policy"
|
||||
)
|
||||
|
||||
var (
|
||||
CustomTextSetEventType = iamEventTypePrefix + policy.CustomTextSetEventType
|
||||
)
|
||||
|
||||
type CustomTextSetEvent struct {
|
||||
policy.CustomTextSetEvent
|
||||
}
|
||||
|
||||
func NewCustomTextSetEvent(
|
||||
ctx context.Context,
|
||||
aggregate *eventstore.Aggregate,
|
||||
template,
|
||||
key,
|
||||
text string,
|
||||
language language.Tag,
|
||||
) *CustomTextSetEvent {
|
||||
return &CustomTextSetEvent{
|
||||
CustomTextSetEvent: *policy.NewCustomTextSetEvent(
|
||||
eventstore.NewBaseEventForPush(ctx, aggregate, CustomTextSetEventType),
|
||||
template,
|
||||
key,
|
||||
text,
|
||||
language),
|
||||
}
|
||||
}
|
||||
|
||||
func CustomTextSetEventMapper(event *repository.Event) (eventstore.EventReader, error) {
|
||||
e, err := policy.CustomTextSetEventMapper(event)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &CustomTextSetEvent{CustomTextSetEvent: *e.(*policy.CustomTextSetEvent)}, nil
|
||||
}
|
@@ -56,5 +56,6 @@ func RegisterEventMappers(es *eventstore.Eventstore) {
|
||||
RegisterFilterEventMapper(MailTemplateChangedEventType, MailTemplateChangedEventMapper).
|
||||
RegisterFilterEventMapper(MailTextAddedEventType, MailTextAddedEventMapper).
|
||||
RegisterFilterEventMapper(MailTextChangedEventType, MailTextChangedEventMapper).
|
||||
RegisterFilterEventMapper(CustomTextSetEventType, CustomTextSetEventMapper).
|
||||
RegisterFilterEventMapper(FeaturesSetEventType, FeaturesSetEventMapper)
|
||||
}
|
||||
|
107
internal/repository/org/custom_text.go
Normal file
107
internal/repository/org/custom_text.go
Normal file
@@ -0,0 +1,107 @@
|
||||
package org
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"golang.org/x/text/language"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore/repository"
|
||||
"github.com/caos/zitadel/internal/repository/policy"
|
||||
)
|
||||
|
||||
var (
|
||||
CustomTextSetEventType = orgEventTypePrefix + policy.CustomTextSetEventType
|
||||
CustomTextRemovedEventType = orgEventTypePrefix + policy.CustomTextRemovedEventType
|
||||
CustomTextTemplateRemovedEventType = orgEventTypePrefix + policy.CustomTextTemplateRemovedEventType
|
||||
)
|
||||
|
||||
type CustomTextSetEvent struct {
|
||||
policy.CustomTextSetEvent
|
||||
}
|
||||
|
||||
func NewCustomTextSetEvent(
|
||||
ctx context.Context,
|
||||
aggregate *eventstore.Aggregate,
|
||||
template,
|
||||
key,
|
||||
text string,
|
||||
language language.Tag,
|
||||
) *CustomTextSetEvent {
|
||||
return &CustomTextSetEvent{
|
||||
CustomTextSetEvent: *policy.NewCustomTextSetEvent(
|
||||
eventstore.NewBaseEventForPush(ctx, aggregate, CustomTextSetEventType),
|
||||
template,
|
||||
key,
|
||||
text,
|
||||
language),
|
||||
}
|
||||
}
|
||||
|
||||
func CustomTextSetEventMapper(event *repository.Event) (eventstore.EventReader, error) {
|
||||
e, err := policy.CustomTextSetEventMapper(event)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &CustomTextSetEvent{CustomTextSetEvent: *e.(*policy.CustomTextSetEvent)}, nil
|
||||
}
|
||||
|
||||
type CustomTextRemovedEvent struct {
|
||||
policy.CustomTextRemovedEvent
|
||||
}
|
||||
|
||||
func NewCustomTextRemovedEvent(
|
||||
ctx context.Context,
|
||||
aggregate *eventstore.Aggregate,
|
||||
template,
|
||||
key string,
|
||||
language language.Tag,
|
||||
) *CustomTextRemovedEvent {
|
||||
return &CustomTextRemovedEvent{
|
||||
CustomTextRemovedEvent: *policy.NewCustomTextRemovedEvent(
|
||||
eventstore.NewBaseEventForPush(ctx, aggregate, CustomTextRemovedEventType),
|
||||
template,
|
||||
key,
|
||||
language,
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
func CustomTextRemovedEventMapper(event *repository.Event) (eventstore.EventReader, error) {
|
||||
e, err := policy.CustomTextRemovedEventMapper(event)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &CustomTextRemovedEvent{CustomTextRemovedEvent: *e.(*policy.CustomTextRemovedEvent)}, nil
|
||||
}
|
||||
|
||||
type CustomTextTemplateRemovedEvent struct {
|
||||
policy.CustomTextTemplateRemovedEvent
|
||||
}
|
||||
|
||||
func NewCustomTextTemplateRemovedEvent(
|
||||
ctx context.Context,
|
||||
aggregate *eventstore.Aggregate,
|
||||
template string,
|
||||
language language.Tag,
|
||||
) *CustomTextTemplateRemovedEvent {
|
||||
return &CustomTextTemplateRemovedEvent{
|
||||
CustomTextTemplateRemovedEvent: *policy.NewCustomTextTemplateRemovedEvent(
|
||||
eventstore.NewBaseEventForPush(ctx, aggregate, CustomTextTemplateRemovedEventType),
|
||||
template,
|
||||
language,
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
func CustomTextTemplateRemovedEventMapper(event *repository.Event) (eventstore.EventReader, error) {
|
||||
e, err := policy.CustomTextTemplateRemovedEventMapper(event)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &CustomTextTemplateRemovedEvent{CustomTextTemplateRemovedEvent: *e.(*policy.CustomTextTemplateRemovedEvent)}, nil
|
||||
}
|
@@ -62,6 +62,9 @@ func RegisterEventMappers(es *eventstore.Eventstore) {
|
||||
RegisterFilterEventMapper(MailTextAddedEventType, MailTextAddedEventMapper).
|
||||
RegisterFilterEventMapper(MailTextChangedEventType, MailTextChangedEventMapper).
|
||||
RegisterFilterEventMapper(MailTextRemovedEventType, MailTextRemovedEventMapper).
|
||||
RegisterFilterEventMapper(CustomTextSetEventType, CustomTextSetEventMapper).
|
||||
RegisterFilterEventMapper(CustomTextRemovedEventType, CustomTextRemovedEventMapper).
|
||||
RegisterFilterEventMapper(CustomTextTemplateRemovedEventType, CustomTextTemplateRemovedEventMapper).
|
||||
RegisterFilterEventMapper(IDPConfigAddedEventType, IDPConfigAddedEventMapper).
|
||||
RegisterFilterEventMapper(IDPConfigChangedEventType, IDPConfigChangedEventMapper).
|
||||
RegisterFilterEventMapper(IDPConfigRemovedEventType, IDPConfigRemovedEventMapper).
|
||||
|
138
internal/repository/policy/custom_text.go
Normal file
138
internal/repository/policy/custom_text.go
Normal file
@@ -0,0 +1,138 @@
|
||||
package policy
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
|
||||
"golang.org/x/text/language"
|
||||
|
||||
"github.com/caos/zitadel/internal/errors"
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"github.com/caos/zitadel/internal/eventstore/repository"
|
||||
)
|
||||
|
||||
const (
|
||||
customTextPrefix = "customtext."
|
||||
CustomTextSetEventType = customTextPrefix + "set"
|
||||
CustomTextRemovedEventType = customTextPrefix + "removed"
|
||||
CustomTextTemplateRemovedEventType = customTextPrefix + "template.removed"
|
||||
)
|
||||
|
||||
type CustomTextSetEvent struct {
|
||||
eventstore.BaseEvent `json:"-"`
|
||||
|
||||
Template string `json:"template,omitempty"`
|
||||
Key string `json:"key,omitempty"`
|
||||
Language language.Tag `json:"language,omitempty"`
|
||||
Text string `json:"text,omitempty"`
|
||||
}
|
||||
|
||||
func (e *CustomTextSetEvent) Data() interface{} {
|
||||
return e
|
||||
}
|
||||
|
||||
func (e *CustomTextSetEvent) UniqueConstraints() []*eventstore.EventUniqueConstraint {
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewCustomTextSetEvent(
|
||||
base *eventstore.BaseEvent,
|
||||
template,
|
||||
key,
|
||||
text string,
|
||||
language language.Tag,
|
||||
) *CustomTextSetEvent {
|
||||
return &CustomTextSetEvent{
|
||||
BaseEvent: *base,
|
||||
Template: template,
|
||||
Key: key,
|
||||
Language: language,
|
||||
Text: text,
|
||||
}
|
||||
}
|
||||
|
||||
func CustomTextSetEventMapper(event *repository.Event) (eventstore.EventReader, error) {
|
||||
e := &CustomTextSetEvent{
|
||||
BaseEvent: *eventstore.BaseEventFromRepo(event),
|
||||
}
|
||||
|
||||
err := json.Unmarshal(event.Data, e)
|
||||
if err != nil {
|
||||
return nil, errors.ThrowInternal(err, "TEXT-28dwe", "unable to unmarshal custom text")
|
||||
}
|
||||
|
||||
return e, nil
|
||||
}
|
||||
|
||||
type CustomTextRemovedEvent struct {
|
||||
eventstore.BaseEvent `json:"-"`
|
||||
|
||||
Template string `json:"template,omitempty"`
|
||||
Key string `json:"key,omitempty"`
|
||||
Language language.Tag `json:"language,omitempty"`
|
||||
}
|
||||
|
||||
func (e *CustomTextRemovedEvent) Data() interface{} {
|
||||
return e
|
||||
}
|
||||
|
||||
func (e *CustomTextRemovedEvent) UniqueConstraints() []*eventstore.EventUniqueConstraint {
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewCustomTextRemovedEvent(base *eventstore.BaseEvent, template, key string, language language.Tag) *CustomTextRemovedEvent {
|
||||
return &CustomTextRemovedEvent{
|
||||
BaseEvent: *base,
|
||||
Template: template,
|
||||
Key: key,
|
||||
Language: language,
|
||||
}
|
||||
}
|
||||
|
||||
func CustomTextRemovedEventMapper(event *repository.Event) (eventstore.EventReader, error) {
|
||||
e := &CustomTextRemovedEvent{
|
||||
BaseEvent: *eventstore.BaseEventFromRepo(event),
|
||||
}
|
||||
|
||||
err := json.Unmarshal(event.Data, e)
|
||||
if err != nil {
|
||||
return nil, errors.ThrowInternal(err, "TEXT-28sMf", "unable to unmarshal custom text removed")
|
||||
}
|
||||
|
||||
return e, nil
|
||||
}
|
||||
|
||||
type CustomTextTemplateRemovedEvent struct {
|
||||
eventstore.BaseEvent `json:"-"`
|
||||
|
||||
Template string `json:"template,omitempty"`
|
||||
Language language.Tag `json:"language,omitempty"`
|
||||
}
|
||||
|
||||
func (e *CustomTextTemplateRemovedEvent) Data() interface{} {
|
||||
return e
|
||||
}
|
||||
|
||||
func (e *CustomTextTemplateRemovedEvent) UniqueConstraints() []*eventstore.EventUniqueConstraint {
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewCustomTextTemplateRemovedEvent(base *eventstore.BaseEvent, template string, language language.Tag) *CustomTextTemplateRemovedEvent {
|
||||
return &CustomTextTemplateRemovedEvent{
|
||||
BaseEvent: *base,
|
||||
Template: template,
|
||||
Language: language,
|
||||
}
|
||||
}
|
||||
|
||||
func CustomTextTemplateRemovedEventMapper(event *repository.Event) (eventstore.EventReader, error) {
|
||||
e := &CustomTextTemplateRemovedEvent{
|
||||
BaseEvent: *eventstore.BaseEventFromRepo(event),
|
||||
}
|
||||
|
||||
err := json.Unmarshal(event.Data, e)
|
||||
if err != nil {
|
||||
return nil, errors.ThrowInternal(err, "TEXT-mKKRs", "unable to unmarshal custom text message removed")
|
||||
}
|
||||
|
||||
return e, nil
|
||||
}
|
Reference in New Issue
Block a user