add support for storing custom metadata to cart/order items and options
authorTony Cook <tony@develop-help.com>
Sat, 18 Apr 2020 03:03:38 +0000 (13:03 +1000)
committerTony Cook <tony@develop-help.com>
Sat, 18 Apr 2020 03:04:15 +0000 (13:04 +1000)
the get_custom() on BSE::CfgProductOptionValue is for compatibility
with database options.

site/cgi-bin/modules/BSE/CustomData.pm [new file with mode: 0644]
site/cgi-bin/modules/BSE/TB/OrderItem.pm
site/cgi-bin/modules/BSE/TB/OrderItemOption.pm
site/cgi-bin/modules/BSE/TB/Product.pm
site/cgi-bin/modules/BSE/TB/ProductOption.pm
site/cgi-bin/modules/BSE/TB/ProductOptionValue.pm

diff --git a/site/cgi-bin/modules/BSE/CustomData.pm b/site/cgi-bin/modules/BSE/CustomData.pm
new file mode 100644 (file)
index 0000000..d7b19a3
--- /dev/null
@@ -0,0 +1,112 @@
+package BSE::CustomData;
+use strict;
+use JSON ();
+
+our $VERSION = "1.000";
+
+my $json;
+
+sub get_custom_all {
+  my ($self) = @_;
+
+  my $data = $self->custom_data;
+  my $result;
+  if (defined $data && length $data) {
+    eval { $result = JSON::decode_json($data); 1};
+  }
+  return $result || {};
+}
+
+sub set_custom_all {
+  my ($self, $hash) = @_;
+
+  ref $hash eq "HASH"
+    or die "set_custom_all() called with non-hash";
+  my $data;
+  eval { $data = JSON::encode_json($hash) };
+  $data ||= "{}";
+  $self->set_custom_data($data);
+}
+
+sub set_custom {
+  my ($self, $name, $value) = @_;
+
+  my $data = $self->get_custom_all;
+  $data->{$name} = $value;
+  $self->set_custom_all($data);
+}
+
+sub get_custom {
+  my ($self, $name) = @_;
+
+  my $data = $self->get_custom_all;
+  return $data->{$name};
+}
+
+1;
+
+=head1 NAME
+
+BSE::CustomData - mix in for treating a field of a table as JSON.
+
+=head1 SYNOPSIS
+
+  package YourTable;
+  use parent 'Squirrel::Row', 'BSE::Custom';
+
+  sub columns { ... custom_data }
+
+  my $item = YourTable->getByPkey(...);
+  $item->set_custom($name => $value);
+  my $value = $item->get_custom($name);
+
+=head1 DESCRIPTION
+
+A simpler, cheaper alternative to the table metadata system, intended
+for uses where that would be far too heavy.
+
+Expects your class to define the following methods:
+
+=over
+
+=item *
+
+set_custom_data($value) - sets the custom data field in the row object.
+
+=item *
+
+custom_data - retrieves the custom data field in the row object.
+
+=back
+
+The data should be stored/retrieved as a BLOB, though JSON column
+types may also work.
+
+Provides the following methods:
+
+=over
+
+=item *
+
+set_custom($name, $value) - set the given field in the custom data to
+C<$value>.  C<$name> must be a simple string.  C<$value> must be a
+JSON compatible structure, including strings, numbers, arrays, hashes,
+and may not include blessed objects.
+
+=item *
+
+set_custom_all($hash) - set the entire custom data to a given hash,
+used by set_custom().
+
+=item *
+
+get_custom($name) - retrieve a value set previously by set_custom.
+
+=item *
+
+get_custom_all() - get the custom data hash.  Used by get_custom() and
+set_custom().
+
+=back
+
+=cut
index 52af735..1bebf86 100644 (file)
@@ -2,10 +2,11 @@ package BSE::TB::OrderItem;
 use strict;
 # represents an order line item from the database
 use Squirrel::Row;
 use strict;
 # represents an order line item from the database
 use Squirrel::Row;
+use BSE::CustomData;
 use vars qw/@ISA/;
 use vars qw/@ISA/;
-@ISA = qw/Squirrel::Row/;
+@ISA = qw/Squirrel::Row BSE::CustomData/;
 
 
-our $VERSION = "1.007";
+our $VERSION = "1.008";
 
 sub table { "order_item" }
 
 
 sub table { "order_item" }
 
@@ -13,7 +14,8 @@ sub columns {
   return qw/id productId orderId units price wholesalePrice gst options
             customInt1 customInt2 customInt3 customStr1 customStr2 customStr3
             title description subscription_id subscription_period max_lapsed
   return qw/id productId orderId units price wholesalePrice gst options
             customInt1 customInt2 customInt3 customStr1 customStr2 customStr3
             title description subscription_id subscription_period max_lapsed
-            session_id product_code tier_id product_discount product_discount_units/;
+            session_id product_code tier_id product_discount product_discount_units
+          custom_data/;
 }
 
 sub db_columns {
 }
 
 sub db_columns {
@@ -34,6 +36,7 @@ sub defaults {
      tier_id => undef,
      product_discount => 0,
      product_discount_units => 0,
      tier_id => undef,
      product_discount => 0,
      product_discount_units => 0,
+     custom_data => undef,
     );
 }
 
     );
 }
 
index 6924e31..2bb6026 100644 (file)
@@ -1,15 +1,21 @@
 package BSE::TB::OrderItemOption;
 use strict;
 package BSE::TB::OrderItemOption;
 use strict;
-use base 'Squirrel::Row';
+use parent 'Squirrel::Row', 'BSE::CustomData';
 
 
-our $VERSION = "1.000";
+our $VERSION = "1.001";
 
 sub table {
   "bse_order_item_options";
 }
 
 
 sub table {
   "bse_order_item_options";
 }
 
+sub defaults {
+  return (
+    custom_data => undef,
+    );
+}
+
 sub columns {
 sub columns {
-  return qw/id order_item_id original_id name value display display_order/;
+  return qw/id order_item_id original_id name value display display_order custom_data/;
 }
 
 1;
 }
 
 1;
index 988f03a..efa485d 100644 (file)
@@ -5,7 +5,7 @@ use BSE::TB::Articles;
 use vars qw/@ISA/;
 @ISA = qw/BSE::TB::Article/;
 
 use vars qw/@ISA/;
 @ISA = qw/BSE::TB::Article/;
 
-our $VERSION = "1.005";
+our $VERSION = "1.006";
 
 # subscription_usage values
 use constant SUBUSAGE_START_ONLY => 1;
 
 # subscription_usage values
 use constant SUBUSAGE_START_ONLY => 1;
@@ -291,4 +291,6 @@ sub id { $_[0]{id} }
 
 sub value { $_[0]{value} }
 
 
 sub value { $_[0]{value} }
 
+sub get_custom { undef }
+
 1;
 1;
index e1c4f49..ba8345b 100644 (file)
@@ -1,11 +1,11 @@
 package BSE::TB::ProductOption;
 use strict;
 package BSE::TB::ProductOption;
 use strict;
-use base 'Squirrel::Row';
+use parent 'Squirrel::Row', 'BSE::CustomData';
 
 
-our $VERSION = "1.001";
+our $VERSION = "1.002";
 
 sub columns {
 
 sub columns {
-  return qw/id product_id name type global_ref display_order enabled default_value/;
+  return qw/id product_id name type global_ref display_order enabled default_value custom_data/;
 }
 
 sub table {
 }
 
 sub table {
@@ -19,6 +19,7 @@ sub defaults {
      enabled => 1,
      type => "select",
      default_value => 0,
      enabled => 1,
      type => "select",
      default_value => 0,
+     custom_data => undef,
     );
 }
 
     );
 }
 
index 65e6325..6c06802 100644 (file)
@@ -1,11 +1,18 @@
 package BSE::TB::ProductOptionValue;
 use strict;
 package BSE::TB::ProductOptionValue;
 use strict;
-use base "Squirrel::Row";
+use parent "Squirrel::Row", "BSE::CustomData";
 
 
-our $VERSION = "1.000";
+our $VERSION = "1.001";
 
 sub columns {
 
 sub columns {
-  return qw/id product_option_id value display_order/;
+  return qw/id product_option_id value display_order custom_data/;
+}
+
+sub defaults {
+  return
+    (
+     custom_data => undef,
+    );
 }
 
 sub table {
 }
 
 sub table {