mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-01 02:03:22 +00:00
Merge pull request #4104 from luisramos0/convert_taxons_to_ams
Convert spree/api/taxons views from rabl to AMS
This commit is contained in:
12
app/controllers/api/taxonomies_controller.rb
Normal file
12
app/controllers/api/taxonomies_controller.rb
Normal file
@@ -0,0 +1,12 @@
|
||||
module Api
|
||||
class TaxonomiesController < Api::BaseController
|
||||
respond_to :json
|
||||
|
||||
skip_authorization_check only: :jstree
|
||||
|
||||
def jstree
|
||||
@taxonomy = Spree::Taxonomy.find(params[:id])
|
||||
render json: @taxonomy.root, serializer: Api::TaxonJstreeSerializer
|
||||
end
|
||||
end
|
||||
end
|
||||
71
app/controllers/api/taxons_controller.rb
Normal file
71
app/controllers/api/taxons_controller.rb
Normal file
@@ -0,0 +1,71 @@
|
||||
module Api
|
||||
class TaxonsController < Api::BaseController
|
||||
respond_to :json
|
||||
|
||||
skip_authorization_check only: [:index, :show, :jstree]
|
||||
|
||||
def index
|
||||
if taxonomy
|
||||
@taxons = taxonomy.root.children
|
||||
else
|
||||
if params[:ids]
|
||||
@taxons = Spree::Taxon.where(id: params[:ids].split(","))
|
||||
else
|
||||
@taxons = Spree::Taxon.ransack(params[:q]).result
|
||||
end
|
||||
end
|
||||
render json: @taxons, each_serializer: Api::TaxonSerializer
|
||||
end
|
||||
|
||||
def jstree
|
||||
@taxon = taxon
|
||||
render json: @taxon.children, each_serializer: Api::TaxonJstreeSerializer
|
||||
end
|
||||
|
||||
def create
|
||||
authorize! :create, Spree::Taxon
|
||||
@taxon = Spree::Taxon.new(params[:taxon])
|
||||
@taxon.taxonomy_id = params[:taxonomy_id]
|
||||
taxonomy = Spree::Taxonomy.find_by_id(params[:taxonomy_id])
|
||||
|
||||
if taxonomy.nil?
|
||||
@taxon.errors[:taxonomy_id] = I18n.t(:invalid_taxonomy_id, scope: 'spree.api')
|
||||
invalid_resource!(@taxon) && return
|
||||
end
|
||||
|
||||
@taxon.parent_id = taxonomy.root.id unless params[:taxon][:parent_id]
|
||||
|
||||
if @taxon.save
|
||||
render json: @taxon, serializer: Api::TaxonSerializer, status: :created
|
||||
else
|
||||
invalid_resource!(@taxon)
|
||||
end
|
||||
end
|
||||
|
||||
def update
|
||||
authorize! :update, Spree::Taxon
|
||||
if taxon.update_attributes(params[:taxon])
|
||||
render json: taxon, serializer: Api::TaxonSerializer, status: :ok
|
||||
else
|
||||
invalid_resource!(taxon)
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
authorize! :delete, Spree::Taxon
|
||||
taxon.destroy
|
||||
render json: taxon, serializer: Api::TaxonSerializer, status: :no_content
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def taxonomy
|
||||
return if params[:taxonomy_id].blank?
|
||||
@taxonomy ||= Spree::Taxonomy.find(params[:taxonomy_id])
|
||||
end
|
||||
|
||||
def taxon
|
||||
@taxon ||= taxonomy.taxons.find(params[:id])
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,75 +0,0 @@
|
||||
module Spree
|
||||
module Api
|
||||
class TaxonsController < Spree::Api::BaseController
|
||||
respond_to :json
|
||||
|
||||
def index
|
||||
if taxonomy
|
||||
@taxons = taxonomy.root.children
|
||||
else
|
||||
if params[:ids]
|
||||
@taxons = Taxon.where(id: params[:ids].split(","))
|
||||
else
|
||||
@taxons = Taxon.ransack(params[:q]).result
|
||||
end
|
||||
end
|
||||
respond_with(@taxons)
|
||||
end
|
||||
|
||||
def show
|
||||
@taxon = taxon
|
||||
respond_with(@taxon)
|
||||
end
|
||||
|
||||
def jstree
|
||||
show
|
||||
end
|
||||
|
||||
def create
|
||||
authorize! :create, Taxon
|
||||
@taxon = Taxon.new(params[:taxon])
|
||||
@taxon.taxonomy_id = params[:taxonomy_id]
|
||||
taxonomy = Taxonomy.find_by_id(params[:taxonomy_id])
|
||||
|
||||
if taxonomy.nil?
|
||||
@taxon.errors[:taxonomy_id] = I18n.t(:invalid_taxonomy_id, scope: 'spree.api')
|
||||
invalid_resource!(@taxon) && return
|
||||
end
|
||||
|
||||
@taxon.parent_id = taxonomy.root.id unless params[:taxon][:parent_id]
|
||||
|
||||
if @taxon.save
|
||||
respond_with(@taxon, status: 201, default_template: :show)
|
||||
else
|
||||
invalid_resource!(@taxon)
|
||||
end
|
||||
end
|
||||
|
||||
def update
|
||||
authorize! :update, Taxon
|
||||
if taxon.update_attributes(params[:taxon])
|
||||
respond_with(taxon, status: 200, default_template: :show)
|
||||
else
|
||||
invalid_resource!(taxon)
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
authorize! :delete, Taxon
|
||||
taxon.destroy
|
||||
respond_with(taxon, status: 204)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def taxonomy
|
||||
return if params[:taxonomy_id].blank?
|
||||
@taxonomy ||= Taxonomy.find(params[:taxonomy_id])
|
||||
end
|
||||
|
||||
def taxon
|
||||
@taxon ||= taxonomy.taxons.find(params[:id])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
5
app/serializers/api/taxon_jstree_attribute_serializer.rb
Normal file
5
app/serializers/api/taxon_jstree_attribute_serializer.rb
Normal file
@@ -0,0 +1,5 @@
|
||||
module Api
|
||||
class TaxonJstreeAttributeSerializer < ActiveModel::Serializer
|
||||
attributes :id, :name
|
||||
end
|
||||
end
|
||||
18
app/serializers/api/taxon_jstree_serializer.rb
Normal file
18
app/serializers/api/taxon_jstree_serializer.rb
Normal file
@@ -0,0 +1,18 @@
|
||||
module Api
|
||||
class TaxonJstreeSerializer < ActiveModel::Serializer
|
||||
attributes :data, :state
|
||||
has_one :attr, serializer: TaxonJstreeAttributeSerializer
|
||||
|
||||
def data
|
||||
object.name
|
||||
end
|
||||
|
||||
def attr
|
||||
object
|
||||
end
|
||||
|
||||
def state
|
||||
"closed"
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -2,7 +2,7 @@ class Api::TaxonSerializer < ActiveModel::Serializer
|
||||
cached
|
||||
delegate :cache_key, to: :object
|
||||
|
||||
attributes :id, :name, :permalink, :icon
|
||||
attributes :id, :name, :permalink, :icon, :pretty_name, :position, :parent_id, :taxonomy_id
|
||||
|
||||
def icon
|
||||
object.icon(:original)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<script>
|
||||
Spree.routes = <%== {
|
||||
:variants_search => spree.admin_search_variants_path(:format => 'json'),
|
||||
:taxons_search => spree.api_taxons_path(:format => 'json'),
|
||||
:taxons_search => main_app.api_taxons_path(:format => 'json'),
|
||||
:user_search => spree.admin_search_users_path(:format => 'json'),
|
||||
:orders_api => spree.api_orders_path(:format => 'json')
|
||||
}.to_json %>;
|
||||
|
||||
@@ -44,5 +44,18 @@ Openfoodnetwork::Application.routes.draw do
|
||||
resources :enterprise_fees, only: [:destroy]
|
||||
|
||||
post '/product_images/:product_id', to: 'product_images#update_product_image'
|
||||
|
||||
resources :taxons, :only => [:index]
|
||||
|
||||
resources :taxonomies do
|
||||
member do
|
||||
get :jstree
|
||||
end
|
||||
resources :taxons do
|
||||
member do
|
||||
get :jstree
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -74,16 +74,6 @@ Spree::Core::Engine.routes.prepend do
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
resources :taxons, :only => [:index]
|
||||
|
||||
resources :taxonomies do
|
||||
resources :taxons do
|
||||
member do
|
||||
get :jstree
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
namespace :admin do
|
||||
|
||||
32
spec/controllers/api/taxonomies_controller_spec.rb
Normal file
32
spec/controllers/api/taxonomies_controller_spec.rb
Normal file
@@ -0,0 +1,32 @@
|
||||
require 'spec_helper'
|
||||
|
||||
module Api
|
||||
describe TaxonomiesController do
|
||||
render_views
|
||||
|
||||
let(:taxonomy) { create(:taxonomy) }
|
||||
let(:taxon) { create(:taxon, name: "Ruby", taxonomy: taxonomy) }
|
||||
let(:taxon2) { create(:taxon, name: "Rails", taxonomy: taxonomy) }
|
||||
let(:attributes) { [:id, :name] }
|
||||
|
||||
before do
|
||||
allow(controller).to receive(:spree_current_user) { current_api_user }
|
||||
|
||||
taxon2.children << create(:taxon, name: "3.2.2", taxonomy: taxonomy)
|
||||
taxon.children << taxon2
|
||||
taxonomy.root.children << taxon
|
||||
end
|
||||
|
||||
context "as a normal user" do
|
||||
let(:current_api_user) { build(:user) }
|
||||
|
||||
it "gets the jstree-friendly version of a taxonomy" do
|
||||
api_get :jstree, id: taxonomy.id
|
||||
|
||||
json_response["data"].should eq(taxonomy.root.name)
|
||||
json_response["attr"].should eq("id" => taxonomy.root.id, "name" => taxonomy.root.name)
|
||||
json_response["state"].should eq("closed")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
117
spec/controllers/api/taxons_controller_spec.rb
Normal file
117
spec/controllers/api/taxons_controller_spec.rb
Normal file
@@ -0,0 +1,117 @@
|
||||
require 'spec_helper'
|
||||
|
||||
describe Api::TaxonsController do
|
||||
render_views
|
||||
|
||||
let(:taxonomy) { create(:taxonomy) }
|
||||
let(:taxon) { create(:taxon, name: "Ruby", taxonomy: taxonomy) }
|
||||
let(:taxon2) { create(:taxon, name: "Rails", taxonomy: taxonomy) }
|
||||
let(:attributes) {
|
||||
["id", "name", "pretty_name", "permalink", "position", "parent_id", "taxonomy_id"]
|
||||
}
|
||||
|
||||
before do
|
||||
allow(controller).to receive(:spree_current_user) { current_api_user }
|
||||
|
||||
taxon2.children << create(:taxon, name: "3.2.2", taxonomy: taxonomy)
|
||||
taxon.children << taxon2
|
||||
taxonomy.root.children << taxon
|
||||
end
|
||||
|
||||
context "as a normal user" do
|
||||
let(:current_api_user) { build(:user) }
|
||||
|
||||
it "gets all taxons for a taxonomy" do
|
||||
api_get :index, taxonomy_id: taxonomy.id
|
||||
|
||||
expect(json_response.first['name']).to eq taxon.name
|
||||
end
|
||||
|
||||
it "gets all taxons" do
|
||||
api_get :index
|
||||
|
||||
expect(json_response.first['name']).to eq taxonomy.root.name
|
||||
end
|
||||
|
||||
it "can search for a single taxon" do
|
||||
api_get :index, q: { name_cont: "Ruby" }
|
||||
|
||||
expect(json_response.count).to eq(1)
|
||||
expect(json_response.first['name']).to eq "Ruby"
|
||||
end
|
||||
|
||||
it "gets all taxons in JSTree form" do
|
||||
api_get :jstree, taxonomy_id: taxonomy.id, id: taxon.id
|
||||
|
||||
response = json_response.first
|
||||
response["data"].should eq(taxon2.name)
|
||||
response["attr"].should eq("name" => taxon2.name, "id" => taxon2.id)
|
||||
response["state"].should eq("closed")
|
||||
end
|
||||
|
||||
it "cannot create a new taxon if not an admin" do
|
||||
api_post :create, taxonomy_id: taxonomy.id, taxon: { name: "Location" }
|
||||
|
||||
assert_unauthorized!
|
||||
end
|
||||
|
||||
it "cannot update a taxon" do
|
||||
api_put :update, taxonomy_id: taxonomy.id,
|
||||
id: taxon.id,
|
||||
taxon: { name: "I hacked your store!" }
|
||||
|
||||
assert_unauthorized!
|
||||
end
|
||||
|
||||
it "cannot delete a taxon" do
|
||||
api_delete :destroy, taxonomy_id: taxonomy.id, id: taxon.id
|
||||
|
||||
assert_unauthorized!
|
||||
end
|
||||
end
|
||||
|
||||
context "as an admin" do
|
||||
let(:current_api_user) { build(:admin_user) }
|
||||
|
||||
it "can create" do
|
||||
api_post :create, taxonomy_id: taxonomy.id, taxon: { name: "Colors" }
|
||||
|
||||
expect(attributes.all? { |a| json_response.include? a }).to be true
|
||||
expect(response.status).to eq(201)
|
||||
|
||||
expect(taxonomy.reload.root.children.count).to eq 2
|
||||
|
||||
expect(Spree::Taxon.last.parent_id).to eq taxonomy.root.id
|
||||
expect(Spree::Taxon.last.taxonomy_id).to eq taxonomy.id
|
||||
end
|
||||
|
||||
it "cannot create a new taxon with invalid attributes" do
|
||||
api_post :create, taxonomy_id: taxonomy.id, taxon: {}
|
||||
|
||||
expect(response.status).to eq(422)
|
||||
expect(json_response["error"]).to eq("Invalid resource. Please fix errors and try again.")
|
||||
errors = json_response["errors"]
|
||||
|
||||
expect(taxonomy.reload.root.children.count).to eq 1
|
||||
end
|
||||
|
||||
it "cannot create a new taxon with invalid taxonomy_id" do
|
||||
api_post :create, taxonomy_id: 1000, taxon: { name: "Colors" }
|
||||
|
||||
expect(response.status).to eq(422)
|
||||
expect(json_response["error"]).to eq("Invalid resource. Please fix errors and try again.")
|
||||
|
||||
errors = json_response["errors"]
|
||||
expect(errors["taxonomy_id"]).not_to be_nil
|
||||
expect(errors["taxonomy_id"].first).to eq "Invalid taxonomy id."
|
||||
|
||||
expect(taxonomy.reload.root.children.count).to eq 1
|
||||
end
|
||||
|
||||
it "can destroy" do
|
||||
api_delete :destroy, taxonomy_id: taxonomy.id, id: taxon2.id
|
||||
|
||||
expect(response.status).to eq(204)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,135 +0,0 @@
|
||||
require 'spec_helper'
|
||||
|
||||
module Spree
|
||||
describe Api::TaxonsController do
|
||||
render_views
|
||||
|
||||
let(:taxonomy) { create(:taxonomy) }
|
||||
let(:taxon) { create(:taxon, name: "Ruby", taxonomy: taxonomy) }
|
||||
let(:taxon2) { create(:taxon, name: "Rails", taxonomy: taxonomy) }
|
||||
let(:attributes) {
|
||||
["id", "name", "pretty_name", "permalink", "position", "parent_id", "taxonomy_id"]
|
||||
}
|
||||
|
||||
before do
|
||||
allow(controller).to receive(:spree_current_user) { current_api_user }
|
||||
|
||||
taxon2.children << create(:taxon, name: "3.2.2", taxonomy: taxonomy)
|
||||
taxon.children << taxon2
|
||||
taxonomy.root.children << taxon
|
||||
end
|
||||
|
||||
context "as a normal user" do
|
||||
let(:current_api_user) { build(:user) }
|
||||
|
||||
it "gets all taxons for a taxonomy" do
|
||||
api_get :index, taxonomy_id: taxonomy.id
|
||||
|
||||
expect(json_response.first['name']).to eq taxon.name
|
||||
children = json_response.first['taxons']
|
||||
expect(children.count).to eq 1
|
||||
expect(children.first['name']).to eq taxon2.name
|
||||
expect(children.first['taxons'].count).to eq 1
|
||||
end
|
||||
|
||||
it "gets all taxons" do
|
||||
api_get :index
|
||||
|
||||
expect(json_response.first['name']).to eq taxonomy.root.name
|
||||
children = json_response.first['taxons']
|
||||
expect(children.count).to eq 1
|
||||
expect(children.first['name']).to eq taxon.name
|
||||
expect(children.first['taxons'].count).to eq 1
|
||||
end
|
||||
|
||||
it "can search for a single taxon" do
|
||||
api_get :index, q: { name_cont: "Ruby" }
|
||||
|
||||
expect(json_response.count).to eq(1)
|
||||
expect(json_response.first['name']).to eq "Ruby"
|
||||
end
|
||||
|
||||
it "gets a single taxon" do
|
||||
api_get :show, id: taxon.id, taxonomy_id: taxonomy.id
|
||||
|
||||
expect(json_response['name']).to eq taxon.name
|
||||
expect(json_response['taxons'].count).to eq 1
|
||||
end
|
||||
|
||||
it "gets all taxons in JSTree form" do
|
||||
api_get :jstree, taxonomy_id: taxonomy.id, id: taxon.id
|
||||
|
||||
response = json_response.first
|
||||
response["data"].should eq(taxon2.name)
|
||||
response["attr"].should eq("name" => taxon2.name, "id" => taxon2.id)
|
||||
response["state"].should eq("closed")
|
||||
end
|
||||
|
||||
it "can learn how to create a new taxon" do
|
||||
api_get :new, taxonomy_id: taxonomy.id
|
||||
expect(json_response["attributes"]).to eq(attributes.map(&:to_s))
|
||||
required_attributes = json_response["required_attributes"]
|
||||
expect(required_attributes).to include("name")
|
||||
end
|
||||
|
||||
it "cannot create a new taxon if not an admin" do
|
||||
api_post :create, taxonomy_id: taxonomy.id, taxon: { name: "Location" }
|
||||
assert_unauthorized!
|
||||
end
|
||||
|
||||
it "cannot update a taxon" do
|
||||
api_put :update, taxonomy_id: taxonomy.id,
|
||||
id: taxon.id,
|
||||
taxon: { name: "I hacked your store!" }
|
||||
assert_unauthorized!
|
||||
end
|
||||
|
||||
it "cannot delete a taxon" do
|
||||
api_delete :destroy, taxonomy_id: taxonomy.id, id: taxon.id
|
||||
assert_unauthorized!
|
||||
end
|
||||
end
|
||||
|
||||
context "as an admin" do
|
||||
let(:current_api_user) { build(:admin_user) }
|
||||
|
||||
it "can create" do
|
||||
api_post :create, taxonomy_id: taxonomy.id, taxon: { name: "Colors" }
|
||||
|
||||
expect(attributes.all? { |a| json_response.include? a }).to be true
|
||||
expect(response.status).to eq(201)
|
||||
|
||||
expect(taxonomy.reload.root.children.count).to eq 2
|
||||
|
||||
expect(Spree::Taxon.last.parent_id).to eq taxonomy.root.id
|
||||
expect(Spree::Taxon.last.taxonomy_id).to eq taxonomy.id
|
||||
end
|
||||
|
||||
it "cannot create a new taxon with invalid attributes" do
|
||||
api_post :create, taxonomy_id: taxonomy.id, taxon: {}
|
||||
expect(response.status).to eq(422)
|
||||
expect(json_response["error"]).to eq("Invalid resource. Please fix errors and try again.")
|
||||
errors = json_response["errors"]
|
||||
|
||||
expect(taxonomy.reload.root.children.count).to eq 1
|
||||
end
|
||||
|
||||
it "cannot create a new taxon with invalid taxonomy_id" do
|
||||
api_post :create, taxonomy_id: 1000, taxon: { name: "Colors" }
|
||||
expect(response.status).to eq(422)
|
||||
expect(json_response["error"]).to eq("Invalid resource. Please fix errors and try again.")
|
||||
|
||||
errors = json_response["errors"]
|
||||
expect(errors["taxonomy_id"]).not_to be_nil
|
||||
expect(errors["taxonomy_id"].first).to eq "Invalid taxonomy id."
|
||||
|
||||
expect(taxonomy.reload.root.children.count).to eq 1
|
||||
end
|
||||
|
||||
it "can destroy" do
|
||||
api_delete :destroy, taxonomy_id: taxonomy.id, id: taxon2.id
|
||||
expect(response.status).to eq(204)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user