diff options
author | re4k <re4k@re4k.info> | 2013-04-28 00:38:21 +0900 |
---|---|---|
committer | re4k <re4k@re4k.info> | 2013-04-28 00:38:21 +0900 |
commit | 4af8acda5e4664d41079e3ff2ea853e1fb74a2a8 (patch) | |
tree | 51a583486af42c349d1d0ff8cedfb40b8265fb5b /app | |
parent | 4189cf84b0c337568133c6dafadc07669daaa868 (diff) | |
download | aclog-4af8acda5e4664d41079e3ff2ea853e1fb74a2a8.tar.gz |
refactor controller
Diffstat (limited to 'app')
-rw-r--r-- | app/controllers/application_controller.rb | 54 | ||||
-rw-r--r-- | app/controllers/i_controller.rb | 13 | ||||
-rw-r--r-- | app/controllers/search_controller.rb | 8 | ||||
-rw-r--r-- | app/controllers/users_controller.rb | 57 | ||||
-rw-r--r-- | app/helpers/application_helper.rb | 32 | ||||
-rw-r--r-- | app/helpers/users_helper.rb | 16 | ||||
-rw-r--r-- | app/models/favorite.rb | 11 | ||||
-rw-r--r-- | app/models/issue.rb | 7 | ||||
-rw-r--r-- | app/models/notification.rb | 2 | ||||
-rw-r--r-- | app/models/retweet.rb | 5 | ||||
-rw-r--r-- | app/models/tweet.rb | 77 | ||||
-rw-r--r-- | app/models/user.rb | 1 | ||||
-rw-r--r-- | app/views/shared/sidebar/_users.html.haml | 2 | ||||
-rw-r--r-- | app/views/shared/tweets.html.haml | 4 |
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 ›"), params.merge(page: (page || 1) + 1), rel: :next + - if params[:page] + = link_to raw("Next ›"), params.merge(page: params[:page].to_i + 1), rel: :next - elsif @items.last = link_to raw("Next ›"), params.merge(max_id: @items.last.id - 1), rel: :next |