mirror of
https://github.com/zitadel/zitadel.git
synced 2025-02-28 21:07:22 +00:00
fix: map metadata correctly in actions (#5526)
This commit is contained in:
parent
b0ae24ccca
commit
1cf84b5a56
@ -21,33 +21,37 @@ func UserMetadataListFromQuery(c *actions.FieldConfig, metadata *query.UserMetad
|
|||||||
}
|
}
|
||||||
|
|
||||||
for i, md := range metadata.Metadata {
|
for i, md := range metadata.Metadata {
|
||||||
var value interface{}
|
|
||||||
if !json.Valid(md.Value) {
|
|
||||||
var err error
|
|
||||||
md.Value, err = json.Marshal(string(md.Value))
|
|
||||||
if err != nil {
|
|
||||||
logging.WithError(err).Debug("unable to marshal unknow value")
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
err := json.Unmarshal(md.Value, &value)
|
|
||||||
if err != nil {
|
|
||||||
logging.WithError(err).Debug("unable to unmarshal into map")
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
result.Metadata[i] = &userMetadata{
|
result.Metadata[i] = &userMetadata{
|
||||||
CreationDate: md.CreationDate,
|
CreationDate: md.CreationDate,
|
||||||
ChangeDate: md.ChangeDate,
|
ChangeDate: md.ChangeDate,
|
||||||
ResourceOwner: md.ResourceOwner,
|
ResourceOwner: md.ResourceOwner,
|
||||||
Sequence: md.Sequence,
|
Sequence: md.Sequence,
|
||||||
Key: md.Key,
|
Key: md.Key,
|
||||||
Value: c.Runtime.ToValue(value),
|
Value: metadataByteArrayToValue(md.Value, c.Runtime),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.Runtime.ToValue(result)
|
return c.Runtime.ToValue(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func metadataByteArrayToValue(val []byte, runtime *goja.Runtime) goja.Value {
|
||||||
|
var value interface{}
|
||||||
|
if !json.Valid(val) {
|
||||||
|
var err error
|
||||||
|
val, err = json.Marshal(string(val))
|
||||||
|
if err != nil {
|
||||||
|
logging.WithError(err).Debug("unable to marshal unknown value")
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err := json.Unmarshal(val, &value)
|
||||||
|
if err != nil {
|
||||||
|
logging.WithError(err).Debug("unable to unmarshal into map")
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return runtime.ToValue(value)
|
||||||
|
}
|
||||||
|
|
||||||
type userMetadataList struct {
|
type userMetadataList struct {
|
||||||
Count uint64
|
Count uint64
|
||||||
Sequence uint64
|
Sequence uint64
|
||||||
@ -65,7 +69,7 @@ type userMetadata struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type MetadataList struct {
|
type MetadataList struct {
|
||||||
Metadata []*Metadata
|
metadata []*Metadata
|
||||||
}
|
}
|
||||||
|
|
||||||
type Metadata struct {
|
type Metadata struct {
|
||||||
@ -87,7 +91,7 @@ func (md *MetadataList) AppendMetadataFunc(call goja.FunctionCall) goja.Value {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
md.Metadata = append(md.Metadata,
|
md.metadata = append(md.metadata,
|
||||||
&Metadata{
|
&Metadata{
|
||||||
Key: call.Arguments[0].Export().(string),
|
Key: call.Arguments[0].Export().(string),
|
||||||
Value: call.Arguments[1],
|
Value: call.Arguments[1],
|
||||||
@ -96,50 +100,18 @@ func (md *MetadataList) AppendMetadataFunc(call goja.FunctionCall) goja.Value {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func MetadataListToDomain(metadataList *MetadataList) []*domain.Metadata {
|
func (md *MetadataList) MetadataListFromDomain(runtime *goja.Runtime) interface{} {
|
||||||
if metadataList == nil {
|
for i, metadata := range md.metadata {
|
||||||
return nil
|
md.metadata[i].Value = metadataByteArrayToValue(metadata.value, runtime)
|
||||||
}
|
|
||||||
|
|
||||||
list := make([]*domain.Metadata, len(metadataList.Metadata))
|
|
||||||
for i, metadata := range metadataList.Metadata {
|
|
||||||
list[i] = &domain.Metadata{
|
|
||||||
Key: metadata.Key,
|
|
||||||
Value: metadata.value,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return list
|
|
||||||
}
|
|
||||||
|
|
||||||
func MetadataField(metadata *MetadataList) func(c *actions.FieldConfig) interface{} {
|
|
||||||
return func(c *actions.FieldConfig) interface{} {
|
|
||||||
for _, md := range metadata.Metadata {
|
|
||||||
if json.Valid(md.value) {
|
|
||||||
err := json.Unmarshal(md.value, &md.Value)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return metadata.Metadata
|
|
||||||
}
|
}
|
||||||
|
return &md.metadata
|
||||||
}
|
}
|
||||||
|
|
||||||
func MetadataListFromDomain(metadata []*domain.Metadata) *MetadataList {
|
func MetadataListFromDomain(metadata []*domain.Metadata) *MetadataList {
|
||||||
list := &MetadataList{Metadata: make([]*Metadata, len(metadata))}
|
list := &MetadataList{metadata: make([]*Metadata, len(metadata))}
|
||||||
|
|
||||||
for i, md := range metadata {
|
for i, md := range metadata {
|
||||||
var val interface{}
|
list.metadata[i] = &Metadata{
|
||||||
if json.Valid(md.Value) {
|
|
||||||
err := json.Unmarshal(md.Value, &val)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
list.Metadata[i] = &Metadata{
|
|
||||||
Key: md.Key,
|
Key: md.Key,
|
||||||
value: md.Value,
|
value: md.Value,
|
||||||
}
|
}
|
||||||
@ -147,3 +119,41 @@ func MetadataListFromDomain(metadata []*domain.Metadata) *MetadataList {
|
|||||||
|
|
||||||
return list
|
return list
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func MetadataListToDomain(metadataList *MetadataList) []*domain.Metadata {
|
||||||
|
if metadataList == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
list := make([]*domain.Metadata, len(metadataList.metadata))
|
||||||
|
for i, metadata := range metadataList.metadata {
|
||||||
|
value := metadata.value
|
||||||
|
if len(value) == 0 {
|
||||||
|
value = mapBytesToByteArray(metadata.Value.Export())
|
||||||
|
}
|
||||||
|
list[i] = &domain.Metadata{
|
||||||
|
Key: metadata.Key,
|
||||||
|
Value: value,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
|
||||||
|
// mapBytesToByteArray is used for backwards compatibility of old metadata.push method
|
||||||
|
// converts the Javascript uint8 array which is exported as []interface{} to a []byte
|
||||||
|
func mapBytesToByteArray(i interface{}) []byte {
|
||||||
|
bytes, ok := i.([]interface{})
|
||||||
|
if !ok {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
value := make([]byte, len(bytes))
|
||||||
|
for i, val := range bytes {
|
||||||
|
b, ok := val.(int64)
|
||||||
|
if !ok {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
value[i] = byte(b)
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
@ -67,7 +67,9 @@ func (l *Login) runPostExternalAuthenticationActions(
|
|||||||
actions.SetFields("setPhoneVerified", func(verified bool) {
|
actions.SetFields("setPhoneVerified", func(verified bool) {
|
||||||
user.IsPhoneVerified = verified
|
user.IsPhoneVerified = verified
|
||||||
}),
|
}),
|
||||||
actions.SetFields("metadata", &metadataList.Metadata),
|
actions.SetFields("metadata", func(c *actions.FieldConfig) interface{} {
|
||||||
|
return metadataList.MetadataListFromDomain(c.Runtime)
|
||||||
|
}),
|
||||||
actions.SetFields("v1",
|
actions.SetFields("v1",
|
||||||
actions.SetFields("user",
|
actions.SetFields("user",
|
||||||
actions.SetFields("appendMetadata", metadataList.AppendMetadataFunc),
|
actions.SetFields("appendMetadata", metadataList.AppendMetadataFunc),
|
||||||
@ -145,7 +147,9 @@ func (l *Login) runPostInternalAuthenticationActions(
|
|||||||
|
|
||||||
metadataList := object.MetadataListFromDomain(nil)
|
metadataList := object.MetadataListFromDomain(nil)
|
||||||
apiFields := actions.WithAPIFields(
|
apiFields := actions.WithAPIFields(
|
||||||
actions.SetFields("metadata", &metadataList.Metadata),
|
actions.SetFields("metadata", func(c *actions.FieldConfig) interface{} {
|
||||||
|
return metadataList.MetadataListFromDomain(c.Runtime)
|
||||||
|
}),
|
||||||
actions.SetFields("v1",
|
actions.SetFields("v1",
|
||||||
actions.SetFields("user",
|
actions.SetFields("user",
|
||||||
actions.SetFields("appendMetadata", metadataList.AppendMetadataFunc),
|
actions.SetFields("appendMetadata", metadataList.AppendMetadataFunc),
|
||||||
@ -246,7 +250,9 @@ func (l *Login) runPreCreationActions(
|
|||||||
}
|
}
|
||||||
user.Phone.IsPhoneVerified = verified
|
user.Phone.IsPhoneVerified = verified
|
||||||
}),
|
}),
|
||||||
actions.SetFields("metadata", &metadataList.Metadata),
|
actions.SetFields("metadata", func(c *actions.FieldConfig) interface{} {
|
||||||
|
return metadataList.MetadataListFromDomain(c.Runtime)
|
||||||
|
}),
|
||||||
actions.SetFields("v1",
|
actions.SetFields("v1",
|
||||||
actions.SetFields("user",
|
actions.SetFields("user",
|
||||||
actions.SetFields("appendMetadata", metadataList.AppendMetadataFunc),
|
actions.SetFields("appendMetadata", metadataList.AppendMetadataFunc),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user