aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorre4k <re4k@re4k.info>2013-04-28 00:38:21 +0900
committerre4k <re4k@re4k.info>2013-04-28 00:38:21 +0900
commit4af8acda5e4664d41079e3ff2ea853e1fb74a2a8 (patch)
tree51a583486af42c349d1d0ff8cedfb40b8265fb5b /app
parent4189cf84b0c337568133c6dafadc07669daaa868 (diff)
downloadaclog-4af8acda5e4664d41079e3ff2ea853e1fb74a2a8.tar.gz
refactor controller
Diffstat (limited to 'app')
-rw-r--r--app/controllers/application_controller.rb54
-rw-r--r--app/controllers/i_controller.rb13
-rw-r--r--app/controllers/search_controller.rb8
-rw-r--r--app/controllers/users_controller.rb57
-rw-r--r--app/helpers/application_helper.rb32
-rw-r--r--app/helpers/users_helper.rb16
-rw-r--r--app/models/favorite.rb11
-rw-r--r--app/models/issue.rb7
-rw-r--r--app/models/notification.rb2
-rw-r--r--app/models/retweet.rb5
-rw-r--r--app/models/tweet.rb77
-rw-r--r--app/models/user.rb1
-rw-r--r--app/views/shared/sidebar/_users.html.haml2
-rw-r--r--app/views/shared/tweets.html.haml4
14 files changed, 91 insertions, 198 deletions
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 3a727b5..249b4ea 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -1,32 +1,32 @@
# -*- coding: utf-8 -*-
class ApplicationController < ActionController::Base
protect_from_forgery
-
before_filter :set_format
after_filter :xhtml
- helper_method :logged_in?, :page
- helper_method :get_bool, :get_int
-
- def render_timeline(a = nil, &blk)
- @items = a || blk.call
-
- @items = @items.where("tweets.id <= ?", max_id) if max_id
- @items = @items.where("tweets.id > ?", since_id) if since_id
-
- @items = @items.limit(count)
- @items = @items.offset(((page || 1) - 1) * count) if page
+ def render_tweets(options = {}, &blk)
+ if params[:count]
+ count = params[:count].to_i
+ else
+ count = 10
+ end
+ p options
+ if options[:force_page]
+ params[:page] ||= "1"
+ end
+
+ @items = blk.call.limit(count)
+
+ if params[:page]
+ @items = @items.page(params[:page].to_i, count)
+ else
+ @items = @items.max_id(params[:max_id].to_i) if params[:max_id]
+ @items = @items.since_id(params[:since_id].to_i) if params[:since_id]
+ end
+
render "shared/tweets"
end
- def logged_in?; session[:user_id] != nil end
-
- # params
- def page; get_int(params[:page], nil){|i| i > 0} end
- def count; get_int(params[:count], 10){|i| (1..100) === i} end
- def max_id; get_int(params[:max_id], nil){|i| i >= 0} end
- def since_id; get_int(params[:since_id], nil){|i| i >= 0} end
-
private
def set_format
unless [:json, :html].include?(request.format.to_sym)
@@ -42,18 +42,4 @@ class ApplicationController < ActionController::Base
response.body = response.body.gsub(/[\x0-\x8\xb\xc\xe-\x1f]/, "")
end
end
-
- def get_bool(str)
- /^(t|true|1)$/ =~ str
- end
-
- def get_int(str, default = 0, &blk)
- if str =~ /^[1-9]\d*$/
- i = str.to_i
- if !block_given? || blk.call(i)
- return i
- end
- end
- default
- end
end
diff --git a/app/controllers/i_controller.rb b/app/controllers/i_controller.rb
index 8f80762..bf6fee5 100644
--- a/app/controllers/i_controller.rb
+++ b/app/controllers/i_controller.rb
@@ -1,9 +1,7 @@
class IController < ApplicationController
- before_filter :force_page, only: [:best, :recent]
-
def best
@title = "Best Tweets"
- render_timeline do
+ render_tweets(force_page: true) do
Tweet
.reacted
.original
@@ -13,7 +11,7 @@ class IController < ApplicationController
def recent
@title = "Recent Best Tweets"
- render_timeline do
+ render_tweets(force_page: true) do
Tweet
.recent
.reacted
@@ -24,16 +22,11 @@ class IController < ApplicationController
def timeline
@title = "Public Timeline"
- render_timeline do
+ render_tweets do
Tweet
.reacted
.not_protected
.order_by_id
end
end
-
- private
- def force_page
- params[:page] = "1" unless page
- end
end
diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb
index 1dfdfc5..07f5167 100644
--- a/app/controllers/search_controller.rb
+++ b/app/controllers/search_controller.rb
@@ -2,14 +2,12 @@
require "shellwords"
class SearchController < ApplicationController
- before_filter :force_page
-
def search
@show_search = true
# TODO: OR とか () とか対応したいよね
unless params[:query]
- render_timeline(Tweet.where(id: -1))
+ render_tweets(force_page: true) { Tweet.none }
return
end
words = Shellwords.shellwords(params[:query])
@@ -76,12 +74,12 @@ class SearchController < ApplicationController
end
end
- render_timeline(result)
+ render_tweets(force_page: true) { result }
end
private
def first_id_of_time(time)
- p (time.to_i * 1000 - 1288834974657) << 22
+ (time.to_i * 1000 - 1288834974657) << 22
end
def search_unless_zero(tweets, column, flag, value)
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 33c2539..675badd 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -1,5 +1,4 @@
class UsersController < ApplicationController
- before_filter :force_page, only: [:best, :recent]
before_filter :require_user, except: [:show, :favoriters]
before_filter :require_tweet, only: [:show, :favoriters]
before_filter :include_user_b, only: [:favorited_by, :retweeted_by, :given_favorites_to, :given_retweets_to]
@@ -8,7 +7,7 @@ class UsersController < ApplicationController
def best
@title = "@#{@user.screen_name}'s Best Tweets"
- render_timeline do
+ render_tweets(force_page: true) do
case params[:order]
when /^fav/
@user.tweets.reacted.order_by_favorites
@@ -23,7 +22,7 @@ class UsersController < ApplicationController
def recent
@title = "@#{@user.screen_name}'s Recent Best Tweets"
- render_timeline do
+ render_tweets(force_page: true) do
case params[:order]
when /^fav/
@user.tweets.recent.reacted.order_by_favorites
@@ -38,8 +37,8 @@ class UsersController < ApplicationController
def timeline
@title = "@#{@user.screen_name}'s Newest Tweets"
- render_timeline do
- if get_bool(params[:all])
+ render_tweets do
+ if !!params[:all]
@user.tweets.order_by_id
else
@user.tweets.reacted.order_by_id
@@ -50,7 +49,7 @@ class UsersController < ApplicationController
def discovered
@title = "@#{@user.screen_name}'s Recent Discoveries"
- render_timeline do
+ render_tweets do
case params[:tweets]
when /^fav/
Tweet.favorited_by(@user).order_by_id
@@ -122,15 +121,13 @@ class UsersController < ApplicationController
def render_users_ranking
by = -> model do
model.joins(
- "INNER JOIN (" +
- "SELECT id FROM tweets WHERE tweets.user_id = #{@user.id} ORDER BY id DESC LIMIT 100" +
- ") target ON tweet_id = target.id")
+ "INNER JOIN (#{@user.tweets.order_by_id.limit(100).to_sql}) target ON tweet_id = target.id")
end
to = -> model do
Tweet.joins(
"INNER JOIN (" +
- "SELECT tweet_id FROM #{model.table_name} WHERE #{model.table_name}.user_id = #{@user.id} ORDER BY id DESC LIMIT 500" +
+ model.where(user_id: @user.id).order("id DESC").limit(500).to_sql +
") action ON tweets.id = action.tweet_id")
end
@@ -157,7 +154,7 @@ class UsersController < ApplicationController
end
def render_user_to_user
- render_timeline do
+ render_tweets do
case params[:action].to_sym
when :favorited_by
@title = "@#{@user.screen_name}'s Tweets"
@@ -175,56 +172,26 @@ class UsersController < ApplicationController
end
end
- def force_page
- params[:page] = "1" unless page
- end
-
def require_user
- if params[:screen_name] == "me"
- if session[:user_id]
- params[:user_id] = session[:user_id]
- else
- raise Aclog::Exceptions::LoginRequired
- end
- end
-
- if params[:user_id]
- user = User.find(params[:user_id].to_i)
- end
-
- if !user && params[:screen_name]
- user = User.where(screen_name: params[:screen_name]).first
- end
-
+ user = User.where(id: params[:user_id]).first || User.where(screen_name: params[:screen_name]).first
raise Aclog::Exceptions::UserNotFound unless user
-
@user = user
end
def include_user_b
- if params[:user_id_b]
- user_b = User.find(params[:user_id_b].to_i)
- end
-
- if !user_b && params[:screen_name_b]
- user_b = User.where(screen_name: params[:screen_name_b]).first
- end
-
+ user_b = User.where(id: params[:user_id_b]).first || User.where(screen_name: params[:screen_name_b]).first
@user_b = user_b
end
def require_tweet
- tweet_id = params[:id].to_i
- item = Tweet.where(id: tweet_id).first
-
+ item = Tweet.where(id: params[:id]).first
raise Aclog::Exceptions::TweetNotFound unless item
-
@item = item
end
def check_protected
if @user && @user.protected?
- if !@user.registered? || !session[:account] || session[:account].user_id != @user.id
+ if session[:account] == nil || session[:account].user_id != @user.id
raise Aclog::Exceptions::UserProtected
end
end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 52c098e..f54a537 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -1,8 +1,15 @@
module ApplicationHelper
+ def logged_in?; session[:user_id] && session[:account] end
+ def include_user?; !!params[:include_user] end
+
def format_time(dt)
dt.to_time.localtime("+09:00").strftime("%Y-%m-%d %H:%M:%S")
end
+ def format_days_ago(dt)
+ "#{(DateTime.now.utc - dt.to_datetime).to_i}d ago"
+ end
+
def format_tweet_text(text)
ret = text.gsub(/<([a-z]+?):(.+?)(?::(.+?))?>/) do
case $1
@@ -37,29 +44,6 @@ module ApplicationHelper
"https://twitter.com/#{screen_name}"
end
- def user_icon_link(user)
- logger.error("DEPRECATED user_icon_link")
- link_to(image_tag(user.profile_image_url, alt: user.screen_name, title: user.name), user_path(user.screen_name))
- end
-
- def include_user?; get_bool(params[:include_user]) end
- def user_limit
- i = params[:limit].to_i
- if i > 0
- return i
- elsif i == -1
- return nil
- else
- if params[:action] == "show"
- return 100
- else
- return 20
- end
- end
- end
-
# utf8, form
- def utf8_enforcer_tag
- raw ""
- end
+ def utf8_enforcer_tag; raw "" end
end
diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb
index 2610ca2..8d16157 100644
--- a/app/helpers/users_helper.rb
+++ b/app/helpers/users_helper.rb
@@ -1,6 +1,16 @@
-require "time"
module UsersHelper
- def format_date_ago(dt)
- "#{(DateTime.now.utc - dt.to_datetime).to_i}d ago"
+ def user_limit
+ i = params[:limit].to_i
+ if i > 0
+ return i
+ elsif i == -1
+ return nil
+ else
+ if params[:action] == "show"
+ return 100
+ else
+ return 20
+ end
+ end
end
end
diff --git a/app/models/favorite.rb b/app/models/favorite.rb
index de274d5..df9eb41 100644
--- a/app/models/favorite.rb
+++ b/app/models/favorite.rb
@@ -3,14 +3,9 @@ class Favorite < ActiveRecord::Base
# counter_culture :tweet
belongs_to :user
- scope :order_by_id, -> do
- order("id DESC")
- end
-
def self.from_hash(hash)
begin
- f = create!(tweet_id: hash[:tweet_id],
- user_id: hash[:user_id])
+ f = create!(tweet_id: hash[:tweet_id], user_id: hash[:user_id])
logger.debug("Created Favorite: #{hash[:user_id]} => #{hash[:tweet_id]}")
return f
@@ -30,8 +25,6 @@ class Favorite < ActiveRecord::Base
end
def self.delete_from_hash(hash)
- where(tweet_id: hash[:tweet_id])
- .where(user_id: hash[:user_id])
- .destroy_all
+ where(tweet_id: hash[:tweet_id], user_id: hash[:user_id]).destroy_all
end
end
diff --git a/app/models/issue.rb b/app/models/issue.rb
index ad99a02..9d4c417 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -1,10 +1,5 @@
class Issue < ActiveRecord::Base
def self.register(issue_type, status, data)
- begin
- create!(issue_type: issue_type, status: status, data: Yajl::Encoder::encode(data))
- rescue
- logger.error($!)
- logger.error($@)
- end
+ create!(issue_type: issue_type, status: status, data: Yajl::Encoder::encode(data))
end
end
diff --git a/app/models/notification.rb b/app/models/notification.rb
new file mode 100644
index 0000000..dd15afb
--- /dev/null
+++ b/app/models/notification.rb
@@ -0,0 +1,2 @@
+class Notification
+end
diff --git a/app/models/retweet.rb b/app/models/retweet.rb
index 34b2646..e57f4d8 100644
--- a/app/models/retweet.rb
+++ b/app/models/retweet.rb
@@ -3,10 +3,6 @@ class Retweet < ActiveRecord::Base
# counter_culture :tweet
belongs_to :user
- scope :order_by_id, -> do
- order("id DESC")
- end
-
def self.from_hash(hash)
begin
r = create!(id: hash[:id],
@@ -24,6 +20,7 @@ class Retweet < ActiveRecord::Base
def self.from_tweet_object(status)
User.from_user_object(status.user)
+ Tweet.from_tweet_object(status.retweeted_status)
from_hash(id: status.id,
user_id: status.user.id,
tweet_id: status.retweeted_status.id)
diff --git a/app/models/tweet.rb b/app/models/tweet.rb
index 9608fec..9a5ce96 100644
--- a/app/models/tweet.rb
+++ b/app/models/tweet.rb
@@ -1,62 +1,31 @@
class Tweet < ActiveRecord::Base
belongs_to :user
+ has_many :favorites, -> { order("favorites.id") }, dependent: :delete_all
+ has_many :retweets, -> { order("retweets.id") }, dependent: :delete_all
+ has_one :stolen_tweet, ->{ includes(:original) }, dependent: :delete
- has_many :favorites, ->{order("favorites.id")}, dependent: :delete_all
- has_many :retweets, ->{order("retweets.id")}, dependent: :delete_all
- has_many :favoriters, ->{order("favorites.id")}, through: :favorites, source: :user
- has_many :retweeters, ->{order("retweets.id")}, through: :retweets, source: :user
-
- has_one :stolen_tweet, ->{includes(:original)}, dependent: :delete
+ has_many :favoriters, -> {order("favorites.id") }, through: :favorites, source: :user
+ has_many :retweeters, -> { order("retweets.id") }, through: :retweets, source: :user
has_one :original, through: :stolen_tweet, source: :original
- scope :recent, -> do
- where("tweets.tweeted_at > ?", Time.zone.now - 3.days)
- end
-
- scope :reacted, -> do
- where("tweets.favorites_count > 0 OR tweets.retweets_count > 0")
- end
-
- scope :order_by_id, -> do
- order("tweets.id DESC")
- end
-
- scope :order_by_favorites, -> do
- order("tweets.favorites_count DESC")
- end
-
- scope :order_by_retweets, -> do
- order("tweets.retweets_count DESC")
- end
-
- scope :order_by_reactions, -> do
- order("COALESCE(tweets.favorites_count, 0) + COALESCE(tweets.retweets_count, 0) DESC")
- end
-
- scope :favorited_by, -> user do
- joins(:favorites).where(favorites: {user_id: user.id})
- end
-
- scope :retweeted_by, -> user do
- joins(:retweets).where(retweets: {user_id: user.id})
- end
-
- scope :discovered_by, -> user do
- joins("INNER JOIN (" +
- "(SELECT favorites.tweet_id FROM favorites WHERE favorites.user_id = #{user.id})" +
- " UNION " +
- "(SELECT retweets.tweet_id FROM retweets WHERE retweets.user_id = #{user.id})" +
- ") AS m ON m.tweet_id = tweets.id")
- end
-
- scope :original, -> do
- joins("LEFT JOIN stolen_tweets ON tweets.id = stolen_tweets.tweet_id").where(stolen_tweets: {tweet_id: nil})
- end
-
- scope :not_protected, -> do
- includes(:user).where(users: {protected: false})
- end
-
+ scope :recent, -> { where("tweets.tweeted_at > ?", Time.zone.now - 3.days) }
+ scope :reacted, -> {where("tweets.favorites_count > 0 OR tweets.retweets_count > 0") }
+ scope :original, -> { includes(:stolen_tweet).where(stolen_tweets: {tweet_id: nil}) }
+ scope :not_protected, -> { includes(:user).where(users: {protected: false}) }
+ scope :max_id, -> id { where("tweets.id <= ?", id) }
+ scope :since_id, -> id { where("tweets.id > ?", id) }
+ scope :page, -> page, count { offset((page - 1) * count) }
+ scope :order_by_id, -> { order("tweets.id DESC") }
+ scope :order_by_favorites, -> { order("tweets.favorites_count DESC") }
+ scope :order_by_retweets, -> { order("tweets.retweets_count DESC") }
+ scope :order_by_reactions, -> { order("COALESCE(tweets.favorites_count, 0) + COALESCE(tweets.retweets_count, 0) DESC") }
+ scope :favorited_by, -> user { joins(:favorites).where(favorites: {user_id: user.id}) }
+ scope :retweeted_by, -> user { joins(:retweets).where(retweets: {user_id: user.id}) }
+ scope :discovered_by, -> user {
+ joins("INNER JOIN (#{user.favorites.to_sql} UNION #{user.retweets.to_sql}) m ON m.tweet_id = tweets.id")
+ }
+
+ # will be moved
def notify_favorite
if [50, 100, 250, 500, 1000].include? favorites.count
Aclog::Notification.reply_favs(self, favorites.count)
diff --git a/app/models/user.rb b/app/models/user.rb
index 56626a0..4b990cc 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -15,7 +15,6 @@ class User < ActiveRecord::Base
if orig != user.attributes
user.save!
- user.delete_cache
logger.debug("User saved: #{user.id}")
else
logger.debug("User not changed: #{user.id}")
diff --git a/app/views/shared/sidebar/_users.html.haml b/app/views/shared/sidebar/_users.html.haml
index eaba8b1..216ae44 100644
--- a/app/views/shared/sidebar/_users.html.haml
+++ b/app/views/shared/sidebar/_users.html.haml
@@ -16,7 +16,7 @@
%span.data= ((@user.stats[:favorited_count] + 0.0) / @user.stats[:tweets_count]).round(2)
%li
%span joined
- %span.data= format_date_ago(@user.created_at)
+ %span.data= format_days_ago(@user.created_at)
- else
.alert.alert-info
= "@#{@user.screen_name} has never signed in to aclog"
diff --git a/app/views/shared/tweets.html.haml b/app/views/shared/tweets.html.haml
index 04fb985..636a0ed 100644
--- a/app/views/shared/tweets.html.haml
+++ b/app/views/shared/tweets.html.haml
@@ -5,7 +5,7 @@
.loading
= image_tag "loading.gif", alt: "loading...", title: nil
.pagination
- - if page
- = link_to raw("Next &#8250;"), params.merge(page: (page || 1) + 1), rel: :next
+ - if params[:page]
+ = link_to raw("Next &#8250;"), params.merge(page: params[:page].to_i + 1), rel: :next
- elsif @items.last
= link_to raw("Next &#8250;"), params.merge(max_id: @items.last.id - 1), rel: :next