diff --git a/Gemfile b/Gemfile index dcf202d4f3..53130494e0 100644 --- a/Gemfile +++ b/Gemfile @@ -11,6 +11,7 @@ gem 'rails_safe_tasks', '~> 1.0' gem "activerecord-import" gem "catalog", path: "./engines/catalog" +gem 'dfc_provider', path: './engines/dfc_provider' gem "order_management", path: "./engines/order_management" gem 'web', path: './engines/web' diff --git a/Gemfile.lock b/Gemfile.lock index e5ebbf35a7..4dc1791427 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -56,6 +56,11 @@ GIT rails-i18n spree_core (>= 1.1) +PATH + remote: engines/dfc_provider + specs: + dfc_provider (0.0.1) + PATH remote: engines/catalog specs: @@ -710,6 +715,7 @@ DEPENDENCIES delayed_job_web devise (~> 2.2.5) devise-encryptable (= 0.2.0) + dfc_provider! diffy eventmachine (>= 1.2.3) factory_bot_rails diff --git a/config/routes.rb b/config/routes.rb index dcb828b3be..98897ffdf4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -91,4 +91,5 @@ Openfoodnetwork::Application.routes.draw do # Mount Spree's routes mount Spree::Core::Engine, :at => '/' + mount DfcProvider::Engine, at: '/' end diff --git a/engines/dfc_provider/app/controllers/api/dfc_provider/products_controller.rb b/engines/dfc_provider/app/controllers/api/dfc_provider/products_controller.rb new file mode 100644 index 0000000000..c0e24eb6f9 --- /dev/null +++ b/engines/dfc_provider/app/controllers/api/dfc_provider/products_controller.rb @@ -0,0 +1,26 @@ +module Api::DfcProvider + class ProductsController < ActionController::Base + before_filter :set_enterprise + + def index + products = @enterprise.inventory_variants + .includes(:product, :inventory_items) + + products_json = DfcProvider::ProductSerializer + .new(@enterprise, products, base_url) + .serialized_json + + render json: products_json + end + + private + + def set_enterprise + @enterprise = ::Enterprise.find(params[:enterprise_id]) + end + + def base_url + "#{root_url}api/dfc_provider" + end + end +end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/product_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/product_serializer.rb new file mode 100644 index 0000000000..1422f72f02 --- /dev/null +++ b/engines/dfc_provider/app/serializers/dfc_provider/product_serializer.rb @@ -0,0 +1,28 @@ +module DfcProvider + class ProductSerializer + def initialize(enterprise, products, base_url) + @enterprise = enterprise + @products = products + @base_url = base_url + end + + def serialized_json + { + "@context" => + { + "DFC" => "http://datafoodconsortium.org/ontologies/DFC_FullModel.owl#", + "@base" => @base_url + }, + "@id" => "/enterprises/#{@enterprise.id}/products", + "DFC:supplies" => @products.map do |variant| + { + "DFC:description" => variant.name, + "DFC:quantity" => variant.total_on_hand, + "@id" => variant.id, + "DFC:hasUnit" => {"@id" => "/unit/#{variant.unit_description.presence || 'piece' }"} + } + end + }.to_json + end + end +end diff --git a/engines/dfc_provider/config/routes.rb b/engines/dfc_provider/config/routes.rb new file mode 100644 index 0000000000..800435932a --- /dev/null +++ b/engines/dfc_provider/config/routes.rb @@ -0,0 +1,9 @@ +DfcProvider::Engine.routes.draw do + namespace :api do + namespace :dfc_provider do + resources :enterprises, only: :none do + resources :products, only: %i[index] + end + end + end +end diff --git a/engines/dfc_provider/dfc_provider.gemspec b/engines/dfc_provider/dfc_provider.gemspec new file mode 100644 index 0000000000..d14ab9db5f --- /dev/null +++ b/engines/dfc_provider/dfc_provider.gemspec @@ -0,0 +1,16 @@ +$:.push File.expand_path("../lib", __FILE__) + +# Maintain your gem's version: +require "dfc_provider/version" + +# Describe your gem and declare its dependencies: +Gem::Specification.new do |s| + s.name = 'dfc_provider' + s.version = DfcProvider::VERSION + s.authors = ['Admin OFF'] + s.email = ['admin@openfoodfrance.org'] + s.summary = 'Provdes an API stack implementing DFC semantic specifications' + + s.files = Dir["{app,config,db,lib}/**/*"] + ['MIT-LICENSE', 'Rakefile', 'README.rdoc'] + s.test_files = Dir['test/**/*'] +end diff --git a/engines/dfc_provider/lib/dfc_provider.rb b/engines/dfc_provider/lib/dfc_provider.rb new file mode 100644 index 0000000000..feda25b81c --- /dev/null +++ b/engines/dfc_provider/lib/dfc_provider.rb @@ -0,0 +1,4 @@ +require "dfc_provider/engine" + +module DfcProvider +end diff --git a/engines/dfc_provider/lib/dfc_provider/engine.rb b/engines/dfc_provider/lib/dfc_provider/engine.rb new file mode 100644 index 0000000000..9ad5163c30 --- /dev/null +++ b/engines/dfc_provider/lib/dfc_provider/engine.rb @@ -0,0 +1,5 @@ +module DfcProvider + class Engine < ::Rails::Engine + isolate_namespace DfcProvider + end +end diff --git a/engines/dfc_provider/lib/dfc_provider/version.rb b/engines/dfc_provider/lib/dfc_provider/version.rb new file mode 100644 index 0000000000..bfe289fbeb --- /dev/null +++ b/engines/dfc_provider/lib/dfc_provider/version.rb @@ -0,0 +1,3 @@ +module DfcProvider + VERSION = "0.0.1" +end