0
0
Fork 0
* Add structure for lists

* Add list timeline streaming API

* Add list APIs, bind list-account relation to follow relation

* Add API for adding/removing accounts from lists

* Add pagination to lists API

* Add pagination to list accounts API

* Adjust scopes for new APIs

- Creating and modifying lists merely requires "write" scope
- Fetching information about lists merely requires "read" scope

* Add test for wrong user context on list timeline

* Clean up tests
This commit is contained in:
Eugen Rochko 2017-11-18 00:16:48 +01:00 committed by GitHub
parent 4a2fc2d444
commit 24cafd73a2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
67 changed files with 855 additions and 224 deletions

View file

@ -3,34 +3,41 @@
class FeedInsertWorker
include Sidekiq::Worker
attr_reader :status, :follower
def perform(status_id, id, type = :home)
@type = type.to_sym
@status = Status.find(status_id)
def perform(status_id, follower_id)
@status = Status.find_by(id: status_id)
@follower = Account.find_by(id: follower_id)
case @type
when :home
@follower = Account.find(id)
when :list
@list = List.find(id)
@follower = @list.account
end
check_and_insert
rescue ActiveRecord::RecordNotFound
true
end
private
def check_and_insert
if records_available?
perform_push unless feed_filtered?
else
true
end
end
def records_available?
status.present? && follower.present?
perform_push unless feed_filtered?
end
def feed_filtered?
FeedManager.instance.filter?(:home, status, follower.id)
# Note: Lists are a variation of home, so the filtering rules
# of home apply to both
FeedManager.instance.filter?(:home, @status, @follower.id)
end
def perform_push
FeedManager.instance.push(:home, follower, status)
case @type
when :home
FeedManager.instance.push_to_home(@follower, @status)
when :list
FeedManager.instance.push_to_list(@list, @status)
end
end
end

View file

@ -3,12 +3,13 @@
class PushUpdateWorker
include Sidekiq::Worker
def perform(account_id, status_id)
account = Account.find(account_id)
status = Status.find(status_id)
message = InlineRenderer.render(status, account, :status)
def perform(account_id, status_id, timeline_id = nil)
account = Account.find(account_id)
status = Status.find(status_id)
message = InlineRenderer.render(status, account, :status)
timeline_id = "timeline:#{account.id}" if timeline_id.nil?
Redis.current.publish("timeline:#{account.id}", Oj.dump(event: :update, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i))
Redis.current.publish(timeline_id, Oj.dump(event: :update, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i))
rescue ActiveRecord::RecordNotFound
true
end