diaspora/app/controllers/api/v1/streams_controller.rb
2018-12-26 14:13:13 -05:00

74 lines
2.1 KiB
Ruby

# frozen_string_literal: true
module Api
module V1
class StreamsController < Api::V1::BaseController
before_action do
require_access_token %w[public:read]
end
before_action only: %w[aspects] do
require_access_token %w[contacts:read private:read]
end
before_action only: %w[followed_tags] do
require_access_token %w[tags:read]
end
def aspects
aspect_ids = params.has_key?(:aspect_ids) ? JSON.parse(params[:aspect_ids]) : []
@stream = Stream::Aspect.new(current_user, aspect_ids, max_time: stream_max_time)
stream_responder
end
def activity
stream_responder(Stream::Activity, "posts.interacted_at", "interacted_at")
end
def multi
stream_responder(Stream::Multi)
end
def commented
stream_responder(Stream::Comments)
end
def liked
stream_responder(Stream::Likes)
end
def mentions
stream_responder(Stream::Mention)
end
def followed_tags
stream_responder(Stream::FollowedTag)
end
private
def stream_responder(stream_klass=nil, query_time_field="posts.created_at", data_time_field="created_at")
@stream = stream_klass.present? ? stream_klass.new(current_user, max_time: stream_max_time) : @stream
query = @stream.stream_posts
query = query.where(public: true) unless private_read?
posts_page = pager(query, query_time_field, data_time_field).response
posts_page[:data] = posts_page[:data].map {|post| PostPresenter.new(post, current_user).as_api_response }
posts_page[:links].delete(:previous)
render json: posts_page
end
def stream_max_time
if params.has_key?("before")
Time.iso8601(params["before"])
else
max_time
end
end
def pager(query, query_time_field, data_time_field)
Api::Paging::RestPaginatorBuilder.new(query, request, true, 15)
.time_pager(params, query_time_field, data_time_field)
end
end
end
end