fixed payment methods serialization deserialization

This commit is contained in:
Stephan D
2025-12-05 05:17:14 +01:00
parent 3b047af7ca
commit 574b40fe9f
3 changed files with 100 additions and 15 deletions

View File

@@ -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
}

View File

@@ -71,7 +71,6 @@ class PaymentMethodsProvider extends GenericProvider<PaymentMethod> {
).toDTO().toJson(),
);
Future<void> makeMain(PaymentMethod method) {
// TODO: create separate backend method to manage main payment method
final updates = <Future<void>>[];

View File

@@ -1,5 +1,7 @@
import 'package:flutter/material.dart';
import 'package:collection/collection.dart';
import 'package:provider/provider.dart';
import 'package:pshared/models/payment/methods/data.dart';
@@ -14,11 +16,11 @@ import 'package:pshared/provider/recipient/provider.dart';
import 'package:pweb/pages/address_book/form/view.dart';
// import 'package:pweb/services/amplitude.dart';
import 'package:pweb/utils/error/snackbar.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
import 'package:pweb/utils/payment/label.dart';
import 'package:pweb/utils/snackbar.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
class AdressBookRecipientForm extends StatefulWidget {
final Recipient? recipient;
@@ -71,18 +73,31 @@ class _AdressBookRecipientFormState extends State<AdressBookRecipientForm> {
Future<Recipient?> _doSave() async {
final recipients = context.read<RecipientsProvider>();
final methods = context.read<PaymentMethodsProvider>();
final recipient = await recipients.create(
name: _nameCtrl.text,
email: _emailCtrl.text,
);
if (methods.currentObject == null) return recipient;
final data = methods.currentObject!;
await methods.create(
reacipientRef: recipient.id,
name: getPaymentTypeLabel(context, data.type),
data: data.data,
);
return recipient;
final recipient = widget.recipient == null
? await recipients.create(
name: _nameCtrl.text,
email: _emailCtrl.text,
)
: widget.recipient!;
for (final type in _methods.keys) {
final data = _methods[type]!;
final exising = methods.methods.firstWhereOrNull((m) => m.type == type);
if (exising != null) {
await methods.updateMethod(exising.copyWith(data: data));
} else {
await methods.create(
reacipientRef: recipient.id,
name: getPaymentTypeLabel(context, type),
data: data,
);
}
await methods.create(
reacipientRef: recipient.id,
name: getPaymentTypeLabel(context, data.type),
data: data,
);
return recipient;
}
}
//TODO: Change when registration is ready