instructure/inst-lti-twitter

View on GitHub
app/controllers/inst_lti_twitter/api_controller.rb

Summary

Maintainability
A
35 mins
Test Coverage
require_dependency "inst_lti_twitter/application_controller"
require 'twitter'
require 'ims/lti'

module InstLtiTwitter
  class ApiController < ApplicationController
    def xml_config
      host = "#{request.protocol}#{request.host_with_port}"
      url = "#{host}#{root_path}"
      title = "Twitter"
      tool_id = "twitter_lti"
      script_name = request.env['SCRIPT_NAME']
      tc = IMS::LTI::ToolConfig.new(:title => title, :launch_url => url)
      tc.extend IMS::LTI::Extensions::Canvas::ToolConfig
      tc.description = "Embed a Twitter stream"
      tc.canvas_privacy_anonymous!
      tc.canvas_domain!(request.host)
      tc.canvas_icon_url!("#{host}/assets/inst_lti_twitter/icon.png")
      tc.canvas_text!(title)
      tc.set_ext_param('canvas.instructure.com', :tool_id, tool_id)
      tc.canvas_editor_button!(enabled: true)
      tc.canvas_resource_selection!(enabled: true)
      render xml: tc.to_xml
    end

    def health_check
      head 200
    end

    def tweets
      client = Twitter::REST::Client.new do |config|
        config.consumer_key        = ENV["INST_LTI_TWITTER_CONSUMER_KEY"]
        config.consumer_secret     = ENV["INST_LTI_TWITTER_CONSUMER_SECRET"]
        config.access_token        = ENV["INST_LTI_TWITTER_ACCESS_TOKEN"]
        config.access_token_secret = ENV["INST_LTI_TWITTER_ACCESS_TOKEN_SECRET"]
      end
      max = params[:max] || 10
      tweets = []
      if params[:hashtag].present?
        tweets = client.search("##{params[:hashtag]}", count: max, result_type: "recent")
      elsif params[:username].present?
        tweets = client.user_timeline(params[:username], count: max, result_type: "recent")
      end
      render json: tweets
    end

    def embed
      tp = IMS::LTI::ToolProvider.new(nil, nil, params[:launch_params])
      tp.extend IMS::LTI::Extensions::Content::ToolProvider

      title, url = generate_url(params)
      width = 500
      height = 530
      redirect_url = build_url(tp, title, url, width, height)

      if redirect_url.present?
        render json: { redirectUrl: redirect_url }
      else
        render json: {
          url: url,
          title: title,
          width: width,
          height: height
        }
      end
    end

  private

    def generate_url(params)
      url = root_url
      if params[:hashtag].present?
        title = "##{params[:hashtag]}"
        url += "?hashtag=#{params[:hashtag]}"
      else
        title = "@#{params[:username]}"
        url += "?username=#{params[:username]}"
      end
      url += "&embedded=1"
      url += "&max=#{params[:max] || 10}"
      title = "Twitter: #{title}"
      [title, url]
    end

    def build_url(tp, title, url, width, height)
      if tp.accepts_content?
        if tp.accepts_iframe?
          redirect_url = tp.iframe_content_return_url(url, width, height, title)
        elsif tp.accepts_url?
          redirect_url = tp.url_content_return_url(url, title)
        elsif tp.accepts_lti_launch_url?
          redirect_url = tp.lti_launch_content_return_url(url, title, title)
        end
        return redirect_url
      end
    end
  end
end