FEATURE: Embed topics list on remote sites via Javascript API. (#8008)

This adds support for a `<d-topics-list>` tag you can embed in your site
that will be rendered as a list of discourse topics. Any attributes on
the tag will be passed as filters. For example:

`<d-topics-list discourse-url="URL" category="1234">` will filter to category 1234.

To use this feature, enable the `embed topics list` site setting. Then
on the site you want to embed, include the following javascript:

`<script
src="http://URL/javascripts/embed-topics.js"></script>`

Where `URL` is your discourse forum's URL.

Then include the `<d-topics-list discourse-url="URL">` tag in your HTML document and it will
be replaced with the list of topics.
This commit is contained in:
Robin Ward
2019-08-15 13:41:06 -04:00
committed by GitHub
parent fafc6bcde0
commit 23367e79ea
12 changed files with 171 additions and 29 deletions

View File

@ -70,6 +70,33 @@ describe EmbedController do
end
end
context "#topics" do
it "raises an error when not enabled" do
get '/embed/topics?embed_id=de-1234'
expect(response.status).to eq(400)
end
context "when enabled" do
before do
SiteSetting.embed_topics_list = true
end
it "raises an error with a weird id" do
get '/embed/topics?discourse_embed_id=../asdf/-1234', headers: headers
expect(response.status).to eq(400)
end
it "returns a list of topics" do
topic = Fabricate(:topic)
get '/embed/topics?discourse_embed_id=de-1234', headers: headers
expect(response.status).to eq(200)
expect(response.headers['X-Frame-Options']).to eq("ALLOWALL")
expect(response.body).to match("data-embed-id=\"de-1234\"")
expect(response.body).to match("data-topic-id=\"#{topic.id}\"")
end
end
end
context "with a host" do
let!(:embeddable_host) { Fabricate(:embeddable_host) }
let(:headers) { { 'REFERER' => embed_url } }