diff --git a/api/app/controllers/spree/api/option_values_controller.rb b/api/app/controllers/spree/api/option_values_controller.rb index 0feea2337e5..abf1f4e590d 100644 --- a/api/app/controllers/spree/api/option_values_controller.rb +++ b/api/app/controllers/spree/api/option_values_controller.rb @@ -18,6 +18,13 @@ def show end def create + Spree::Deprecation.warn <<~MSG unless request.path.include?('option_types') + This route is deprecated, as it'll be no longer possible to create an + option_value without an associated option_type. Please, use instead: + + POST api/option_types/{option_type_id}/option_values + MSG + authorize! :create, Spree::OptionValue @option_value = scope.new(option_value_params) if @option_value.save diff --git a/api/config/routes.rb b/api/config/routes.rb index fd22f60b94e..49fa8e13b81 100644 --- a/api/config/routes.rb +++ b/api/config/routes.rb @@ -54,6 +54,7 @@ resources :option_types do resources :option_values end + # TODO: Remove :create once option_type is required on Solidus v4.0 resources :option_values get '/orders/mine', to: 'orders#mine', as: 'my_orders' diff --git a/api/openapi/solidus-api.oas.yml b/api/openapi/solidus-api.oas.yml index f9797420dcb..129ff156a89 100644 --- a/api/openapi/solidus-api.oas.yml +++ b/api/openapi/solidus-api.oas.yml @@ -2544,6 +2544,8 @@ paths: $ref: '#/components/responses/unprocessable-entity' summary: Create option value description: |- + **DEPRECATED**: Use *POST /option_types/{option_type_id}/option_values* instead + Creates an option value. Only users with the `create` permission on `Spree::OptionValue` can perform this action. diff --git a/api/spec/requests/spree/api/option_values_spec.rb b/api/spec/requests/spree/api/option_values_spec.rb index e31c68e4157..0360b076fe5 100644 --- a/api/spec/requests/spree/api/option_values_spec.rb +++ b/api/spec/requests/spree/api/option_values_spec.rb @@ -110,7 +110,9 @@ module Spree::Api expect(option_value.name).to eq("Option Value") end - it "can create an option value" do + it "can create but deprecates creating an option value without option type" do + expect(Spree::Deprecation).to receive(:warn).with(/deprecated/).at_least(:once) + post spree.api_option_values_path, params: { option_value: { name: "Option Value", presentation: 'option value' diff --git a/core/app/models/spree/option_value.rb b/core/app/models/spree/option_value.rb index 4d529b4d0ef..bfbf89a49b6 100644 --- a/core/app/models/spree/option_value.rb +++ b/core/app/models/spree/option_value.rb @@ -2,6 +2,8 @@ module Spree class OptionValue < Spree::Base + # TODO: Remove optional on Solidus v4.0. Don't forget adding a migration to + # enforce at the database layer belongs_to :option_type, class_name: 'Spree::OptionType', inverse_of: :option_values, optional: true acts_as_list scope: :option_type @@ -13,7 +15,14 @@ class OptionValue < Spree::Base after_save :touch, if: :saved_changes? after_touch :touch_all_variants + after_save do + Spree::Deprecation.warn <<~MSG if option_type.nil? + Having an option_value with no associated option_type will be deprecated + on Solidus v4.0 + MSG + end + # TODO: Remove allow_nil once option_type is required on Solidus v4.0 delegate :name, :presentation, to: :option_type, prefix: :option_type, allow_nil: true self.whitelisted_ransackable_attributes = %w[name presentation] diff --git a/core/spec/models/spree/option_value_spec.rb b/core/spec/models/spree/option_value_spec.rb index 409f931f2a9..6c42f441102 100644 --- a/core/spec/models/spree/option_value_spec.rb +++ b/core/spec/models/spree/option_value_spec.rb @@ -49,4 +49,10 @@ expect(subject).to eq "Size - S" end end + + it 'deprecates creating an option_value with no associated option_type' do + expect(Spree::Deprecation).to receive(:warn).with(/deprecated/) + + create(:option_value, option_type: nil) + end end