Skip to content

Commit b954491

Browse files
committed
Introduce Customer and Admin Metadata Restriction Preference
This configuration adds the ability to enable or disable metadata restrictions as needed. Following configurations are possible: - `meta_data_validation_enabled` : Enables or disables restrictions globally.
1 parent 0040a2c commit b954491

File tree

3 files changed

+74
-26
lines changed

3 files changed

+74
-26
lines changed

core/app/models/concerns/spree/metadata.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ module Metadata
88
attribute :customer_metadata, :json, default: {}
99
attribute :admin_metadata, :json, default: {}
1010

11-
validate :validate_metadata_limits
11+
validate :validate_metadata_limits, if: :validate_metadata_enabled?
1212
end
1313

1414
class_methods do
@@ -19,6 +19,10 @@ def meta_data_columns
1919

2020
private
2121

22+
def validate_metadata_enabled?
23+
Spree::Config.meta_data_validation_enabled
24+
end
25+
2226
def validate_metadata_limits
2327
self.class.meta_data_columns.each { |column| validate_metadata_column(column) }
2428
end

core/lib/spree/app_configuration.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,14 @@ class AppConfiguration < Preferences::Configuration
216216
# @return [Integer] Orders to show per-page in the admin (default: +15+)
217217
preference :orders_per_page, :integer, default: 15
218218

219+
# @!attribute [rw] meta_data_validation_enabled
220+
# @return [Boolean] Indicates whether validation for customer and admin metadata columns is enabled.
221+
# When this is set to true, the following preferences will be used to validate the metadata:
222+
# - The maximum number of keys that can be added to the metadata columns (meta_data_max_keys).
223+
# - The maximum length of each key in the metadata columns (meta_data_max_key_length).
224+
# - The maximum length of each value in the metadata columns (meta_data_max_value_length).
225+
# (default: +true+)
226+
preference :meta_data_validation_enabled, :boolean, default: false
219227

220228
# @!attribute [rw] meta_data_max_keys
221229
# @return [Integer] Maximum keys that can be allocated in customer and admin metadata column (default: +6+)

core/spec/support/shared_examples/metadata.rb

Lines changed: 61 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -53,43 +53,79 @@
5353

5454
%w[customer_metadata admin_metadata].each do |metadata_type|
5555
describe metadata_type do
56-
it "does not allow more than 6 keys" do
57-
subject.send("#{metadata_type}=", invalid_metadata_keys)
56+
context "when metadata validation is enabled" do
57+
before do
58+
stub_spree_preferences(meta_data_validation_enabled: true)
59+
end
5860

59-
expect(subject).not_to be_valid
60-
expect(subject.errors[metadata_type.to_sym]).to include("must not have more than 6 keys")
61-
end
61+
it "does not allow more than 6 keys" do
62+
subject.send("#{metadata_type}=", invalid_metadata_keys)
6263

63-
it "allows less than 6 keys" do
64-
subject.send("#{metadata_type}=", valid_metadata_keys)
64+
expect(subject).not_to be_valid
65+
expect(subject.errors[metadata_type.to_sym]).to include("must not have more than 6 keys")
66+
end
6567

66-
expect(subject).to be_valid
67-
end
68+
it "allows less than 6 keys" do
69+
subject.send("#{metadata_type}=", valid_metadata_keys)
6870

69-
it "does not allow values longer than 256 characters" do
70-
subject.send("#{metadata_type}=", oversized_value_metadata)
71+
expect(subject).to be_valid
72+
end
7173

72-
expect(subject).not_to be_valid
73-
expect(subject.errors[metadata_type.to_sym]).to include("value for key 'product_details' exceeds 256 characters")
74-
end
74+
it "does not allow values longer than 256 characters" do
75+
subject.send("#{metadata_type}=", oversized_value_metadata)
7576

76-
it "allows values shorter than 256 characters" do
77-
subject.send("#{metadata_type}=", valid_value_metadata)
77+
expect(subject).not_to be_valid
78+
expect(subject.errors[metadata_type.to_sym]).to include("value for key 'product_details' exceeds 256 characters")
79+
end
7880

79-
expect(subject).to be_valid
80-
end
81+
it "allows values shorter than 256 characters" do
82+
subject.send("#{metadata_type}=", valid_value_metadata)
83+
84+
expect(subject).to be_valid
85+
end
86+
87+
it "does not allow keys longer than 16 characters" do
88+
subject.send("#{metadata_type}=", oversized_key_metadata)
89+
90+
expect(subject).not_to be_valid
91+
expect(subject.errors[metadata_type.to_sym]).to include("key 'company_details_for_products' exceeds 16 characters")
92+
end
8193

82-
it "does not allow keys longer than 16 characters" do
83-
subject.send("#{metadata_type}=", oversized_key_metadata)
94+
it "allows keys shorter than 16 characters" do
95+
subject.send("#{metadata_type}=", valid_key_metadata)
8496

85-
expect(subject).not_to be_valid
86-
expect(subject.errors[metadata_type.to_sym]).to include("key 'company_details_for_products' exceeds 16 characters")
97+
expect(subject).to be_valid
98+
end
8799
end
88100

89-
it "allows keys shorter than 16 characters" do
90-
subject.send("#{metadata_type}=", valid_key_metadata)
101+
context "when metadata validation is disabled" do
102+
before do
103+
stub_spree_preferences(meta_data_validation_enabled: false)
104+
end
105+
106+
it "does not validate the metadata" do
107+
subject.send("#{metadata_type}=", invalid_metadata_keys)
108+
109+
expect(subject).to be_valid
110+
end
111+
112+
it "allows more than 6 keys" do
113+
subject.send("#{metadata_type}=", invalid_metadata_keys)
114+
115+
expect(subject).to be_valid
116+
end
117+
118+
it "allows values longer than 256 characters" do
119+
subject.send("#{metadata_type}=", oversized_value_metadata)
120+
121+
expect(subject).to be_valid
122+
end
123+
124+
it "allows keys longer than 16 characters" do
125+
subject.send("#{metadata_type}=", oversized_key_metadata)
91126

92-
expect(subject).to be_valid
127+
expect(subject).to be_valid
128+
end
93129
end
94130
end
95131
end

0 commit comments

Comments
 (0)