aboutsummaryrefslogtreecommitdiff
path: root/app/controllers/api/v1/conversations_controller.rb
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2018-10-07 23:44:58 +0200
committerGitHub <noreply@github.com>2018-10-07 23:44:58 +0200
commit774ac473736cbf348827cf6d861e7fbbb72d7623 (patch)
treec8ce87b43cd8fa58f7124a8a6baf93a71cb274e8 /app/controllers/api/v1/conversations_controller.rb
parent25744d43b0c9ae58227e1e46ac9e2b33a7944925 (diff)
downloadmastodon-774ac473736cbf348827cf6d861e7fbbb72d7623.tar
mastodon-774ac473736cbf348827cf6d861e7fbbb72d7623.tar.gz
mastodon-774ac473736cbf348827cf6d861e7fbbb72d7623.tar.bz2
mastodon-774ac473736cbf348827cf6d861e7fbbb72d7623.zip
Add conversations API (#8832)
* Add conversations API * Add web UI for conversations * Add test for conversations API * Add tests for ConversationAccount * Improve web UI * Rename ConversationAccount to AccountConversation * Remove conversations on block and mute * Change last_status_id to be a denormalization of status_ids * Add optimistic locking
Diffstat (limited to 'app/controllers/api/v1/conversations_controller.rb')
-rw-r--r--app/controllers/api/v1/conversations_controller.rb55
1 files changed, 55 insertions, 0 deletions
diff --git a/app/controllers/api/v1/conversations_controller.rb b/app/controllers/api/v1/conversations_controller.rb
new file mode 100644
index 000000000..736cb21ca
--- /dev/null
+++ b/app/controllers/api/v1/conversations_controller.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+class Api::V1::ConversationsController < Api::BaseController
+ LIMIT = 20
+
+ before_action -> { doorkeeper_authorize! :read, :'read:statuses' }
+ before_action :require_user!
+ after_action :insert_pagination_headers
+
+ respond_to :json
+
+ def index
+ @conversations = paginated_conversations
+ render json: @conversations, each_serializer: REST::ConversationSerializer
+ end
+
+ private
+
+ def paginated_conversations
+ AccountConversation.where(account: current_account)
+ .paginate_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
+ if records_continue?
+ api_v1_conversations_url pagination_params(max_id: pagination_max_id)
+ end
+ end
+
+ def prev_path
+ unless @conversations.empty?
+ api_v1_conversations_url pagination_params(min_id: pagination_since_id)
+ end
+ end
+
+ def pagination_max_id
+ @conversations.last.last_status_id
+ end
+
+ def pagination_since_id
+ @conversations.first.last_status_id
+ end
+
+ def records_continue?
+ @conversations.size == limit_param(LIMIT)
+ end
+
+ def pagination_params(core_params)
+ params.slice(:limit).permit(:limit).merge(core_params)
+ end
+end