/api/app/controllers/spree/api/taxons_controller.rb

https://github.com/solidusio/solidus · Ruby · 126 lines · 119 code · 6 blank · 1 comment · 1 complexity · 8c3f5ae1611e8097494de6254dbd8410 MD5 · raw file

  1. # frozen_string_literal: true
  2. module Spree
  3. module Api
  4. class TaxonsController < Spree::Api::BaseController
  5. def index
  6. if taxonomy
  7. @taxons = taxonomy.root.children
  8. elsif params[:ids]
  9. @taxons = Spree::Taxon.accessible_by(current_ability).where(id: params[:ids].split(','))
  10. else
  11. @taxons = Spree::Taxon.accessible_by(current_ability).order(:taxonomy_id, :lft).ransack(params[:q]).result
  12. end
  13. unless params[:without_children]
  14. @taxons = @taxons.includes(:children)
  15. end
  16. @taxons = paginate(@taxons)
  17. preload_taxon_parents(@taxons)
  18. respond_with(@taxons)
  19. end
  20. def new
  21. end
  22. def show
  23. @taxon = taxon
  24. respond_with(@taxon)
  25. end
  26. def jstree
  27. Spree::Deprecation.warn("Please don't use `/api/taxonomies/:taxonomy_id/taxons/:taxon_id/jstree` endpoint. It is deprecated and will be removed in the next future.", caller)
  28. show
  29. end
  30. def create
  31. authorize! :create, Taxon
  32. @taxon = Spree::Taxon.new(taxon_params)
  33. @taxon.taxonomy_id = params[:taxonomy_id]
  34. taxonomy = Spree::Taxonomy.find_by(id: params[:taxonomy_id])
  35. if taxonomy.nil?
  36. @taxon.errors.add(:taxonomy_id, I18n.t('spree.api.invalid_taxonomy_id'))
  37. invalid_resource!(@taxon) && return
  38. end
  39. @taxon.parent_id = taxonomy.root.id unless params[:taxon][:parent_id]
  40. if @taxon.save
  41. respond_with(@taxon, status: 201, default_template: :show)
  42. else
  43. invalid_resource!(@taxon)
  44. end
  45. end
  46. def update
  47. authorize! :update, taxon
  48. if taxon.update(taxon_params)
  49. respond_with(taxon, status: 200, default_template: :show)
  50. else
  51. invalid_resource!(taxon)
  52. end
  53. end
  54. def destroy
  55. authorize! :destroy, taxon
  56. taxon.destroy
  57. respond_with(taxon, status: 204)
  58. end
  59. def products
  60. # Returns the products sorted by their position with the classification
  61. # Products#index does not do the sorting.
  62. taxon = Spree::Taxon.find(params[:id])
  63. @products = paginate(taxon.products.ransack(params[:q]).result)
  64. @products = @products.includes(master: :default_price)
  65. if params[:simple]
  66. @exclude_data = {
  67. variants: true,
  68. option_types: true,
  69. product_properties: true,
  70. classifications: true
  71. }
  72. @product_attributes = %i(id name display_price)
  73. end
  74. render "spree/api/products/index"
  75. end
  76. private
  77. def default_per_page
  78. 500
  79. end
  80. def taxonomy
  81. if params[:taxonomy_id].present?
  82. @taxonomy ||= Spree::Taxonomy.accessible_by(current_ability, :show).find(params[:taxonomy_id])
  83. end
  84. end
  85. def taxon
  86. @taxon ||= taxonomy.taxons.accessible_by(current_ability, :show).find(params[:id])
  87. end
  88. def taxon_params
  89. if params[:taxon] && !params[:taxon].empty?
  90. params.require(:taxon).permit(permitted_taxon_attributes)
  91. else
  92. {}
  93. end
  94. end
  95. def preload_taxon_parents(taxons)
  96. parents = Spree::Taxon.none
  97. taxons.map do |taxon|
  98. parents = parents.or(taxon.ancestors)
  99. end
  100. Spree::Taxon.associate_parents(taxons + parents)
  101. end
  102. end
  103. end
  104. end