.circleci
.github
app
chewy
controllers
activitypub
admin
api
v1
accounts
admin
announcements
apps
crypto
keys
deliveries_controller.rb
encrypted_messages_controller.rb
featured_tags
instances
lists
polls
push
statuses
timelines
accounts_controller.rb
announcements_controller.rb
apps_controller.rb
blocks_controller.rb
bookmarks_controller.rb
conversations_controller.rb
custom_emojis_controller.rb
directories_controller.rb
domain_blocks_controller.rb
endorsements_controller.rb
favourites_controller.rb
featured_tags_controller.rb
filters_controller.rb
follow_requests_controller.rb
instances_controller.rb
lists_controller.rb
markers_controller.rb
media_controller.rb
mutes_controller.rb
notifications_controller.rb
polls_controller.rb
preferences_controller.rb
reports_controller.rb
scheduled_statuses_controller.rb
statuses_controller.rb
streaming_controller.rb
suggestions_controller.rb
trends_controller.rb
v2
web
base_controller.rb
oembed_controller.rb
proofs_controller.rb
auth
concerns
oauth
settings
well_known
about_controller.rb
account_follow_controller.rb
account_unfollow_controller.rb
accounts_controller.rb
application_controller.rb
authorize_interactions_controller.rb
custom_css_controller.rb
directories_controller.rb
emojis_controller.rb
filters_controller.rb
follower_accounts_controller.rb
following_accounts_controller.rb
home_controller.rb
instance_actors_controller.rb
intents_controller.rb
invites_controller.rb
manifests_controller.rb
media_controller.rb
media_proxy_controller.rb
public_timelines_controller.rb
relationships_controller.rb
remote_follow_controller.rb
remote_interaction_controller.rb
shares_controller.rb
statuses_controller.rb
tags_controller.rb
helpers
javascript
lib
mailers
models
policies
presenters
serializers
services
validators
views
workers
bin
chart
config
db
dist
lib
log
nanobox
public
spec
streaming
vendor
.buildpacks
.codeclimate.yml
.dockerignore
.editorconfig
.env.nanobox
.env.production.sample
.env.test
.env.vagrant
.eslintignore
.eslintrc.js
.foreman
.gitattributes
.gitignore
.haml-lint.yml
.nanoignore
.nvmrc
.profile
.rspec
.rubocop.yml
.ruby-version
.sass-lint.yml
.slugignore
.yarnclean
AUTHORS.md
Aptfile
CHANGELOG.md
CODE_OF_CONDUCT.md
CONTRIBUTING.md
Capfile
Dockerfile
Gemfile
Gemfile.lock
LICENSE
Procfile
Procfile.dev
README.md
Rakefile
SECURITY.md
Vagrantfile
app.json
babel.config.js
boxfile.yml
config.ru
crowdin.yml
docker-compose.yml
ide-helper.js
package.json
postcss.config.js
priv-config
scalingo.json
yarn.lock
* Make Array-creation behavior of Paginable more predictable Paginable.paginate_by_id usually returns ActiveRecord::Relation, but it returns an Array if min_id option is present. The behavior caused problems fixed with the following commits: -552e886b64
-b63ede5005
-64ef37b89d
To prevent from recurring similar problems, this commit introduces two changes: - The scope now always returns an Array whether min_id option is present or not. - The scope is renamed to to_a_paginated_by_id to clarify it returns an Array. * Transform Paginable.to_a_paginated_by_id from a scope to a class method https://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html#method-i-scope > The method is intended to return an ActiveRecord::Relation object, which > is composable with other scopes. Paginable.to_a_paginated_by_id returns an Array and is not appropriate as a scope.
60 lines
1.5 KiB
Ruby
60 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class Api::V1::Crypto::EncryptedMessagesController < Api::BaseController
|
|
LIMIT = 80
|
|
|
|
before_action -> { doorkeeper_authorize! :crypto }
|
|
before_action :require_user!
|
|
before_action :set_current_device
|
|
|
|
before_action :set_encrypted_messages, only: :index
|
|
after_action :insert_pagination_headers, only: :index
|
|
|
|
def index
|
|
render json: @encrypted_messages, each_serializer: REST::EncryptedMessageSerializer
|
|
end
|
|
|
|
def clear
|
|
@current_device.encrypted_messages.up_to(params[:up_to_id]).delete_all
|
|
render_empty
|
|
end
|
|
|
|
private
|
|
|
|
def set_current_device
|
|
@current_device = Device.find_by!(access_token: doorkeeper_token)
|
|
end
|
|
|
|
def set_encrypted_messages
|
|
@encrypted_messages = @current_device.encrypted_messages.to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id))
|
|
end
|
|
|
|
def insert_pagination_headers
|
|
set_pagination_headers(next_path, prev_path)
|
|
end
|
|
|
|
def next_path
|
|
api_v1_crypto_encrypted_messages_url pagination_params(max_id: pagination_max_id) if records_continue?
|
|
end
|
|
|
|
def prev_path
|
|
api_v1_crypto_encrypted_messages_url pagination_params(min_id: pagination_since_id) unless @encrypted_messages.empty?
|
|
end
|
|
|
|
def pagination_max_id
|
|
@encrypted_messages.last.id
|
|
end
|
|
|
|
def pagination_since_id
|
|
@encrypted_messages.first.id
|
|
end
|
|
|
|
def records_continue?
|
|
@encrypted_messages.size == limit_param(LIMIT)
|
|
end
|
|
|
|
def pagination_params(core_params)
|
|
params.slice(:limit).permit(:limit).merge(core_params)
|
|
end
|
|
end
|