Skip to content

Commit

Permalink
Send language_id to Api::PagesController#index so Pages can be restri…
Browse files Browse the repository at this point in the history
…cted to the language of the page.

.
  • Loading branch information
dbwinger authored and tvdeyen committed Mar 10, 2022
1 parent 17e7df1 commit 0a54b63
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 10 deletions.
6 changes: 4 additions & 2 deletions app/controllers/alchemy/api/pages_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@ class Api::PagesController < Api::BaseController
# Returns all pages as json object
#
def index
language = Alchemy::Language.find_by(id: params[:language_id]) || Alchemy::Language.current

# Fix for cancancan not able to merge multiple AR scopes for logged in users
if cannot? :edit_content, Alchemy::Page
@pages = Alchemy::Page.accessible_by(current_ability, :index)
@pages = @pages.where(language: Language.current)
@pages = @pages.where(language: language)
else
@pages = Language.current&.pages.presence || Alchemy::Page.none
@pages = language&.pages.presence || Alchemy::Page.none
end
@pages = @pages.includes(*page_includes)
@pages = @pages.ransack(params[:q]).result
Expand Down
2 changes: 1 addition & 1 deletion app/views/alchemy/essences/_essence_page_editor.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<script>
$('#<%= essence_page_editor.form_field_id %>').alchemyPageSelect({
placeholder: "<%= Alchemy.t(:search_page) %>",
url: "<%= alchemy.api_pages_path %>",
url: "<%= alchemy.api_pages_path language_id: essence_page_editor.page&.language_id %>",
query_params: <%== essence_page_editor.settings[:query_params].to_json %>,
<% if essence_page_editor.essence.page %>
initialSelection: {
Expand Down
40 changes: 33 additions & 7 deletions spec/controllers/alchemy/api/pages_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,19 @@ module Alchemy
routes { Alchemy::Engine.routes }

describe "#index" do
context "without a Language present" do
let(:result) { JSON.parse(response.body) }
let(:result) { JSON.parse(response.body) }

context "without a default language present" do

it "returns JSON" do
get :index, params: { format: :json }
expect(result["pages"]).to eq([])
end
end

context "with a language and a page present" do
let!(:page) { create(:alchemy_page, :public) }
let(:result) { JSON.parse(response.body) }
context "with a default language and a page present" do
let!(:default_language) { create(:alchemy_language, :english, default: true) }
let!(:page) { create(:alchemy_page, :public, language: default_language) }

it "returns JSON" do
get :index, params: { format: :json }
Expand Down Expand Up @@ -56,8 +57,8 @@ module Alchemy
end

context "with page param given" do
let!(:page1) { create(:alchemy_page) }
let!(:page2) { create(:alchemy_page) }
let!(:page1) { create(:alchemy_page, language: default_language) }
let!(:page2) { create(:alchemy_page, language: default_language) }

before do
expect(Kaminari.config).to receive(:default_per_page).at_least(:once) { 1 }
Expand Down Expand Up @@ -92,6 +93,31 @@ module Alchemy
expect(result["pages"].map { |r| r["id"] }).to_not include(site_2_page.id)
end
end

context "with language_id param" do
subject { get :index, params: { format: :json, language_id: try(:language)&.id } }

let!(:default_language_page) { create(:alchemy_page, :public, language: default_language, name: "same-name") }

context "when a language with that id exists" do
let(:language) { create(:alchemy_language, :klingon) }
let!(:default_language_page) { create(:alchemy_page, :public, language: default_language, name: "same-name") }
let!(:klingon_page) { create(:alchemy_page, :public, language: language, name: "same-name") }

it "only returns results from that language" do
subject
expect(result["pages"].map { |r| r["id"] }).to match_array [language.pages.root.id, klingon_page.id]
end
end

context "when a language with that id does not exist" do
it "uses the default language" do
subject
expect(result["pages"].map { |r| r["id"] }).to include(default_language_page.id)
expect(result["pages"].map { |r| r["language_code"] }).not_to include("kl")
end
end
end
end

describe "#nested" do
Expand Down

0 comments on commit 0a54b63

Please sign in to comment.