aboutsummaryrefslogtreecommitdiffstats
path: root/app/controllers/tweets_controller.rb
blob: cfe96cdff774d238403e2e56cae36bef075ae71a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
class TweetsController < ApplicationController
  def show
    @tweet = Tweet.find(params[:id])
    @user = @tweet.user
    authorize_to_show_user! @user
  rescue ActiveRecord::RecordNotFound
    import
  end

  def import
    tweet = Tweet.find_by(id: params[:id])

    if tweet && tweet.user.registered?
      account = tweet.user.account
    elsif logged_in?
      account = current_user.account
    else
      account = nil
    end

    tweet = Tweet.import_from_twitter(params[:id], account)
    redirect_to tweet
  end

  def user_index
    @user = require_user
    authorize_to_show_user! @user

    if @user.registered?
      user_best
      render :user_best
    else
      user_timeline
      render :user_timeline
    end
  end

  def user_best
    @user = require_user
    authorize_to_show_user! @user

    @tweets = paginate_with_page_number @user.tweets.reacted.parse_recent(params[:recent]).order_by_reactions
  end

  def user_timeline
    @user = require_user
    authorize_to_show_user! @user
    @tweets = paginate @user.tweets.reacted(params[:reactions]).order_by_id
  end

  def user_favorites
    @user = require_user
    authorize_to_show_user! @user
    @tweets = paginate_with_page_number Tweet.reacted(params[:reactions]).favorited_by(@user).order("`favorites`.`id` DESC")
  end

  def user_favorited_by
    @user = require_user
    authorize_to_show_user! @user
    @source_user = User.find(id: params[:source_user_id], screen_name: params[:source_screen_name])
    authorize_to_show_user! @source_user
    @tweets = paginate @user.tweets.reacted(params[:reactions]).favorited_by(@source_user).order_by_id
  end

  def all_best
    @tweets = paginate_with_page_number Tweet.reacted.parse_recent(params[:recent]).order_by_reactions
  end

  def all_timeline
    @tweets = paginate Tweet.reacted(params[:reactions]).order_by_id
  end

  def filter
    @tweets = paginate Tweet.recent((params[:period] || 7).days).filter_by_query(params[:q].to_s).order_by_id
  end

  # /i/:id/{favorites,retweets}.json
  def tweet_responses
    show
    users = params[:type] == "favorites" ? @tweet.favoriters : @tweet.retweeters
    render json: { html: render_to_string("_tweet_stats_users", locals: { tweet: @tweet, users: users, count: nil }, formats: :html, layout: nil) }
  end

  private
  def require_user
    User.find(id: params[:user_id], screen_name: params[:screen_name])
  end

  def paginate(tweets)
    if params[:page]
      paginate_with_page_number tweets
    else
      tweets.limit(params_count).max_id(params[:max_id]).since_id(params[:since_id])
    end
  end

  def paginate_with_page_number(tweets)
    @page = (params[:page] || 1).to_i
    tweets.page(@page, params_count)
  end

  def params_count
    [(params[:count] || Settings.tweets.count.default).to_i, Settings.tweets.count.max].min
  end

  def render(*args)
    if @tweets && @tweets.is_a?(ActiveRecord::Relation)
      @tweets = @tweets.eager_load(:user)
    end

    if @tweets && @tweets.length > 0
      if @page
        @prev_url = @page == 1 ? nil : url_for(params.merge(page: @page - 1))
        @next_url = url_for(params.merge(page: @page + 1))
      else
        @prev_url = url_for(params.tap {|h| h.delete(:max_id) }.merge(since_id: @tweets.first.id))
        @next_url = url_for(params.tap {|h| h.delete(:since_id) }.merge(max_id: @tweets.last.id - 1))
      end
    end

    if @tweets && request.xhr?
      super(json: { html: render_to_string(partial: "tweet", collection: @tweets, as: :tweet, formats: :html),
                    next_url: @next_url,
                    prev_url: @prev_url })
    else
      super(*args)
    end
  end
end