fixed payment methods serialization deserialization
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
@@ -71,3 +72,73 @@ type PaymentMethod struct {
|
||||
Data bson.Raw `bson:"data" json:"data"`
|
||||
IsMain bool `bson:"isMain" json:"isMain"`
|
||||
}
|
||||
|
||||
type paymentMethodJSON struct {
|
||||
PermissionBound `json:",inline"`
|
||||
Describable `json:",inline"`
|
||||
|
||||
RecipientRef primitive.ObjectID `json:"recipientRef"`
|
||||
Type PaymentType `json:"type"`
|
||||
Data json.RawMessage `json:"data"`
|
||||
IsMain bool `json:"isMain"`
|
||||
}
|
||||
|
||||
func (m PaymentMethod) MarshalJSON() ([]byte, error) {
|
||||
var marshaledData json.RawMessage
|
||||
|
||||
if len(m.Data) > 0 {
|
||||
var data bson.M
|
||||
if err := bson.Unmarshal(m.Data, &data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if data != nil {
|
||||
b, err := json.Marshal(data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
marshaledData = b
|
||||
}
|
||||
}
|
||||
|
||||
payload := paymentMethodJSON{
|
||||
PermissionBound: m.PermissionBound,
|
||||
Describable: m.Describable,
|
||||
RecipientRef: m.RecipientRef,
|
||||
Type: m.Type,
|
||||
Data: marshaledData,
|
||||
IsMain: m.IsMain,
|
||||
}
|
||||
|
||||
return json.Marshal(payload)
|
||||
}
|
||||
|
||||
func (m *PaymentMethod) UnmarshalJSON(data []byte) error {
|
||||
var payload paymentMethodJSON
|
||||
if err := json.Unmarshal(data, &payload); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
m.PermissionBound = payload.PermissionBound
|
||||
m.Describable = payload.Describable
|
||||
m.RecipientRef = payload.RecipientRef
|
||||
m.Type = payload.Type
|
||||
m.IsMain = payload.IsMain
|
||||
|
||||
if len(payload.Data) == 0 || bytes.Equal(payload.Data, []byte("null")) {
|
||||
m.Data = nil
|
||||
return nil
|
||||
}
|
||||
|
||||
var rawData map[string]any
|
||||
if err := json.Unmarshal(payload.Data, &rawData); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
raw, err := bson.Marshal(rawData)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
m.Data = raw
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user