diff --git a/app/controllers/discourse_subscriptions/admin/subscriptions_controller.rb b/app/controllers/discourse_subscriptions/admin/subscriptions_controller.rb index a3f7f7f..8498c37 100644 --- a/app/controllers/discourse_subscriptions/admin/subscriptions_controller.rb +++ b/app/controllers/discourse_subscriptions/admin/subscriptions_controller.rb @@ -7,14 +7,33 @@ module DiscourseSubscriptions include DiscourseSubscriptions::Group before_action :set_api_key + PAGE_LIMIT = 10 + def index begin subscription_ids = Subscription.all.pluck(:external_id) - subscriptions = [] + subscriptions = { + has_more: false, + data: [], + length: 0, + last_record: params[:last_record] + } if subscription_ids.present? && is_stripe_configured? - subscriptions = ::Stripe::Subscription.list(expand: ['data.plan.product']) - subscriptions = subscriptions.select { |sub| subscription_ids.include?(sub[:id]) } + while subscriptions[:length] < PAGE_LIMIT + current_set = get_subscriptions(subscriptions[:last_record]) + + until valid_subscriptions = find_valid_subscriptions(current_set[:data], subscription_ids) do + current_set = get_subscriptions(current_set[:data].last) + break if current_set[:has_more] == false + end + + subscriptions[:data] = subscriptions[:data].concat(valid_subscriptions.to_a) + subscriptions[:last_record] = current_set[:data].last[:id] if current_set[:data].present? + subscriptions[:length] = subscriptions[:data].length + subscriptions[:has_more] = current_set[:has_more] + break if subscriptions[:has_more] == false + end elsif !is_stripe_configured? subscriptions = nil end @@ -54,6 +73,15 @@ module DiscourseSubscriptions private + def get_subscriptions(start) + ::Stripe::Subscription.list(expand: ['data.plan.product'], limit: PAGE_LIMIT, starting_after: start) + end + + def find_valid_subscriptions(data, ids) + valid = data.select { |sub| ids.include?(sub[:id]) } + valid.empty? ? nil : valid + end + # this will only refund the most recent subscription payment def refund_subscription(subscription_id) subscription = ::Stripe::Subscription.retrieve(subscription_id) diff --git a/assets/javascripts/discourse/controllers/admin-plugins-discourse-subscriptions-subscriptions.js.es6 b/assets/javascripts/discourse/controllers/admin-plugins-discourse-subscriptions-subscriptions.js.es6 index f4b51f9..541ef9f 100644 --- a/assets/javascripts/discourse/controllers/admin-plugins-discourse-subscriptions-subscriptions.js.es6 +++ b/assets/javascripts/discourse/controllers/admin-plugins-discourse-subscriptions-subscriptions.js.es6 @@ -1,12 +1,30 @@ +import AdminSubscription from "discourse/plugins/discourse-subscriptions/discourse/models/admin-subscription"; import Controller from "@ember/controller"; import showModal from "discourse/lib/show-modal"; export default Controller.extend({ + loading: false, + actions: { showCancelModal(subscription) { showModal("admin-cancel-subscription", { model: subscription, }); }, + + loadMore() { + if (!this.loading && this.model.has_more) { + this.set("loading", true); + + return AdminSubscription.loadMore(this.model.last_record).then( + (result) => { + const updated = this.model.data.concat(result.data); + this.set("model", result); + this.set("model.data", updated); + this.set("loading", false); + } + ); + } + }, }, }); diff --git a/assets/javascripts/discourse/models/admin-subscription.js.es6 b/assets/javascripts/discourse/models/admin-subscription.js.es6 index 0641244..b20625e 100644 --- a/assets/javascripts/discourse/models/admin-subscription.js.es6 +++ b/assets/javascripts/discourse/models/admin-subscription.js.es6 @@ -38,9 +38,20 @@ AdminSubscription.reopenClass({ if (result === null) { return { unconfigured: true }; } - return result.map((subscription) => + result.data = result.data.map((subscription) => AdminSubscription.create(subscription) ); + return result; + }); + }, + loadMore(lastRecord) { + return ajax(`/s/admin/subscriptions?last_record=${lastRecord}`, { + method: "get", + }).then((result) => { + result.data = result.data.map((subscription) => + AdminSubscription.create(subscription) + ); + return result; }); }, }); diff --git a/assets/javascripts/discourse/templates/admin/plugins-discourse-subscriptions-subscriptions.hbs b/assets/javascripts/discourse/templates/admin/plugins-discourse-subscriptions-subscriptions.hbs index fcf5877..151a9c2 100644 --- a/assets/javascripts/discourse/templates/admin/plugins-discourse-subscriptions-subscriptions.hbs +++ b/assets/javascripts/discourse/templates/admin/plugins-discourse-subscriptions-subscriptions.hbs @@ -2,42 +2,45 @@
{{i18n 'discourse_subscriptions.admin.unconfigured'}}
Discourse Subscriptions on Meta
{{else}} -| {{i18n 'discourse_subscriptions.admin.subscriptions.subscription.user'}} | -{{i18n 'discourse_subscriptions.admin.subscriptions.subscription.subscription_id'}} | -{{i18n 'discourse_subscriptions.admin.subscriptions.subscription.customer'}} | -{{i18n 'discourse_subscriptions.admin.subscriptions.subscription.product'}} | -{{i18n 'discourse_subscriptions.admin.subscriptions.subscription.plan'}} | -{{i18n 'discourse_subscriptions.admin.subscriptions.subscription.status'}} | -{{i18n 'discourse_subscriptions.admin.subscriptions.subscription.created_at'}} | -- |
|---|---|---|---|---|---|---|---|
| - {{#if subscription.metadataUserExists}} - - {{subscription.metadata.username}} - - {{/if}} - | -{{subscription.id}} | -{{subscription.customer}} | -{{subscription.plan.product.name}} | -{{subscription.plan.nickname}} | -{{subscription.status}} | -{{format-unix-date subscription.created}} | -- {{#if subscription.loading}} - {{loading-spinner size="small"}} - {{else}} - {{d-button disabled=subscription.canceled label="cancel" action=(action "showCancelModal" subscription) icon="times"}} - {{/if}} - | -
| {{i18n 'discourse_subscriptions.admin.subscriptions.subscription.user'}} | +{{i18n 'discourse_subscriptions.admin.subscriptions.subscription.subscription_id'}} | +{{i18n 'discourse_subscriptions.admin.subscriptions.subscription.customer'}} | +{{i18n 'discourse_subscriptions.admin.subscriptions.subscription.product'}} | +{{i18n 'discourse_subscriptions.admin.subscriptions.subscription.plan'}} | +{{i18n 'discourse_subscriptions.admin.subscriptions.subscription.status'}} | +{{i18n 'discourse_subscriptions.admin.subscriptions.subscription.created_at'}} | ++ |
|---|---|---|---|---|---|---|---|
| + {{#if subscription.metadataUserExists}} + + {{subscription.metadata.username}} + + {{/if}} + | +{{subscription.id}} | +{{subscription.customer}} | +{{subscription.plan.product.name}} | +{{subscription.plan.nickname}} | +{{subscription.status}} | +{{format-unix-date subscription.created}} | ++ {{#if subscription.loading}} + {{loading-spinner size="small"}} + {{else}} + {{d-button disabled=subscription.canceled label="cancel" action=(action "showCancelModal" subscription) icon="times"}} + {{/if}} + | +