2013-12-31 14:37:43 -05:00
class EmbedController < ApplicationController
2015-05-20 17:12:16 +10:00
skip_before_filter :check_xhr , :preload_json , :verify_authenticity_token
2015-05-06 01:00:31 +00:00
before_filter :ensure_embeddable , except : [ :info ]
before_filter :ensure_api_request , only : [ :info ]
2013-12-31 14:37:43 -05:00
layout 'embed'
2014-01-03 12:52:24 -05:00
def comments
2015-06-09 16:24:04 -04:00
embed_url = params [ :embed_url ]
2016-02-25 11:16:27 +00:00
embed_username = params [ :discourse_username ]
2015-06-09 16:24:04 -04:00
topic_id = nil
if embed_url . present?
topic_id = TopicEmbed . topic_id_for_embed ( embed_url )
else
topic_id = params [ :topic_id ] . to_i
end
2013-12-31 14:37:43 -05:00
if topic_id
2014-06-18 17:39:12 -04:00
@topic_view = TopicView . new ( topic_id ,
current_user ,
limit : SiteSetting . embed_post_limit ,
exclude_first : true ,
2016-05-03 15:01:20 -04:00
exclude_deleted_users : true ,
exclude_hidden : true )
2014-06-18 17:39:12 -04:00
2014-01-02 12:15:48 -05:00
@second_post_url = " #{ @topic_view . topic . url } /2 " if @topic_view
2014-01-03 14:55:37 -05:00
@posts_left = 0
if @topic_view && @topic_view . posts . size == SiteSetting . embed_post_limit
2015-05-11 13:56:21 +05:30
@posts_left = @topic_view . topic . posts_count - SiteSetting . embed_post_limit - 1
2014-01-03 14:55:37 -05:00
end
2015-06-09 16:24:04 -04:00
2015-11-20 14:27:30 -05:00
if @topic_view
@reply_count = @topic_view . topic . posts_count - 1
@reply_count = 0 if @reply_count < 0
end
2015-11-20 13:05:45 -05:00
2015-06-09 16:24:04 -04:00
elsif embed_url . present?
2016-04-25 10:47:38 +10:00
Jobs . enqueue ( :retrieve_topic ,
user_id : current_user . try ( :id ) ,
embed_url : embed_url ,
author_username : embed_username ,
referer : request . env [ 'HTTP_REFERER' ]
)
2013-12-31 14:37:43 -05:00
render 'loading'
end
discourse_expires_in 1 . minute
end
2015-05-06 01:00:31 +00:00
def info
embed_url = params . require ( :embed_url )
@topic_embed = TopicEmbed . where ( embed_url : embed_url ) . first
raise Discourse :: NotFound if @topic_embed . nil?
render_serialized ( @topic_embed , TopicEmbedSerializer , root : false )
end
2014-01-13 12:47:24 -05:00
def count
2014-05-20 15:20:02 -04:00
embed_urls = params [ :embed_url ]
2014-01-13 12:47:24 -05:00
by_url = { }
2014-05-20 15:20:02 -04:00
if embed_urls . present?
urls = embed_urls . map { | u | u . sub ( / # discourse-comments$ / , '' ) . sub ( / \/ $ / , '' ) }
topic_embeds = TopicEmbed . where ( embed_url : urls ) . includes ( :topic ) . references ( :topic )
topic_embeds . each do | te |
2015-05-01 18:34:45 +05:30
url = te . embed_url
2014-05-20 15:20:02 -04:00
url = " #{ url } # discourse-comments " unless params [ :embed_url ] . include? ( url )
by_url [ url ] = I18n . t ( 'embed.replies' , count : te . topic . posts_count - 1 )
end
2014-01-13 12:47:24 -05:00
end
2014-04-14 12:15:41 -04:00
render json : { counts : by_url } , callback : params [ :callback ]
2014-01-13 12:47:24 -05:00
end
2013-12-31 14:37:43 -05:00
private
2015-05-06 01:00:31 +00:00
def ensure_api_request
raise Discourse :: InvalidAccess . new ( 'api key not set' ) if ! is_api?
end
2013-12-31 14:37:43 -05:00
def ensure_embeddable
2014-01-02 11:32:50 -05:00
if ! ( Rails . env . development? && current_user . try ( :admin? ) )
2015-08-18 17:15:46 -04:00
raise Discourse :: InvalidAccess . new ( 'invalid referer host' ) unless EmbeddableHost . host_allowed? ( request . referer )
2014-01-02 11:32:50 -05:00
end
2013-12-31 14:37:43 -05:00
response . headers [ 'X-Frame-Options' ] = " ALLOWALL "
rescue URI :: InvalidURIError
raise Discourse :: InvalidAccess . new ( 'invalid referer host' )
end
end