From 029deed81262ab8de0bd73ad0b46aa1fc98f2c82 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Thu, 11 Jan 2018 00:02:26 -0800 Subject: [PATCH] Subscription cancellations admin page --- app/core/Router.coffee | 1 + app/lib/dynamicRequire.coffee | 1 + app/templates/admin.jade | 2 ++ .../admin/admin-sub-cancellations.jade | 26 +++++++++++++++++++ .../admin/AdminSubCancellationsView.coffee | 17 ++++++++++++ server/routes/index.coffee | 2 ++ 6 files changed, 49 insertions(+) create mode 100644 app/templates/admin/admin-sub-cancellations.jade create mode 100644 app/views/admin/AdminSubCancellationsView.coffee diff --git a/app/core/Router.coffee b/app/core/Router.coffee index c55f5680b58..63766708936 100644 --- a/app/core/Router.coffee +++ b/app/core/Router.coffee @@ -53,6 +53,7 @@ module.exports = class CocoRouter extends Backbone.Router 'admin/level-sessions': go('admin/LevelSessionsView') 'admin/school-counts': go('admin/SchoolCountsView') 'admin/school-licenses': go('admin/SchoolLicensesView') + 'admin/sub-cancellations': go('admin/AdminSubCancellationsView') 'admin/base': go('admin/BaseView') 'admin/demo-requests': go('admin/DemoRequestsView') 'admin/trial-requests': go('admin/TrialRequestsView') diff --git a/app/lib/dynamicRequire.coffee b/app/lib/dynamicRequire.coffee index a4f16c63660..c41a6e4de3a 100644 --- a/app/lib/dynamicRequire.coffee +++ b/app/lib/dynamicRequire.coffee @@ -20,6 +20,7 @@ dynamicRequire = (path) -> when 'views/admin/AnalyticsView' then require.ensure(['views/admin/AnalyticsView'], ((require) -> accept(require('views/admin/AnalyticsView'))), reject, 'admin') when 'views/admin/AnalyticsSubscriptionsView' then require.ensure(['views/admin/AnalyticsSubscriptionsView'], ((require) -> accept(require('views/admin/AnalyticsSubscriptionsView'))), reject, 'admin') when 'views/admin/AdminLevelHintsView' then require.ensure(['views/admin/AdminLevelHintsView'], ((require) -> accept(require('views/admin/AdminLevelHintsView'))), reject, 'admin') + when 'views/admin/AdminSubCancellationsView' then require.ensure(['views/admin/AdminSubCancellationsView'], ((require) -> accept(require('views/admin/AdminSubCancellationsView'))), reject, 'admin') # when 'views/admin/LevelSessionsView' then require.ensure(['views/admin/LevelSessionsView'], ((require) -> accept(require('views/admin/LevelSessionsView'))), reject, 'admin') when 'views/admin/SchoolCountsView' then require.ensure(['views/admin/SchoolCountsView'], ((require) -> accept(require('views/admin/SchoolCountsView'))), reject, 'admin') when 'views/admin/SchoolLicensesView' then require.ensure(['views/admin/SchoolLicensesView'], ((require) -> accept(require('views/admin/SchoolLicensesView'))), reject, 'admin') diff --git a/app/templates/admin.jade b/app/templates/admin.jade index f4cad190513..05d39526ae1 100644 --- a/app/templates/admin.jade +++ b/app/templates/admin.jade @@ -74,6 +74,8 @@ block content a(href="/admin/school-counts") School Counts li a(href="/admin/analytics/subscriptions") Subscriptions + li + a(href="/admin/sub-cancellations") Subscription Cancellations li a(href="/admin/demo-requests") Teacher Demo Requests p diff --git a/app/templates/admin/admin-sub-cancellations.jade b/app/templates/admin/admin-sub-cancellations.jade new file mode 100644 index 00000000000..cf720e164d5 --- /dev/null +++ b/app/templates/admin/admin-sub-cancellations.jade @@ -0,0 +1,26 @@ +extends /templates/base + +//- DO NOT TRANSLATE + +block content + + if me.isAdmin() + h1 Subscription Cancellations + .small Returning #{view.limit} max latest cancellations, set 'limit' query variable to change. + br + if view.cancelEvents + table.table-striped.table-condensed + tr + td Date + td User Id + td Message + each event in view.cancelEvents + tr + td #{view.objectIdToDate(event._id).toISOString()} + td #{event.user} + if event.properties + td #{event.properties.message} + else + td + else + h3 Loading.. diff --git a/app/views/admin/AdminSubCancellationsView.coffee b/app/views/admin/AdminSubCancellationsView.coffee new file mode 100644 index 00000000000..d00e55c3a2d --- /dev/null +++ b/app/views/admin/AdminSubCancellationsView.coffee @@ -0,0 +1,17 @@ +RootView = require 'views/core/RootView' +CocoCollection = require 'collections/CocoCollection' +utils = require 'core/utils' + +module.exports = class AdminSubCancellationsView extends RootView + id: 'admin-sub-cancellations-view' + template: require 'templates/admin/admin-sub-cancellations' + + initialize: -> + return super() unless me.isAdmin() + @objectIdToDate = utils.objectIdToDate + @limit = utils.getQueryVariable('limit', 100) + url = '/db/analytics.log.event?filter[event]="Unsubscribe End"&conditions[sort]="-_id"&conditions[limit]=' + @limit + Promise.resolve($.get(url)) + .then (@cancelEvents) => + @render?() + super() diff --git a/server/routes/index.coffee b/server/routes/index.coffee index 142b1da4622..a5239274de9 100644 --- a/server/routes/index.coffee +++ b/server/routes/index.coffee @@ -66,6 +66,8 @@ module.exports.setup = (app) -> app.post('/db/achievement/:handle/watchers', mw.patchable.joinWatchers(Achievement)) app.delete('/db/achievement/:handle/watchers', mw.patchable.leaveWatchers(Achievement)) + AnalyticsLogEvent = require '../models/AnalyticsLogEvent' + app.get('/db/analytics.log.event', mw.auth.checkHasPermission(['admin']), mw.rest.get(AnalyticsLogEvent)) app.post('/db/analytics.log.event/-/log_event', mw.auth.checkHasUser(), mw.analyticsLogEvents.post) app.post('/db/analytics_perday/-/active_classes', mw.auth.checkHasPermission(['admin']), mw.analyticsPerDay.getActiveClasses)