From 6c4d9ecfdca389d89de7de21fafcf3ff228e52c6 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Thu, 14 Mar 2013 18:26:12 -0400 Subject: [PATCH] Use one request to fetch dashboard report data and check version --- .../admin/models/admin_dashboard.js | 14 ++++++ .../admin/routes/admin_dashboard_route.js | 28 ++++------- .../admin/templates/dashboard.js.handlebars | 16 +++--- .../admin/templates/report.js.handlebars | 9 ---- .../per_day_counts_report.js.handlebars | 16 +++--- .../summed_counts_report.js.handlebars | 16 +++--- app/controllers/admin/dashboard_controller.rb | 11 ++++ config/routes.rb | 1 + .../admin/dashboard_controller_spec.rb | 50 +++++++++++++++++++ 9 files changed, 111 insertions(+), 50 deletions(-) create mode 100644 app/assets/javascripts/admin/models/admin_dashboard.js delete mode 100644 app/assets/javascripts/admin/templates/report.js.handlebars create mode 100644 app/controllers/admin/dashboard_controller.rb create mode 100644 spec/controllers/admin/dashboard_controller_spec.rb diff --git a/app/assets/javascripts/admin/models/admin_dashboard.js b/app/assets/javascripts/admin/models/admin_dashboard.js new file mode 100644 index 00000000000..f98ad76dfef --- /dev/null +++ b/app/assets/javascripts/admin/models/admin_dashboard.js @@ -0,0 +1,14 @@ +Discourse.AdminDashboard = Discourse.Model.extend({}); + +Discourse.AdminDashboard.reopenClass({ + find: function() { + var model = Discourse.AdminDashboard.create(); + return $.ajax("/admin/dashboard", { + type: 'GET', + success: function(json) { + model.mergeAttributes(json); + model.set('loaded', true); + } + }); + } +}); \ No newline at end of file diff --git a/app/assets/javascripts/admin/routes/admin_dashboard_route.js b/app/assets/javascripts/admin/routes/admin_dashboard_route.js index 18ac53f0f52..74845ee5174 100644 --- a/app/assets/javascripts/admin/routes/admin_dashboard_route.js +++ b/app/assets/javascripts/admin/routes/admin_dashboard_route.js @@ -8,8 +8,7 @@ **/ Discourse.AdminDashboardRoute = Discourse.Route.extend({ setupController: function(c) { - this.checkVersion(c); - this.fetchReports(c); + this.fetchDashboardData(c); this.fetchGithubCommits(c); }, @@ -17,26 +16,21 @@ Discourse.AdminDashboardRoute = Discourse.Route.extend({ this.render({into: 'admin/templates/admin'}); }, - checkVersion: function(c) { - if( Discourse.SiteSettings.version_checks && (!c.get('versionCheckedAt') || Date.create('12 hours ago', 'en') > c.get('versionCheckedAt')) ) { - c.set('versionCheckedAt', new Date()); - Discourse.VersionCheck.find().then(function(vc) { - c.set('versionCheck', vc); + fetchDashboardData: function(c) { + if( !c.get('dashboardFetchedAt') || Date.create('1 hour ago', 'en') > c.get('dashboardFetchedAt') ) { + c.set('dashboardFetchedAt', new Date()); + Discourse.AdminDashboard.find().then(function(d) { + if( Discourse.SiteSettings.version_checks ){ + c.set('versionCheck', Discourse.VersionCheck.create(d.version_check)); + } + d.reports.each(function(report){ + c.set(report.type, Discourse.Report.create(report)); + }); c.set('loading', false); }); } }, - fetchReports: function(c) { - if( !c.get('reportsCheckedAt') || Date.create('1 hour ago', 'en') > c.get('reportsCheckedAt') ) { - // TODO: use one request to get all reports, or maybe one request for all dashboard data including version check. - c.set('reportsCheckedAt', new Date()); - ['visits', 'signups', 'topics', 'posts', 'total_users', 'flags'].each(function(reportType){ - c.set(reportType, Discourse.Report.find(reportType)); - }); - } - }, - fetchGithubCommits: function(c) { if( !c.get('commitsCheckedAt') || Date.create('1 hour ago', 'en') > c.get('commitsCheckedAt') ) { c.set('commitsCheckedAt', new Date()); diff --git a/app/assets/javascripts/admin/templates/dashboard.js.handlebars b/app/assets/javascripts/admin/templates/dashboard.js.handlebars index 665c88f07ee..266947fa95e 100644 --- a/app/assets/javascripts/admin/templates/dashboard.js.handlebars +++ b/app/assets/javascripts/admin/templates/dashboard.js.handlebars @@ -49,10 +49,12 @@ {{i18n admin.dashboard.reports.last_30_days}} - {{ render 'admin_report_signups' signups }} - {{ render 'admin_report_topics' topics }} - {{ render 'admin_report_posts' posts }} - {{ render 'admin_report_flags' flags }} + {{#unless loading}} + {{ render 'admin_report_signups' signups }} + {{ render 'admin_report_topics' topics }} + {{ render 'admin_report_posts' posts }} + {{ render 'admin_report_flags' flags }} + {{/unless}} @@ -67,8 +69,10 @@ {{i18n admin.dashboard.reports.30_days_ago}} - {{ render 'admin_report_total_users' total_users }} - {{ render 'admin_report_visits' visits }} + {{#unless loading}} + {{ render 'admin_report_total_users' total_users }} + {{ render 'admin_report_visits' visits }} + {{/unless}} diff --git a/app/assets/javascripts/admin/templates/report.js.handlebars b/app/assets/javascripts/admin/templates/report.js.handlebars deleted file mode 100644 index 8ac6c4077ac..00000000000 --- a/app/assets/javascripts/admin/templates/report.js.handlebars +++ /dev/null @@ -1,9 +0,0 @@ -{{#if loaded}} - - {{title}} - {{valueAtDaysAgo data 0}} - {{valueAtDaysAgo data 1}} - {{sumLast data 7}} - {{sumLast data 30}} - -{{/if}} \ No newline at end of file diff --git a/app/assets/javascripts/admin/templates/reports/per_day_counts_report.js.handlebars b/app/assets/javascripts/admin/templates/reports/per_day_counts_report.js.handlebars index 8c33b4dc27a..db698fe6490 100644 --- a/app/assets/javascripts/admin/templates/reports/per_day_counts_report.js.handlebars +++ b/app/assets/javascripts/admin/templates/reports/per_day_counts_report.js.handlebars @@ -1,9 +1,7 @@ -{{#if loaded}} - - {{title}} - {{valueAtDaysAgo data 0}} - {{valueAtDaysAgo data 1}} - {{valueAtDaysAgo data 7}} - {{valueAtDaysAgo data 30}} - -{{/if}} \ No newline at end of file + + {{title}} + {{valueAtDaysAgo data 0}} + {{valueAtDaysAgo data 1}} + {{valueAtDaysAgo data 7}} + {{valueAtDaysAgo data 30}} + \ No newline at end of file diff --git a/app/assets/javascripts/admin/templates/reports/summed_counts_report.js.handlebars b/app/assets/javascripts/admin/templates/reports/summed_counts_report.js.handlebars index 8ac6c4077ac..697716cc129 100644 --- a/app/assets/javascripts/admin/templates/reports/summed_counts_report.js.handlebars +++ b/app/assets/javascripts/admin/templates/reports/summed_counts_report.js.handlebars @@ -1,9 +1,7 @@ -{{#if loaded}} - - {{title}} - {{valueAtDaysAgo data 0}} - {{valueAtDaysAgo data 1}} - {{sumLast data 7}} - {{sumLast data 30}} - -{{/if}} \ No newline at end of file + + {{title}} + {{valueAtDaysAgo data 0}} + {{valueAtDaysAgo data 1}} + {{sumLast data 7}} + {{sumLast data 30}} + \ No newline at end of file diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb new file mode 100644 index 00000000000..9d34bbaf4ee --- /dev/null +++ b/app/controllers/admin/dashboard_controller.rb @@ -0,0 +1,11 @@ +class Admin::DashboardController < Admin::AdminController + + def index + render_json_dump({ + reports: ['visits', 'signups', 'topics', 'posts', 'total_users', 'flags'].map { |type| Report.find(type) } + }.merge( + SiteSetting.version_checks? ? {version_check: DiscourseUpdates.check_version} : {} + )) + end + +end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 1170701d4ec..bd828713e30 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -55,6 +55,7 @@ Discourse::Application.routes.draw do resources :site_customizations resources :export get 'version_check' => 'versions#show' + resources :dashboard, only: [:index] end get 'email_preferences' => 'email#preferences_redirect' diff --git a/spec/controllers/admin/dashboard_controller_spec.rb b/spec/controllers/admin/dashboard_controller_spec.rb new file mode 100644 index 00000000000..6a323435198 --- /dev/null +++ b/spec/controllers/admin/dashboard_controller_spec.rb @@ -0,0 +1,50 @@ +require 'spec_helper' + +describe Admin::DashboardController do + + it "is a subclass of AdminController" do + (Admin::DashboardController < Admin::AdminController).should be_true + end + + context 'while logged in as an admin' do + let!(:admin) { log_in(:admin) } + + context '.index' do + it 'should be successful' do + xhr :get, :index + response.should be_successful + end + + context 'version checking is enabled' do + before do + SiteSetting.stubs(:version_checks).returns(true) + end + + it 'returns discourse version info' do + xhr :get, :index + json = JSON.parse(response.body) + json['version_check'].should be_present + end + end + + context 'version checking is disabled' do + before do + SiteSetting.stubs(:version_checks).returns(false) + end + + it 'does not return discourse version info' do + xhr :get, :index + json = JSON.parse(response.body) + json['version_check'].should_not be_present + end + end + + it 'returns report data' do + xhr :get, :index + json = JSON.parse(response.body) + json.should have_key('reports') + json['reports'].should be_a(Array) + end + end + end +end \ No newline at end of file