aboutsummaryrefslogtreecommitdiffstats
path: root/app/controllers/tweets_controller.rb
blob: c6daedc07b44e2d845c249687893922c37ac04ed (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
130
131
132
class TweetsController < ApplicationController
  def show
    @tweet = Tweet.find(params[:id])
    @user = @tweet.user
    authorize_to_show_user! @user
    @replies_before = @tweet.reply_ancestors(2)
    @replies_after = @tweet.reply_descendants(2)
  end

  def user_index
    begin
      user_best
      render :user_best
    rescue Aclog::Exceptions::AccountPrivate
      user_timeline
      render :user_timeline
    end
  end

  def user_best
    @user = require_user
    authorize_to_show_user! @user
    authorize_to_show_user_best! @user
    @tweets = paginate_with_page_number(@user.tweets.reacted.order_by_reactions)
  end

  def user_recent
    @user = require_user
    authorize_to_show_user! @user
    authorize_to_show_user_best! @user
    @tweets = paginate_with_page_number(@user.tweets.reacted.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_discoveries
    @user = require_user
    authorize_to_show_user! @user
    @tweets = paginate(Tweet).discovered_by(@user).order_by_id
  end

  def user_favorites
    @user = require_user
    authorize_to_show_user! @user
    @tweets = paginate(Tweet).favorited_by(@user).order_by_id
  end

  def user_retweets
    @user = require_user
    authorize_to_show_user! @user
    @tweets = paginate(Tweet).retweeted_by(@user).order_by_id
  end

  def user_discovered_by
    @user = require_user
    authorize_to_show_user! @user
    @source_user = User.find(id: params[:user_id_b], screen_name: params[:screen_name_b])
    authorize_to_show_user! @source_user
    @tweets = paginate(@user.tweets).discovered_by(@source_user).order_by_id
  end

  def all_best
    @tweets = paginate_with_page_number(Tweet.reacted.order_by_reactions)
  end

  def all_recent
    @tweets = paginate_with_page_number(Tweet.recent.reacted.order_by_reactions)
  end

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

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

  def import
    raise Aclog::Exceptions::LoginRequired unless logged_in?
    tweet = current_user.account.import(params[:id])
    redirect_to tweet
  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.limit(params_count).page(@page)
  end

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

  def render(*args)
    if @tweets
      if @page
        @prev_url = @page == 1 ? nil : url_for(params.merge(page: @page - 1))
        @next_url = url_for(params.merge(page: @page + 1))
      else
        if @tweets.length > 0
          @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
    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