From afaba56de351e008f073aff314f295fb94baa96d Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 12 Aug 2016 16:35:10 +1000 Subject: [PATCH] FEATURE: missing API endpoint for topic tracking states --- app/controllers/users_controller.rb | 14 +++++++++++- config/routes.rb | 5 +++-- spec/controllers/users_controller_spec.rb | 27 ++++++++++++++++++++++- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index b973a8474..6baa28bda 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -7,7 +7,9 @@ class UsersController < ApplicationController skip_before_filter :authorize_mini_profiler, only: [:avatar] skip_before_filter :check_xhr, only: [:show, :password_reset, :update, :account_created, :activate_account, :perform_account_activation, :user_preferences_redirect, :avatar, :my_redirect, :toggle_anon, :admin_login] - before_filter :ensure_logged_in, only: [:username, :update, :user_preferences_redirect, :upload_user_image, :pick_avatar, :destroy_user_image, :destroy, :check_emails] + before_filter :ensure_logged_in, only: [:username, :update, :user_preferences_redirect, :upload_user_image, + :pick_avatar, :destroy_user_image, :destroy, :check_emails, :topic_tracking_state] + before_filter :respond_to_suspicious_request, only: [:create] # we need to allow account creation with bad CSRF tokens, if people are caching, the CSRF token on the @@ -140,6 +142,16 @@ class UsersController < ApplicationController render json: failed_json, status: 403 end + def topic_tracking_state + user = fetch_user_from_params + guardian.ensure_can_edit!(user) + + report = TopicTrackingState.report(user.id) + serializer = ActiveModel::ArraySerializer.new(report, each_serializer: TopicTrackingStateSerializer) + + render json: MultiJson.dump(serializer) + end + def badge_title params.require(:user_badge_id) diff --git a/config/routes.rb b/config/routes.rb index 37a93cd26..2dc78c946 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -315,9 +315,7 @@ Discourse::Application.routes.draw do get "users/:username/preferences/card-badge" => "users#card_badge", constraints: {username: USERNAME_ROUTE_FORMAT} put "users/:username/preferences/card-badge" => "users#update_card_badge", constraints: {username: USERNAME_ROUTE_FORMAT} get "users/:username/staff-info" => "users#staff_info", constraints: {username: USERNAME_ROUTE_FORMAT} - get "users/:username/summary" => "users#summary", constraints: {username: USERNAME_ROUTE_FORMAT} - get "users/:username/invited" => "users#invited", constraints: {username: USERNAME_ROUTE_FORMAT} get "users/:username/invited_count" => "users#invited_count", constraints: {username: USERNAME_ROUTE_FORMAT} get "users/:username/invited/:filter" => "users#invited", constraints: {username: USERNAME_ROUTE_FORMAT} @@ -339,6 +337,9 @@ Discourse::Application.routes.draw do get "users/by-external/:external_id" => "users#show", constraints: {external_id: /[^\/]+/} get "users/:username/flagged-posts" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT} get "users/:username/deleted-posts" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT} + + get "users/:username/topic-tracking-state" => "users#topic_tracking_state", constraints: {username: USERNAME_ROUTE_FORMAT} + get "user-badges/:username.json" => "user_badges#username", constraints: {username: USERNAME_ROUTE_FORMAT}, defaults: {format: :json} get "user-badges/:username" => "user_badges#username", constraints: {username: USERNAME_ROUTE_FORMAT} diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index aa025c323..8f9bb6ff1 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -1625,7 +1625,32 @@ describe UsersController do end - context '#summary' do + describe '.topic_tracking_state' do + let(:user){Fabricate(:user)} + + context 'anon' do + it "raises an error on anon for topic_tracking_state" do + expect{ + xhr :get, :topic_tracking_state, username: user.username, format: :json + }.to raise_error(Discourse::NotLoggedIn) + end + end + + context 'logged on' do + it "detects new topic" do + log_in_user(user) + + topic = Fabricate(:topic) + xhr :get, :topic_tracking_state, username: user.username, format: :json + + states = JSON.parse(response.body) + + expect(states[0]["topic_id"]).to eq(topic.id) + end + end + end + + describe '.summary' do it "generates summary info" do user = Fabricate(:user)