diff --git a/config/routes/api.rb b/config/routes/api.rb
index dbca958689..2344a2212c 100644
--- a/config/routes/api.rb
+++ b/config/routes/api.rb
@@ -6,18 +6,16 @@ Openfoodnetwork::Application.routes.draw do
namespace :api do
- constraints FeatureToggleConstraint.new(:dfc_provider) do
- # Mount DFC API endpoints
- #
- # We're using the DFC Connector which produces DFC v1.7 data but the
- # DFC prototype is still pointing to the old URL. We keep it for
- # testing.
- mount DfcProvider::Engine, at: '/dfc-v1.6/', as: :legacy_dfc_provider_engine
+ # Mount DFC API endpoints
+ #
+ # We're using the DFC Connector which produces DFC v1.7 data but the
+ # DFC prototype is still pointing to the old URL. We keep it for
+ # testing.
+ mount DfcProvider::Engine, at: '/dfc-v1.6/', as: :legacy_dfc_provider_engine
- # The DFC API version depends on the version of the
- # datafoodconsortium-connector gem.
- mount DfcProvider::Engine, at: '/dfc-v1.7/'
- end
+ # The DFC API version depends on the version of the
+ # datafoodconsortium-connector gem.
+ mount DfcProvider::Engine, at: '/dfc-v1.7/'
namespace :v0 do
resources :products do
diff --git a/engines/dfc_provider/app/controllers/dfc_provider/catalog_items_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/catalog_items_controller.rb
index bb1cafbdb3..03a85910b0 100644
--- a/engines/dfc_provider/app/controllers/dfc_provider/catalog_items_controller.rb
+++ b/engines/dfc_provider/app/controllers/dfc_provider/catalog_items_controller.rb
@@ -23,6 +23,14 @@ module DfcProvider
render json: DfcLoader.connector.export(catalog_item, *offers)
end
+ def update
+ dfc_request = JSON.parse(request.body.read)
+
+ variant.on_hand = dfc_request["dfc-b:stockLimitation"]
+ variant.sku = dfc_request["dfc-b:sku"]
+ variant.save!
+ end
+
private
def variant
diff --git a/engines/dfc_provider/app/controllers/dfc_provider/supplied_products_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/supplied_products_controller.rb
index d2ce02c9e0..034770bab2 100644
--- a/engines/dfc_provider/app/controllers/dfc_provider/supplied_products_controller.rb
+++ b/engines/dfc_provider/app/controllers/dfc_provider/supplied_products_controller.rb
@@ -15,7 +15,14 @@ module DfcProvider
dfc_request = JSON.parse(request.body.read)
return unless dfc_request.key?("dfc-b:description")
- variant.product.update!(name: dfc_request["dfc-b:description"])
+ variant.product.update!(
+ description: dfc_request["dfc-b:description"],
+ )
+
+ # This input is DFC v1.6 currently sent by the DFC Prototype.
+ variant.update!(
+ unit_value: dfc_request["dfc-b:quantity"],
+ )
end
private
diff --git a/engines/dfc_provider/config/routes.rb b/engines/dfc_provider/config/routes.rb
index a551e620a1..f8fde9365b 100644
--- a/engines/dfc_provider/config/routes.rb
+++ b/engines/dfc_provider/config/routes.rb
@@ -2,7 +2,7 @@
DfcProvider::Engine.routes.draw do
resources :enterprises, only: [:show] do
- resources :catalog_items, only: [:index, :show]
+ resources :catalog_items, only: [:index, :show, :update]
resources :supplied_products, only: [:show, :update]
end
resources :persons, only: [:show]
diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/catalog_items_controller_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/catalog_items_controller_spec.rb
deleted file mode 100644
index 40b2227907..0000000000
--- a/engines/dfc_provider/spec/controllers/dfc_provider/catalog_items_controller_spec.rb
+++ /dev/null
@@ -1,141 +0,0 @@
-# frozen_string_literal: true
-
-require DfcProvider::Engine.root.join("spec/spec_helper")
-
-describe DfcProvider::CatalogItemsController, type: :controller do
- include AuthorizationHelper
-
- render_views
-
- let!(:user) { create(:oidc_user) }
- let!(:enterprise) { create(:distributor_enterprise, owner: user) }
- let!(:product) { create(:simple_product, supplier: enterprise ) }
- let!(:variant) { product.variants.first }
-
- describe '.index' do
- context 'with authorization token' do
- before { authorise user.email }
-
- context 'with an authenticated user' do
- context 'with an enterprise' do
- context 'given with an id' do
- context 'related to the user' do
- before { api_get :index, enterprise_id: 'default' }
-
- it 'is successful' do
- expect(response).to have_http_status :success
- end
-
- it 'renders the required content' do
- expect(response.body)
- .to include(variant.name)
- expect(response.body)
- .to include(variant.sku)
- expect(response.body)
- .to include("offers/#{variant.id}")
- end
- end
-
- context 'not related to the user' do
- let(:enterprise) { create(:enterprise) }
-
- it 'returns not_found head' do
- api_get :index, enterprise_id: enterprise.id
- expect(response).to have_http_status :not_found
- end
- end
- end
-
- context 'as default' do
- before { api_get :index, enterprise_id: 'default' }
-
- it 'is successful' do
- expect(response.status).to eq 200
- end
-
- it 'renders the required content' do
- expect(response.body)
- .to include(variant.name)
- expect(response.body)
- .to include(variant.sku)
- expect(response.body)
- .to include("offers/#{variant.id}")
- end
- end
- end
-
- context 'without a recorded enterprise' do
- let(:enterprise) { create(:enterprise) }
-
- it 'is not found' do
- api_get :index, enterprise_id: 'default'
- expect(response).to have_http_status :not_found
- end
- end
- end
-
- context 'without an authenticated user' do
- before { authorise "other@user.net" }
-
- it 'returns unauthorized head' do
- authorise "other@user.net"
-
- api_get :index, enterprise_id: 'default'
- expect(response.response_code).to eq(401)
- end
- end
- end
-
- context 'without an authorization token' do
- it 'returns unauthorized head' do
- api_get :index, enterprise_id: enterprise.id
- expect(response).to have_http_status :unauthorized
- end
- end
-
- context "when logged in as app user" do
- it "is successful" do
- sign_in user
- api_get :index, enterprise_id: enterprise.id
- expect(response).to have_http_status :success
- end
- end
- end
-
- describe '.show' do
- context 'with authorization token' do
- before { authorise user.email }
-
- context 'with an authenticated user' do
- context 'with an enterprise' do
- context 'given with an id' do
- before do
- api_get :show, enterprise_id: enterprise.id, id: variant.id
- end
-
- it 'is successful' do
- expect(response).to have_http_status :success
- end
-
- it 'renders the required content' do
- expect(response.body).to include('dfc-b:CatalogItem')
- expect(response.body).to include("offers/#{variant.id}")
- end
- end
-
- context 'with a variant not linked to the enterprise' do
- before do
- api_get :show,
- enterprise_id: enterprise.id,
- id: create(:simple_product).variants.first.id
- end
-
- it 'is not found' do
- expect(response).to have_http_status :not_found
- end
- end
- end
- end
- end
- end
-end
diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/enterprises_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/enterprises_spec.rb
deleted file mode 100644
index 1567616207..0000000000
--- a/engines/dfc_provider/spec/controllers/dfc_provider/enterprises_spec.rb
+++ /dev/null
@@ -1,54 +0,0 @@
-# frozen_string_literal: true
-
-require DfcProvider::Engine.root.join("spec/spec_helper")
-
-describe DfcProvider::EnterprisesController, type: :controller do
- render_views
-
- let!(:user) { create(:user) }
- let!(:enterprise) { create(:distributor_enterprise, owner: user) }
- let!(:product) { create(:simple_product, supplier: enterprise ) }
-
- describe '.show' do
- context 'with authorization token' do
- before do
- request.headers['Authorization'] = 'Bearer 123456.abcdef.123456'
- end
-
- context 'with an authenticated user' do
- before do
- allow_any_instance_of(AuthorizationControl)
- .to receive(:user)
- .and_return(user)
- end
-
- context 'with an enterprise' do
- context 'given with an id' do
- before { api_get :show, id: 'default' }
-
- it 'is successful' do
- expect(response).to be_successful
- end
-
- it 'renders the required content' do
- expect(response.body)
- .to include(product.name)
- expect(response.body)
- .to include(product.sku)
- expect(response.body)
- .to include("offers/#{product.variants.first.id}")
- end
- end
-
- context 'given with a wrong id' do
- before { api_get :show, id: 999 }
-
- it 'is not found' do
- expect(response).to be_not_found
- end
- end
- end
- end
- end
- end
-end
diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/persons_controller_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/persons_controller_spec.rb
deleted file mode 100644
index fc388f4913..0000000000
--- a/engines/dfc_provider/spec/controllers/dfc_provider/persons_controller_spec.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-# frozen_string_literal: true
-
-require DfcProvider::Engine.root.join("spec/spec_helper")
-
-describe DfcProvider::PersonsController, type: :controller do
- render_views
-
- let!(:user) { create(:user) }
-
- describe '.show' do
- context 'with authorization token' do
- before do
- request.headers['Authorization'] = 'Bearer 123456.abcdef.123456'
- end
-
- context 'with an authenticated user' do
- before do
- allow_any_instance_of(AuthorizationControl)
- .to receive(:user)
- .and_return(user)
- end
-
- context 'given with an accessible id' do
- before { api_get :show, id: user.id }
-
- it 'is successful' do
- expect(response).to be_successful
- end
-
- it 'renders the required content' do
- expect(response.body).to include('dfc-b:Person')
- end
- end
-
- context 'with an other user id' do
- before { api_get :show, id: create(:user).id }
-
- it 'is not found' do
- expect(response).to be_not_found
- end
- end
- end
- end
- end
-end
diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/supplied_products_controller_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/supplied_products_controller_spec.rb
deleted file mode 100644
index ca04ec9b91..0000000000
--- a/engines/dfc_provider/spec/controllers/dfc_provider/supplied_products_controller_spec.rb
+++ /dev/null
@@ -1,80 +0,0 @@
-# frozen_string_literal: true
-
-require DfcProvider::Engine.root.join("spec/spec_helper")
-
-describe DfcProvider::SuppliedProductsController, type: :controller do
- include AuthorizationHelper
-
- render_views
-
- let!(:user) { create(:oidc_user) }
- let!(:enterprise) { create(:distributor_enterprise, owner: user) }
- let!(:product) { create(:simple_product, supplier: enterprise ) }
- let!(:variant) { product.variants.first }
-
- describe '.show' do
- context 'with authorization token' do
- before do
- request.headers['Authorization'] = 'Bearer 123456.abcdef.123456'
- end
-
- context 'with an authenticated user' do
- before do
- allow_any_instance_of(AuthorizationControl)
- .to receive(:user)
- .and_return(user)
- end
-
- context 'with an enterprise' do
- context 'given with an id' do
- before do
- api_get :show, enterprise_id: 'default', id: variant.id
- end
-
- it 'is successful' do
- expect(response).to be_successful
- end
-
- it 'renders the required content' do
- expect(response.body).to include(variant.name)
- end
- end
-
- context 'given with a wrong id' do
- before { api_get :show, enterprise_id: 'default', id: 999 }
-
- it 'is not found' do
- expect(response).to be_not_found
- end
- end
- end
- end
- end
- end
-
- describe "#update" do
- routes { DfcProvider::Engine.routes }
-
- it "requires authorisation" do
- api_put :update, enterprise_id: "default", id: "0"
- expect(response).to have_http_status :unauthorized
- end
-
- describe "with authorisation" do
- before { authorise user.email }
-
- it "updates the variant's name" do
- params = { enterprise_id: enterprise.id, id: variant.id }
- request_body = File.read(File.join(__dir__, "../../support/patch_product.json"))
-
- expect {
- put(:update, params: params, body: request_body)
- expect(response).to have_http_status :success
- variant.reload
- }.to change {
- variant.name
- }
- end
- end
- end
-end
diff --git a/engines/dfc_provider/spec/requests/catalog_items_spec.rb b/engines/dfc_provider/spec/requests/catalog_items_spec.rb
new file mode 100644
index 0000000000..5119e946e3
--- /dev/null
+++ b/engines/dfc_provider/spec/requests/catalog_items_spec.rb
@@ -0,0 +1,115 @@
+# frozen_string_literal: true
+
+require DfcProvider::Engine.root.join("spec/spec_helper")
+
+describe "CatalogItems", type: :request do
+ let(:user) { create(:oidc_user) }
+ let(:enterprise) { create(:distributor_enterprise, owner: user) }
+ let(:product) { create(:simple_product, supplier: enterprise ) }
+ let(:variant) { product.variants.first }
+
+ describe :index do
+ it "returns not_found without enterprise" do
+ items_path = enterprise_catalog_items_path(enterprise_id: "default")
+
+ get items_path, headers: auth_header(user.uid)
+
+ expect(response).to have_http_status :not_found
+ end
+
+ context "with existing variant" do
+ before { variant }
+ it "lists catalog items with offers of default enterprise" do
+ items_path = enterprise_catalog_items_path(enterprise_id: "default")
+
+ get items_path, headers: auth_header(user.uid)
+
+ expect(response).to have_http_status :ok
+ expect(response.body).to include variant.name
+ expect(response.body).to include variant.sku
+ expect(response.body).to include "offers/#{variant.id}"
+ end
+
+ it "lists catalog items with offers of requested enterprise" do
+ items_path = enterprise_catalog_items_path(enterprise_id: enterprise.id)
+
+ get items_path, headers: auth_header(user.uid)
+
+ expect(response).to have_http_status :ok
+ expect(response.body).to include variant.name
+ expect(response.body).to include variant.sku
+ expect(response.body).to include "offers/#{variant.id}"
+ end
+
+ it "returns not_found for unrelated enterprises" do
+ other_enterprise = create(:enterprise)
+ items_path = enterprise_catalog_items_path(enterprise_id: other_enterprise.id)
+
+ get items_path, headers: auth_header(user.uid)
+
+ expect(response).to have_http_status :not_found
+ end
+
+ it "returns unauthorized for unauthenticated users" do
+ items_path = enterprise_catalog_items_path(enterprise_id: "default")
+
+ get items_path, headers: {}
+
+ expect(response).to have_http_status :unauthorized
+ end
+
+ it "recognises app user sessions as logins" do
+ items_path = enterprise_catalog_items_path(enterprise_id: "default")
+ login_as user
+
+ get items_path, headers: {}
+
+ expect(response).to have_http_status :ok
+ end
+ end
+ end
+
+ describe :show do
+ it "returns a catalog item with offer" do
+ item_path = enterprise_catalog_item_path(
+ variant,
+ enterprise_id: enterprise.id
+ )
+
+ get item_path, headers: auth_header(user.uid)
+
+ expect(response).to have_http_status :ok
+ expect(response.body).to include "dfc-b:CatalogItem"
+ expect(response.body).to include "offers/#{variant.id}"
+ end
+
+ it "returns not_found for unrelated variant" do
+ item_path = enterprise_catalog_item_path(
+ create(:variant),
+ enterprise_id: enterprise.id
+ )
+
+ get item_path, headers: auth_header(user.uid)
+
+ expect(response).to have_http_status :not_found
+ end
+ end
+
+ describe :update do
+ it "updates a variant's attributes" do
+ params = { enterprise_id: enterprise.id, id: variant.id }
+ request_body = DfcProvider::Engine.root.join("spec/support/patch_catalog_item.json").read
+
+ expect {
+ put(
+ enterprise_catalog_item_path(params),
+ params: request_body,
+ headers: auth_header(user.uid)
+ )
+ expect(response).to have_http_status :success
+ variant.reload
+ }.to change { variant.on_hand }.to(3)
+ .and change { variant.sku }.to("new-sku")
+ end
+ end
+end
diff --git a/engines/dfc_provider/spec/requests/enterprises_spec.rb b/engines/dfc_provider/spec/requests/enterprises_spec.rb
new file mode 100644
index 0000000000..0d9e88eff9
--- /dev/null
+++ b/engines/dfc_provider/spec/requests/enterprises_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require DfcProvider::Engine.root.join("spec/spec_helper")
+
+describe "Enterprises", type: :request do
+ let!(:user) { create(:oidc_user) }
+ let!(:enterprise) { create(:distributor_enterprise, owner: user) }
+ let!(:product) { create(:simple_product, supplier: enterprise ) }
+
+ describe :show do
+ it "returns the default enterprise" do
+ get enterprise_path("default"), headers: auth_header(user.uid)
+
+ expect(response).to have_http_status :ok
+ expect(response.body).to include(product.name)
+ expect(response.body).to include(product.sku)
+ expect(response.body).to include("offers/#{product.variants.first.id}")
+ end
+
+ it "returns the requested enterprise" do
+ get enterprise_path(enterprise.id), headers: auth_header(user.uid)
+
+ expect(response).to have_http_status :ok
+ expect(response.body).to include(product.name)
+ end
+
+ it "returns not found for unrelated enterprise" do
+ other_enterprise = create(:distributor_enterprise)
+ get enterprise_path(other_enterprise.id), headers: auth_header(user.uid)
+
+ expect(response).to have_http_status :not_found
+ expect(response.body).to_not include(product.name)
+ end
+ end
+end
diff --git a/engines/dfc_provider/spec/requests/persons_spec.rb b/engines/dfc_provider/spec/requests/persons_spec.rb
new file mode 100644
index 0000000000..6acea2d5f0
--- /dev/null
+++ b/engines/dfc_provider/spec/requests/persons_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require DfcProvider::Engine.root.join("spec/spec_helper")
+
+describe "Persons", type: :request do
+ let(:user) { create(:oidc_user) }
+ let(:other_user) { create(:oidc_user) }
+
+ describe :show do
+ it "returns the authenticated user" do
+ get person_path(user), headers: auth_header(user.uid)
+ expect(response).to have_http_status :ok
+ expect(response.body).to include "dfc-b:Person"
+ expect(response.body).to include "persons/#{user.id}"
+ end
+
+ it "doesn't find another user" do
+ get person_path(other_user), headers: auth_header(user.uid)
+ expect(response).to have_http_status :not_found
+ expect(response.body).to_not include "dfc-b:Person"
+ end
+ end
+end
diff --git a/engines/dfc_provider/spec/requests/supplied_products_spec.rb b/engines/dfc_provider/spec/requests/supplied_products_spec.rb
new file mode 100644
index 0000000000..f48d761561
--- /dev/null
+++ b/engines/dfc_provider/spec/requests/supplied_products_spec.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+require DfcProvider::Engine.root.join("spec/spec_helper")
+
+describe "SuppliedProducts", type: :request do
+ let!(:user) { create(:oidc_user) }
+ let!(:enterprise) { create(:distributor_enterprise, owner: user) }
+ let!(:product) { create(:simple_product, supplier: enterprise ) }
+ let!(:variant) { product.variants.first }
+
+ describe :show do
+ it "returns variants" do
+ get enterprise_supplied_product_path(
+ variant.id, enterprise_id: enterprise.id
+ ), headers: auth_header(user.uid)
+
+ expect(response).to have_http_status :ok
+ expect(response.body).to include variant.name
+ end
+
+ it "doesn't find unrelated variants" do
+ other_variant = create(:variant)
+
+ get enterprise_supplied_product_path(
+ other_variant.id, enterprise_id: enterprise.id
+ ), headers: auth_header(user.uid)
+
+ expect(response).to have_http_status :not_found
+ end
+ end
+
+ describe :update do
+ it "requires authorisation" do
+ put enterprise_supplied_product_path(
+ variant.id, enterprise_id: enterprise.id
+ ), headers: {}
+
+ expect(response).to have_http_status :unauthorized
+ end
+
+ it "updates a variant's attributes" do
+ params = { enterprise_id: enterprise.id, id: variant.id }
+ request_body = DfcProvider::Engine.root.join("spec/support/patch_supplied_product.json").read
+
+ expect {
+ put(
+ enterprise_supplied_product_path(params),
+ params: request_body,
+ headers: auth_header(user.uid)
+ )
+ expect(response).to have_http_status :success
+ variant.reload
+ }.to change { variant.description }.to("DFC-Pesto updated")
+ .and change { variant.unit_value }.to(17)
+ end
+ end
+end
diff --git a/engines/dfc_provider/spec/spec_helper.rb b/engines/dfc_provider/spec/spec_helper.rb
index 966c2242e4..2f805bc2b2 100644
--- a/engines/dfc_provider/spec/spec_helper.rb
+++ b/engines/dfc_provider/spec/spec_helper.rb
@@ -5,6 +5,10 @@ require_relative '../../../spec/spec_helper'
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].sort.each { |f| require f }
RSpec.configure do |config|
+ config.include AuthorizationHelper, type: :request
+ config.include DfcProvider::Engine.routes.url_helpers, type: :request
+ config.include Warden::Test::Helpers, type: :request
+
config.around(:each) do |example|
# The DFC Connector fetches the context when loaded.
VCR.use_cassette("dfc-context") do
diff --git a/engines/dfc_provider/spec/support/authorization_helper.rb b/engines/dfc_provider/spec/support/authorization_helper.rb
index 4d8a42fdad..c6e32f86b5 100644
--- a/engines/dfc_provider/spec/support/authorization_helper.rb
+++ b/engines/dfc_provider/spec/support/authorization_helper.rb
@@ -1,9 +1,9 @@
# frozen_string_literal: true
module AuthorizationHelper
- def authorise(email)
+ def auth_header(email)
token = allow_token_for(email: email)
- request.headers["Authorization"] = "JWT #{token}"
+ { "Authorization" => "JWT #{token}" }
end
def allow_token_for(payload)
diff --git a/engines/dfc_provider/spec/support/patch_catalog_item.json b/engines/dfc_provider/spec/support/patch_catalog_item.json
new file mode 100644
index 0000000000..37fc582307
--- /dev/null
+++ b/engines/dfc_provider/spec/support/patch_catalog_item.json
@@ -0,0 +1,85 @@
+{
+ "@context": {
+ "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
+ "skos": "http://www.w3.org/2004/02/skos/core#",
+ "dfc": "http://static.datafoodconsortium.org/ontologies/DFC_FullModel.owl#",
+ "dc": "http://purl.org/dc/elements/1.1/#",
+ "dfc-b": "http://static.datafoodconsortium.org/ontologies/DFC_BusinessOntology.owl#",
+ "dfc-p": "http://static.datafoodconsortium.org/ontologies/DFC_ProductOntology.owl#",
+ "dfc-t": "http://static.datafoodconsortium.org/ontologies/DFC_TechnicalOntology.owl#",
+ "dfc-m": "http://static.datafoodconsortium.org/data/measures.rdf#",
+ "dfc-pt": "http://static.datafoodconsortium.org/data/productTypes.rdf#",
+ "dfc-f": "http://static.datafoodconsortium.org/data/facets.rdf#",
+ "dfc-p:hasUnit": {
+ "@type": "@id"
+ },
+ "dfc-b:hasUnit": {
+ "@type": "@id"
+ },
+ "dfc-b:hasQuantity": {
+ "@type": "@id"
+ },
+ "dfc-p:hasType": {
+ "@type": "@id"
+ },
+ "dfc-b:hasType": {
+ "@type": "@id"
+ },
+ "dfc-b:references": {
+ "@type": "@id"
+ },
+ "dfc-b:referencedBy": {
+ "@type": "@id"
+ },
+ "dfc-b:offeres": {
+ "@type": "@id"
+ },
+ "dfc-b:supplies": {
+ "@type": "@id"
+ },
+ "dfc-b:defines": {
+ "@type": "@id"
+ },
+ "dfc-b:affiliates": {
+ "@type": "@id"
+ },
+ "dfc-b:manages": {
+ "@type": "@id"
+ },
+ "dfc-b:offeredThrough": {
+ "@type": "@id"
+ },
+ "dfc-b:hasBrand": {
+ "@type": "@id"
+ },
+ "dfc-b:hasGeographicalOrigin": {
+ "@type": "@id"
+ },
+ "dfc-b:hasClaim": {
+ "@type": "@id"
+ },
+ "dfc-b:hasAllergenDimension": {
+ "@type": "@id"
+ },
+ "dfc-b:hasNutrimentDimension": {
+ "@type": "@id"
+ },
+ "dfc-b:hasPhysicalDimension": {
+ "@type": "@id"
+ },
+ "dfc:owner": {
+ "@type": "@id"
+ },
+ "dfc-t:hostedBy": {
+ "@type": "@id"
+ },
+ "dfc-t:hasPivot": {
+ "@type": "@id"
+ },
+ "dfc-t:represent": {
+ "@type": "@id"
+ }
+ },
+ "dfc-b:stockLimitation": "3",
+ "dfc-b:sku": "new-sku"
+}
diff --git a/engines/dfc_provider/spec/support/patch_product.json b/engines/dfc_provider/spec/support/patch_supplied_product.json
similarity index 83%
rename from engines/dfc_provider/spec/support/patch_product.json
rename to engines/dfc_provider/spec/support/patch_supplied_product.json
index 9e415bec9a..86230c7e7a 100644
--- a/engines/dfc_provider/spec/support/patch_product.json
+++ b/engines/dfc_provider/spec/support/patch_supplied_product.json
@@ -7,12 +7,9 @@
"dfc-b": "http://static.datafoodconsortium.org/ontologies/DFC_BusinessOntology.owl#",
"dfc-p": "http://static.datafoodconsortium.org/ontologies/DFC_ProductOntology.owl#",
"dfc-t": "http://static.datafoodconsortium.org/ontologies/DFC_TechnicalOntology.owl#",
- "dfc-u": "http://static.datafoodconsortium.org/data/units.rdf#",
+ "dfc-m": "http://static.datafoodconsortium.org/data/measures.rdf#",
"dfc-pt": "http://static.datafoodconsortium.org/data/productTypes.rdf#",
- "dfc-a": "http://static.datafoodconsortium.org/data/claims.rdf#",
- "dfc-d": "http://static.datafoodconsortium.org/data/dimensions.rdf#",
- "dfc-c": "http://static.datafoodconsortium.org/data/certifications.rdf#",
- "dfc-g": "http://static.datafoodconsortium.org/data/geoOrigin.rdf#",
+ "dfc-f": "http://static.datafoodconsortium.org/data/facets.rdf#",
"dfc-p:hasUnit": {
"@type": "@id"
},
@@ -84,5 +81,5 @@
}
},
"dfc-b:description": "DFC-Pesto updated",
- "dfc-b:quantity": 0
+ "dfc-b:quantity": 17
}
diff --git a/lib/open_food_network/feature_toggle.rb b/lib/open_food_network/feature_toggle.rb
index 2dc902658f..2bd0b25bde 100644
--- a/lib/open_food_network/feature_toggle.rb
+++ b/lib/open_food_network/feature_toggle.rb
@@ -24,9 +24,6 @@ module OpenFoodNetwork
"background_reports" => <<~DESC,
Generate reports in a background process to limit memory consumption.
DESC
- "dfc_provider" => <<~DESC,
- Enable the DFC compatible endpoint at /api/dfc-*.
- DESC
"match_shipping_categories" => <<~DESC,
During checkout, show only shipping methods that support all
shipping categories. Activating this feature for an enterprise owner