Files
zitadel/internal/command/hosted_login_translation.go

74 lines
2.5 KiB
Go
Raw Normal View History

package command
import (
"context"
"crypto/md5"
"encoding/hex"
"fmt"
"golang.org/x/text/language"
"github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/eventstore"
"github.com/zitadel/zitadel/internal/repository/instance"
"github.com/zitadel/zitadel/internal/repository/org"
"github.com/zitadel/zitadel/internal/telemetry/tracing"
"github.com/zitadel/zitadel/internal/zerrors"
"github.com/zitadel/zitadel/pkg/grpc/settings/v2"
)
func (c *Commands) SetHostedLoginTranslation(ctx context.Context, req *settings.SetHostedLoginTranslationRequest) (res *settings.SetHostedLoginTranslationResponse, err error) {
ctx, span := tracing.NewSpan(ctx)
defer func() { span.EndWithError(err) }()
var agg eventstore.Aggregate
switch t := req.GetLevel().(type) {
case *settings.SetHostedLoginTranslationRequest_Instance:
agg = instance.NewAggregate(authz.GetInstance(ctx).InstanceID()).Aggregate
case *settings.SetHostedLoginTranslationRequest_OrganizationId:
agg = org.NewAggregate(t.OrganizationId).Aggregate
default:
return nil, zerrors.ThrowInvalidArgument(nil, "COMMA-YB6Sri", "Errors.Arguments.Level.Invalid")
}
lang, err := language.Parse(req.GetLocale())
if err != nil || lang.IsRoot() {
return nil, zerrors.ThrowInvalidArgument(nil, "COMMA-xmjATA", "Errors.Arguments.Locale.Invalid")
}
commands, wm, err := c.setTranslationEvents(ctx, agg, lang, req.GetTranslations().AsMap())
if err != nil {
return nil, err
}
pushedEvents, err := c.eventstore.Push(ctx, commands...)
if err != nil {
return nil, zerrors.ThrowInternal(err, "COMMA-i8nqFl", "Errors.Internal")
}
err = AppendAndReduce(wm, pushedEvents...)
if err != nil {
return nil, err
}
etag := md5.Sum(fmt.Append(nil, wm.Translation))
return &settings.SetHostedLoginTranslationResponse{
Etag: hex.EncodeToString(etag[:]),
}, nil
}
func (c *Commands) setTranslationEvents(ctx context.Context, agg eventstore.Aggregate, lang language.Tag, translations map[string]any) ([]eventstore.Command, *HostedLoginTranslationWriteModel, error) {
wm := NewHostedLoginTranslationWriteModel(agg.ID)
events := []eventstore.Command{}
switch agg.Type {
case instance.AggregateType:
events = append(events, instance.NewHostedLoginTranslationSetEvent(ctx, &agg, translations, lang))
case org.AggregateType:
events = append(events, org.NewHostedLoginTranslationSetEvent(ctx, &agg, translations, lang))
default:
return nil, nil, zerrors.ThrowInvalidArgument(nil, "COMMA-0aw7In", "Errors.Arguments.LevelType.Invalid")
}
return events, wm, nil
}