aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/controllers/tweets_controller.rb82
-rw-r--r--app/helpers/application_helper.rb5
-rw-r--r--app/models/account.rb6
-rw-r--r--app/models/tweet.rb42
4 files changed, 64 insertions, 71 deletions
diff --git a/app/controllers/tweets_controller.rb b/app/controllers/tweets_controller.rb
index 737132d..dc46d8a 100644
--- a/app/controllers/tweets_controller.rb
+++ b/app/controllers/tweets_controller.rb
@@ -2,82 +2,59 @@
class TweetsController < ApplicationController
before_filter :set_user_limit
- # GET /i/:id
- # GET /api/tweets/show
def show
tweet_required
-
@caption = "#{@user.screen_name}'s Tweet"
- h = ApplicationController.helpers
- text = h.strip_tags(h.format_tweet_text(@tweet.text))
- @title = "\"#{text}\" from #{@user.screen_name}"
end
- # GET /:screen_name
- # GET /api/tweets/best
def best
user_required
- @caption = "Best"
- @tweets = cache_tweets(3.minutes, @user.tweets.reacted.order_by_reactions.list(params, force_page: true))
+ @caption = "#{@user.screen_name}'s Best"
+ @tweets = @user.tweets.reacted.order_by_reactions.list(params, force_page: true, cache: 3.minutes)
end
- # GET /:screen_name/favorited
- # GET /api/tweets/favorited
def favorited
user_required
- @caption = "Most Favorited"
- @tweets = cache_tweets(3.minutes, @user.tweets.reacted.order_by_favorites.list(params, force_page: true))
+ @caption = "#{@user.screen_name}'s Most Favorited"
+ @tweets = @user.tweets.reacted.order_by_favorites.list(params, force_page: true, cache: 3.minutes)
end
- # GET /:screen_name/retweeted
- # GET /api/tweets/retweeted
def retweeted
user_required
- @caption = "Most Retweeted"
- @tweets = cache_tweets(3.minutes, @user.tweets.reacted.order_by_retweets.list(params, force_page: true))
+ @caption = "#{@user.screen_name}'s Most Retweeted"
+ @tweets = @user.tweets.reacted.order_by_retweets.list(params, force_page: true, cache: 3.minutes)
end
- # GET /api/tweets/recent
def recent
user_required
- @caption = "Recent Best"
- @tweets = cache_tweets(3.minutes, @user.tweets.recent.reacted.order_by_reactions.list(params, force_page: true))
+ @caption = "#{@user.screen_name}'s Recent Best"
+ @tweets = @user.tweets.recent.reacted.order_by_reactions.list(params, force_page: true, cache: 3.minutes)
end
- # GET /:screen_name/timeline
- # GET /api/tweets/timeline
def timeline
user_required
- @caption = "Newest"
+ @caption = "#{@user.screen_name}'s Newest"
@tweets = @user.tweets.reacted.order_by_id.list(params)
end
- # GET /:screen_name/discoveries
- # GET /api/tweets/discoveries
def discoveries
user_required
- @caption = "Discoveries"
+ @caption = "#{@user.screen_name}'s Discoveries"
@tweets = Tweet.discovered_by(@user).order_by_id.list(params)
end
- # GET /:screen_name/favorites
- # GET /api/tweets/favorites
def favorites
user_required
- @caption = "Favorites"
+ @caption = "#{@user.screen_name}'s Favorites"
@tweets = Tweet.favorited_by(@user).order_by_id.list(params)
end
- # GET /:screen_name/retweets
- # GET /api/tweets/retweets
def retweets
user_required
- @caption = "Retweets"
+ @caption = "#{@user.screen_name}'s Retweets"
@tweets = Tweet.retweeted_by(@user).order_by_id.list(params)
end
- # GET /:screen_name/discovered_by/:screen_name_b
- # GET /api/tweets/discovered_by
def discovered_by
user_required
user_b_required
@@ -85,21 +62,18 @@ class TweetsController < ApplicationController
@tweets = @user.tweets.discovered_by(@user_b).order_by_id.list(params)
end
- # GET /i/best
def all_best
- @caption = "Best of all"
- @tweets = cache_tweets(3.hours, Tweet.reacted.order_by_reactions.list(params, force_page: true))
+ @caption = "Top Tweets"
+ @tweets = Tweet.reacted.order_by_reactions.list(params, force_page: true, cache: 3.hours)
end
- # GET /i/recent
def all_recent
- @caption = "Recent of all"
- @tweets = cache_tweets(10.minutes, Tweet.recent.reacted.order_by_reactions.list(params, force_page: true))
+ @caption = "Recent"
+ @tweets = Tweet.recent.reacted.order_by_reactions.list(params, force_page: true, cache: 3.hours)
end
- # GET /i/timeline
def all_timeline
- @caption = "Newest of all"
+ @caption = "Newest"
@tweets = Tweet.reacted.order_by_id.list(params)
end
@@ -113,15 +87,11 @@ class TweetsController < ApplicationController
end
def user_required
- @user = _get_user(params[:user_id], params[:screen_name])
- raise Aclog::Exceptions::UserNotFound unless @user
- raise Aclog::Exceptions::UserProtected unless authorized_to_show?(@user)
+ @user = _require_user(params[:user_id], params[:screen_name])
end
def user_b_required
- @user_b = _get_user(params[:user_id_b], params[:screen_name_b])
- raise Aclog::Exceptions::UserNotFound unless @user_b
- raise Aclog::Exceptions::UserProtected unless authorized_to_show?(@user)
+ @user_b = _require_user(params[:user_id_b], params[:screen_name_b])
end
def tweet_required
@@ -151,15 +121,11 @@ class TweetsController < ApplicationController
end
end
- def cache_tweets(expires_in, tweets)
- key = "tweets/#{params.to_param}"
- p ids = Rails.cache.read(key)
- if not ids
- Rails.cache.write(key, tweets.map(&:id), expires_in: expires_in)
- tweets
- else
- n = Tweet.where("id IN (?)", ids).order("CASE #{ids.each_with_index.map {|m, i| "WHEN ID = #{m} THEN #{i}" }.join(" ")} END")
- end
+ def _require_user(user_id, screen_name)
+ user = _get_user(user_id, screen_name)
+ raise Aclog::Exceptions::UserNotFound unless user
+ raise Aclog::Exceptions::UserProtected unless authorized_to_show?(user)
+ user
end
end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index a94b0af..ceb2c3e 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -52,6 +52,11 @@ module ApplicationHelper
end
def title
+ if @tweet
+ text = strip_tags(format_tweet_text(@tweet.text))
+ @title = "\"#{text}\" from #{@user.screen_name}"
+ end
+
CGI.unescapeHTML "#{@title || @caption} - aclog"
end
diff --git a/app/models/account.rb b/app/models/account.rb
index 80c2f80..f3e50b4 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -37,7 +37,11 @@ class Account < ActiveRecord::Base
def update_connection
transport = MessagePack::RPC::UNIXTransport.new
client = MessagePack::RPC::Client.new(transport, File.join(Rails.root, "tmp", "sockets", "receiver.sock"))
- client.call(:register, Marshal.dump(self))
+ if self.status == Account::ACTIVE
+ client.call(:register, Marshal.dump(self))
+ elsif self.status == Account::INACTIVE
+ client.call(:unregister, Marshal.dump(self))
+ end
rescue Errno::ECONNREFUSED
Rails.logger.error($!)
end
diff --git a/app/models/tweet.rb b/app/models/tweet.rb
index 16f0b32..c57849e 100644
--- a/app/models/tweet.rb
+++ b/app/models/tweet.rb
@@ -30,6 +30,27 @@ class Tweet < ActiveRecord::Base
joins("INNER JOIN (#{un}) m ON m.tweet_id = tweets.id")
}
+ def self.list(params, options = {})
+ params[:page] ||= "1" if options[:force_page]
+
+ count = params[:count].to_i
+ count = Settings.tweets.count_default unless (1..Settings.tweets.count_max) === count
+
+ ret = limit(count)
+
+ if params[:page]
+ ret = ret.page(params[:page].to_i, count)
+ else
+ ret = ret.max_id(params[:max_id]).since_id(params[:since_id])
+ end
+
+ if options[:cache] && options[:cache] > 0
+ ret = ret.cache_list(options[:cache])
+ end
+
+ ret
+ end
+
def self.delete_from_id(id)
return {} if id.is_a?(Array) && id.size == 0
begin
@@ -69,20 +90,17 @@ class Tweet < ActiveRecord::Base
end
end
- def self.list(params, options = {})
- params[:page] ||= "1" if options[:force_page]
-
- count = params[:count].to_i
- count = Settings.tweets.count_default unless (1..Settings.tweets.count_max) === count
-
- ret = limit(count)
-
- if params[:page]
- ret.page(params[:page].to_i, count)
+ private
+ def self.cache_list(expires_in)
+ key = "tweets/#{scoped.to_sql}"
+ ids = Rails.cache.read(key)
+ if ids
+ Tweet.where("id IN (?)", ids).order("CASE #{ids.each_with_index.map {|m, i| "WHEN ID = #{m} THEN #{i}" }.join(" ")} END")
else
- ret.max_id(params[:max_id]).since_id(params[:since_id])
+ # use map instead of pluck: not to excecute new SQL
+ Rails.cache.write(key, scoped.map(&:id), expires_in: expires_in)
+ scoped
end
end
-
end