mirror of
https://github.com/mastodon/mastodon.git
synced 2024-12-22 12:55:56 +01:00
Improving feed queries, switching API to doorkeeper authentication
This commit is contained in:
parent
b919f39b31
commit
447cfef62d
12 changed files with 50 additions and 11 deletions
6
Gemfile
6
Gemfile
|
@ -30,7 +30,12 @@ gem 'rails_autolink'
|
|||
gem 'doorkeeper'
|
||||
gem 'rabl'
|
||||
gem 'oj'
|
||||
gem 'hiredis'
|
||||
gem 'redis', '~>3.2'
|
||||
gem 'fast_blank'
|
||||
gem 'htmlentities'
|
||||
gem 'message_bus'
|
||||
gem 'onebox'
|
||||
|
||||
group :development, :test do
|
||||
gem 'rspec-rails'
|
||||
|
@ -51,6 +56,7 @@ group :development do
|
|||
gem 'rubocop', require: false
|
||||
gem 'better_errors'
|
||||
gem 'binding_of_caller'
|
||||
gem 'rack-mini-profiler'
|
||||
end
|
||||
|
||||
group :production do
|
||||
|
|
22
Gemfile.lock
22
Gemfile.lock
|
@ -85,6 +85,7 @@ GEM
|
|||
erubis (2.7.0)
|
||||
execjs (2.6.0)
|
||||
fabrication (2.14.1)
|
||||
fast_blank (1.0.0)
|
||||
font-awesome-sass (4.5.0)
|
||||
sass (>= 3.2)
|
||||
fuubar (2.0.0)
|
||||
|
@ -105,11 +106,13 @@ GEM
|
|||
html2haml (>= 1.0.1)
|
||||
railties (>= 4.0.1)
|
||||
hashdiff (0.3.0)
|
||||
hiredis (0.6.1)
|
||||
html2haml (2.0.0)
|
||||
erubis (~> 2.7.0)
|
||||
haml (~> 4.0.0)
|
||||
nokogiri (~> 1.6.0)
|
||||
ruby_parser (~> 3.5)
|
||||
htmlentities (4.3.4)
|
||||
http (1.0.2)
|
||||
addressable (~> 2.3)
|
||||
http-cookie (~> 1.0)
|
||||
|
@ -133,15 +136,26 @@ GEM
|
|||
nokogiri (>= 1.5.9)
|
||||
mail (2.6.3)
|
||||
mime-types (>= 1.16, < 3)
|
||||
message_bus (1.1.1)
|
||||
rack (>= 1.1.3)
|
||||
redis
|
||||
method_source (0.8.2)
|
||||
mime-types (2.99)
|
||||
mimemagic (0.3.0)
|
||||
mini_portile2 (2.0.0)
|
||||
minitest (5.8.4)
|
||||
moneta (0.8.0)
|
||||
multi_json (1.11.2)
|
||||
mustache (1.0.2)
|
||||
nokogiri (1.6.7.2)
|
||||
mini_portile2 (~> 2.0.0.rc2)
|
||||
oj (2.14.5)
|
||||
onebox (1.5.35)
|
||||
htmlentities (~> 4.3.4)
|
||||
moneta (~> 0.8)
|
||||
multi_json (~> 1.11)
|
||||
mustache
|
||||
nokogiri (~> 1.6.6)
|
||||
orm_adapter (0.5.0)
|
||||
ostatus2 (0.1.1)
|
||||
addressable (~> 2.4)
|
||||
|
@ -171,6 +185,8 @@ GEM
|
|||
rabl (0.12.0)
|
||||
activesupport (>= 2.3.14)
|
||||
rack (1.6.4)
|
||||
rack-mini-profiler (0.9.9.2)
|
||||
rack (>= 1.2.0)
|
||||
rack-test (0.6.3)
|
||||
rack (>= 1.0)
|
||||
rails (4.2.5.1)
|
||||
|
@ -309,15 +325,20 @@ DEPENDENCIES
|
|||
doorkeeper
|
||||
dotenv-rails
|
||||
fabrication
|
||||
fast_blank
|
||||
font-awesome-sass
|
||||
fuubar
|
||||
goldfinger
|
||||
haml-rails
|
||||
hiredis
|
||||
htmlentities
|
||||
http
|
||||
jbuilder (~> 2.0)
|
||||
jquery-rails
|
||||
message_bus
|
||||
nokogiri
|
||||
oj
|
||||
onebox
|
||||
ostatus2
|
||||
paperclip (~> 4.3)
|
||||
paranoia (~> 2.0)
|
||||
|
@ -326,6 +347,7 @@ DEPENDENCIES
|
|||
puma
|
||||
quiet_assets
|
||||
rabl
|
||||
rack-mini-profiler
|
||||
rails (= 4.2.5.1)
|
||||
rails_12factor
|
||||
rails_autolink
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
class Api::AccountsController < ApiController
|
||||
before_action :set_account
|
||||
before_action :authenticate_user!
|
||||
before_action :doorkeeper_authorize!
|
||||
respond_to :json
|
||||
|
||||
def show
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
class Api::FollowsController < ApiController
|
||||
before_action :authenticate_user!
|
||||
before_action :doorkeeper_authorize!
|
||||
respond_to :json
|
||||
|
||||
def create
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
class Api::StatusesController < ApiController
|
||||
before_action :authenticate_user!
|
||||
before_action :doorkeeper_authorize!
|
||||
respond_to :json
|
||||
|
||||
def show
|
||||
|
|
|
@ -4,7 +4,7 @@ class ApiController < ApplicationController
|
|||
protected
|
||||
|
||||
def current_resource_owner
|
||||
User.find(doorkeeper_token.user_id) if doorkeeper_token
|
||||
User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token
|
||||
end
|
||||
|
||||
def current_user
|
||||
|
|
|
@ -23,8 +23,9 @@ module StreamEntriesHelper
|
|||
def linkify(status)
|
||||
mention_hash = {}
|
||||
status.mentions.each { |m| mention_hash[m.acct] = m }
|
||||
coder = HTMLEntities.new
|
||||
|
||||
auto_link(CGI.escapeHTML(status.text), link: :urls, html: { target: '_blank', rel: 'nofollow' }).gsub(Account::MENTION_RE) do |m|
|
||||
auto_link(coder.encode(status.text), link: :urls, html: { target: '_blank', rel: 'nofollow' }).gsub(Account::MENTION_RE) do |m|
|
||||
account = mention_hash[Account::MENTION_RE.match(m)[1]]
|
||||
"#{m.split('@').first}<a href=\"#{url_for_target(account)}\" class=\"mention\">@<span>#{account.acct}</span></a>"
|
||||
end.html_safe
|
||||
|
|
|
@ -11,7 +11,7 @@ class Feed
|
|||
# If we're after most recent items and none are there, we need to precompute the feed
|
||||
return PrecomputeFeedService.new.(@type, @account).take(limit) if unhydrated.empty? && offset == 0
|
||||
|
||||
Status.where(id: unhydrated).each { |status| status_map[status.id.to_s] = status }
|
||||
Status.where(id: unhydrated).with_includes.with_counters.each { |status| status_map[status.id.to_s] = status }
|
||||
return unhydrated.map { |id| status_map[id] }
|
||||
end
|
||||
|
||||
|
|
|
@ -14,6 +14,9 @@ class Status < ActiveRecord::Base
|
|||
validates :account, presence: true
|
||||
validates :uri, uniqueness: true, unless: 'local?'
|
||||
|
||||
scope :with_counters, -> { select('statuses.*, (select count(r.id) from statuses as r where r.reblog_of_id = statuses.id) as reblogs_count, (select count(f.id) from favourites as f where f.status_id = statuses.id) as favourites_count') }
|
||||
scope :with_includes, -> { includes(:account, reblog: :account, thread: :account) }
|
||||
|
||||
def local?
|
||||
self.uri.nil?
|
||||
end
|
||||
|
|
|
@ -18,11 +18,11 @@ class PrecomputeFeedService < BaseService
|
|||
end
|
||||
|
||||
def home(account)
|
||||
Status.where(account: [account] + account.following)
|
||||
Status.where(account: [account] + account.following).with_includes.with_counts
|
||||
end
|
||||
|
||||
def mentions(account)
|
||||
Status.where(id: Mention.where(account: account).pluck(:status_id))
|
||||
Status.where(id: Mention.where(account: account).pluck(:status_id)).with_includes.with_counts
|
||||
end
|
||||
|
||||
def key(type, id)
|
||||
|
|
|
@ -24,10 +24,10 @@
|
|||
.header__right
|
||||
.counter-btn{ class: reblogged_by_me_class(status) }
|
||||
%i.fa.fa-retweet
|
||||
%span.counter-number= status.reblog? ? status.reblog.reblogs.count : status.reblogs.count
|
||||
%span.counter-number= status.reblog? ? status.reblog.reblogs.count : status.reblogs_count
|
||||
.counter-btn{ class: favourited_by_me_class(status) }
|
||||
%i.fa.fa-star
|
||||
%span.counter-number= status.reblog? ? status.reblog.favourites.count : status.favourites.count
|
||||
%span.counter-number= status.reblog? ? status.reblog.favourites.count : status.favourites_count
|
||||
.content
|
||||
= status.reblog? ? (status.reblog.local? ? linkify(status.reblog) : status.reblog.content.html_safe) : (status.local? ? linkify(status) : status.content.html_safe)
|
||||
|
||||
|
|
|
@ -7,6 +7,12 @@ Doorkeeper.configure do
|
|||
current_user || redirect_to(new_user_session_url)
|
||||
end
|
||||
|
||||
resource_owner_from_credentials do |routes|
|
||||
request.params[:user] = { email: request.params[:username], password: request.params[:password] }
|
||||
request.env["devise.allow_params_authentication"] = true
|
||||
request.env["warden"].authenticate!(scope: :user)
|
||||
end
|
||||
|
||||
# If you want to restrict access to the web interface for adding oauth authorized applications, you need to declare the block below.
|
||||
# admin_authenticator do
|
||||
# # Put your admin authentication logic here.
|
||||
|
@ -90,7 +96,8 @@ Doorkeeper.configure do
|
|||
# http://tools.ietf.org/html/rfc6819#section-4.4.2
|
||||
# http://tools.ietf.org/html/rfc6819#section-4.4.3
|
||||
#
|
||||
# grant_flows %w(authorization_code client_credentials)
|
||||
|
||||
grant_flows %w(authorization_code password client_credentials)
|
||||
|
||||
# Under some circumstances you might want to have applications auto-approved,
|
||||
# so that the user skips the authorization step.
|
||||
|
|
Loading…
Reference in a new issue