DEV: Remove deprecations & improve error handling (#12)
- Replace deprecated methods on client - Fix broken dropdowns due to select kit 2 upgrade - Graceful error handling when Stripe keys are not configured but plugin enabled
This commit is contained in:
@@ -12,9 +12,11 @@ module DiscourseSubscriptions
|
||||
product_ids = Product.all.pluck(:external_id)
|
||||
products = []
|
||||
|
||||
if product_ids.present?
|
||||
if product_ids.present? && is_stripe_configured?
|
||||
products = ::Stripe::Product.list({ ids: product_ids })
|
||||
products = products[:data]
|
||||
elsif !is_stripe_configured?
|
||||
products = nil
|
||||
end
|
||||
|
||||
render_json_dump products
|
||||
|
||||
@@ -12,9 +12,11 @@ module DiscourseSubscriptions
|
||||
subscription_ids = Subscription.all.pluck(:external_id)
|
||||
subscriptions = []
|
||||
|
||||
if subscription_ids.present?
|
||||
if subscription_ids.present? && is_stripe_configured?
|
||||
subscriptions = ::Stripe::Subscription.list(expand: ['data.plan.product'])
|
||||
subscriptions = subscriptions.select { |sub| subscription_ids.include?(sub[:id]) }
|
||||
elsif !is_stripe_configured?
|
||||
subscriptions = nil
|
||||
end
|
||||
|
||||
render_json_dump subscriptions
|
||||
|
||||
@@ -7,5 +7,9 @@ module DiscourseSubscriptions
|
||||
def set_api_key
|
||||
::Stripe.api_key = SiteSetting.discourse_subscriptions_secret_key
|
||||
end
|
||||
|
||||
def is_stripe_configured?
|
||||
SiteSetting.discourse_subscriptions_public_key.present? && SiteSetting.discourse_subscriptions_secret_key.present?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -11,7 +11,7 @@ module DiscourseSubscriptions
|
||||
product_ids = Product.all.pluck(:external_id)
|
||||
products = []
|
||||
|
||||
if product_ids.present?
|
||||
if product_ids.present? && is_stripe_configured?
|
||||
response = ::Stripe::Product.list({
|
||||
ids: product_ids,
|
||||
active: true
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { equal } from "@ember/object/computed";
|
||||
import Component from "@ember/component";
|
||||
|
||||
export default Ember.Component.extend({
|
||||
export default Component.extend({
|
||||
planButtonSelected: equal("planTypeIsSelected", true),
|
||||
paymentButtonSelected: equal("planTypeIsSelected", false),
|
||||
|
||||
|
||||
@@ -1,9 +1,16 @@
|
||||
import computed from "discourse-common/utils/decorators";
|
||||
import discourseComputed from "discourse-common/utils/decorators";
|
||||
import User from "discourse/models/user";
|
||||
import { isEmpty } from "@ember/utils";
|
||||
import Component from "@ember/component";
|
||||
|
||||
export default Ember.Component.extend({
|
||||
@computed()
|
||||
currentUser() {
|
||||
export default Component.extend({
|
||||
@discourseComputed("products")
|
||||
emptyProducts(products) {
|
||||
return isEmpty(products);
|
||||
},
|
||||
|
||||
@discourseComputed()
|
||||
isLoggedIn() {
|
||||
return User.current();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
export default Ember.Component.extend({
|
||||
import Component from "@ember/component";
|
||||
|
||||
export default Component.extend({
|
||||
didInsertElement() {
|
||||
this._super(...arguments);
|
||||
this.cardElement.mount("#card-element");
|
||||
|
||||
+3
-1
@@ -1,4 +1,6 @@
|
||||
export default Ember.Controller.extend({
|
||||
import Controller from "@ember/controller";
|
||||
|
||||
export default Controller.extend({
|
||||
queryParams: ["order", "descending"],
|
||||
order: null,
|
||||
descending: true,
|
||||
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
import Controller from "@ember/controller";
|
||||
import DiscourseURL from "discourse/lib/url";
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
export default Controller.extend({
|
||||
actions: {
|
||||
editPlan(id) {
|
||||
return DiscourseURL.redirectTo(
|
||||
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
import Controller from "@ember/controller";
|
||||
import { popupAjaxError } from "discourse/lib/ajax-error";
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
export default Controller.extend({
|
||||
actions: {
|
||||
createPlan() {
|
||||
if (this.get("model.plan.product_id") === undefined) {
|
||||
|
||||
+3
-1
@@ -1 +1,3 @@
|
||||
export default Ember.Controller.extend({});
|
||||
import Controller from "@ember/controller";
|
||||
|
||||
export default Controller.extend({});
|
||||
|
||||
+3
-1
@@ -1 +1,3 @@
|
||||
export default Ember.Controller.extend({});
|
||||
import Controller from "@ember/controller";
|
||||
|
||||
export default Controller.extend({});
|
||||
|
||||
+29
-5
@@ -1,16 +1,40 @@
|
||||
import computed from "ember-addons/ember-computed-decorators";
|
||||
import discourseComputed from "discourse-common/utils/decorators";
|
||||
import DiscourseURL from "discourse/lib/url";
|
||||
import Controller from "@ember/controller";
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
export default Controller.extend({
|
||||
// Also defined in settings.
|
||||
currencies: ["AUD", "CAD", "EUR", "GBP", "USD", "INR"],
|
||||
selectedCurrency: Ember.computed.alias("model.plan.currency"),
|
||||
selectedInterval: Ember.computed.alias("model.plan.interval"),
|
||||
|
||||
@computed("model.plan.isNew")
|
||||
@discourseComputed
|
||||
currencies() {
|
||||
return [
|
||||
{ id: "AUD", name: "AUD" },
|
||||
{ id: "CAD", name: "CAD" },
|
||||
{ id: "EUR", name: "EUR" },
|
||||
{ id: "GBP", name: "GBP" },
|
||||
{ id: "USD", name: "USD" },
|
||||
{ id: "INR", name: "INR" }
|
||||
];
|
||||
},
|
||||
|
||||
@discourseComputed
|
||||
availableIntervals() {
|
||||
return [
|
||||
{ id: "day", name: "day" },
|
||||
{ id: "week", name: "week" },
|
||||
{ id: "month", name: "month" },
|
||||
{ id: "year", name: "year" }
|
||||
];
|
||||
},
|
||||
|
||||
@discourseComputed("model.plan.isNew")
|
||||
planFieldDisabled(isNew) {
|
||||
return !isNew;
|
||||
},
|
||||
|
||||
@computed("model.product.id")
|
||||
@discourseComputed("model.product.id")
|
||||
productId(id) {
|
||||
return id;
|
||||
},
|
||||
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
import { popupAjaxError } from "discourse/lib/ajax-error";
|
||||
import Controller from "@ember/controller";
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
export default Controller.extend({
|
||||
actions: {
|
||||
cancelProduct() {
|
||||
this.transitionToRoute("adminPlugins.discourse-subscriptions.products");
|
||||
|
||||
+3
-1
@@ -1 +1,3 @@
|
||||
export default Ember.Controller.extend({});
|
||||
import Controller from "@ember/controller";
|
||||
|
||||
export default Controller.extend({});
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
export default Ember.Controller.extend({});
|
||||
import Controller from "@ember/controller";
|
||||
|
||||
export default Controller.extend({});
|
||||
|
||||
@@ -1,18 +1,19 @@
|
||||
import Controller from "@ember/controller";
|
||||
import Customer from "discourse/plugins/discourse-subscriptions/discourse/models/customer";
|
||||
import Payment from "discourse/plugins/discourse-subscriptions/discourse/models/payment";
|
||||
import Subscription from "discourse/plugins/discourse-subscriptions/discourse/models/subscription";
|
||||
import computed from "discourse-common/utils/decorators";
|
||||
import discourseComputed from "discourse-common/utils/decorators";
|
||||
import I18n from "I18n";
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
export default Controller.extend({
|
||||
planTypeIsSelected: true,
|
||||
|
||||
@computed("planTypeIsSelected")
|
||||
@discourseComputed("planTypeIsSelected")
|
||||
type(planTypeIsSelected) {
|
||||
return planTypeIsSelected ? "plans" : "payment";
|
||||
},
|
||||
|
||||
@computed("type")
|
||||
@discourseComputed("type")
|
||||
buttonText(type) {
|
||||
return I18n.t(`discourse_subscriptions.${type}.payment_button`);
|
||||
},
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
export default Ember.Controller.extend({});
|
||||
import Controller from "@ember/controller";
|
||||
|
||||
export default Controller.extend({});
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
// TODO: typo in this helper name: currency not curency.
|
||||
export default Ember.Helper.helper(function(params) {
|
||||
let currencySign;
|
||||
|
||||
switch (Discourse.SiteSettings.discourse_subscriptions_currency) {
|
||||
case "EUR":
|
||||
currencySign = "€";
|
||||
break;
|
||||
case "GBP":
|
||||
currencySign = "£";
|
||||
break;
|
||||
case "INR":
|
||||
currencySign = "₹";
|
||||
break;
|
||||
default:
|
||||
currencySign = "$";
|
||||
}
|
||||
|
||||
return [currencySign, params[0]].join("");
|
||||
});
|
||||
@@ -1,4 +1,6 @@
|
||||
export default Ember.Helper.helper(function(params) {
|
||||
import Helper from "@ember/component/helper";
|
||||
|
||||
export default Helper.helper(function(params) {
|
||||
let currencySign;
|
||||
|
||||
switch (params[0]) {
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
export default Ember.Helper.helper(function(params) {
|
||||
import Helper from "@ember/component/helper";
|
||||
|
||||
export default Helper.helper(function(params) {
|
||||
const payment = params[0];
|
||||
|
||||
return `<a href=\"${payment.url}\">${payment.payment_intent_id}</a>`;
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { registerUnbound } from "discourse-common/lib/helpers";
|
||||
import User from "discourse/models/user";
|
||||
|
||||
export default registerUnbound("user-viewing-self", function(model) {
|
||||
if (Discourse.User.current()) {
|
||||
if (User.current()) {
|
||||
return (
|
||||
Discourse.User.current().username.toLowerCase() ===
|
||||
model.username.toLowerCase()
|
||||
User.current().username.toLowerCase() === model.username.toLowerCase()
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import Plan from "discourse/plugins/discourse-subscriptions/discourse/models/plan";
|
||||
import computed from "ember-addons/ember-computed-decorators";
|
||||
import discourseComputed from "discourse-common/utils/decorators";
|
||||
import { ajax } from "discourse/lib/ajax";
|
||||
|
||||
const AdminPlan = Plan.extend({
|
||||
@@ -10,7 +10,7 @@ const AdminPlan = Plan.extend({
|
||||
intervals: ["day", "week", "month", "year"],
|
||||
metadata: {},
|
||||
|
||||
@computed("trial_period_days")
|
||||
@discourseComputed("trial_period_days")
|
||||
parseTrialPeriodDays(trial_period_days) {
|
||||
if (trial_period_days) {
|
||||
return parseInt(0 + trial_period_days, 10);
|
||||
|
||||
@@ -40,9 +40,12 @@ const AdminProduct = EmberObject.extend({
|
||||
|
||||
AdminProduct.reopenClass({
|
||||
findAll() {
|
||||
return ajax("/s/admin/products", { method: "get" }).then(result =>
|
||||
result.map(product => AdminProduct.create(product))
|
||||
);
|
||||
return ajax("/s/admin/products", { method: "get" }).then(result => {
|
||||
if (result === null) {
|
||||
return { unconfigured: true };
|
||||
}
|
||||
result.map(product => AdminProduct.create(product));
|
||||
});
|
||||
},
|
||||
|
||||
find(id) {
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
import computed from "ember-addons/ember-computed-decorators";
|
||||
import discourseComputed from "discourse-common/utils/decorators";
|
||||
import { ajax } from "discourse/lib/ajax";
|
||||
import EmberObject from "@ember/object";
|
||||
|
||||
const AdminSubscription = EmberObject.extend({
|
||||
@computed("status")
|
||||
@discourseComputed("status")
|
||||
canceled(status) {
|
||||
return status === "canceled";
|
||||
},
|
||||
|
||||
@computed("metadata")
|
||||
@discourseComputed("metadata")
|
||||
metadataUserExists(metadata) {
|
||||
return metadata.user_id && metadata.username;
|
||||
},
|
||||
|
||||
@computed("metadata")
|
||||
@discourseComputed("metadata")
|
||||
subscriptionUserPath(metadata) {
|
||||
return Discourse.getURL(
|
||||
`/admin/users/${metadata.user_id}/${metadata.username}`
|
||||
@@ -31,9 +31,12 @@ AdminSubscription.reopenClass({
|
||||
find() {
|
||||
return ajax("/s/admin/subscriptions", {
|
||||
method: "get"
|
||||
}).then(result =>
|
||||
result.map(subscription => AdminSubscription.create(subscription))
|
||||
);
|
||||
}).then(result => {
|
||||
if (result === null) {
|
||||
return { unconfigured: true };
|
||||
}
|
||||
result.map(subscription => AdminSubscription.create(subscription));
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import EmberObject from "@ember/object";
|
||||
import computed from "discourse-common/utils/decorators";
|
||||
import discourseComputed from "discourse-common/utils/decorators";
|
||||
import { ajax } from "discourse/lib/ajax";
|
||||
|
||||
const Plan = EmberObject.extend({
|
||||
@@ -14,7 +14,7 @@ const Plan = EmberObject.extend({
|
||||
}
|
||||
}),
|
||||
|
||||
@computed("amountDollars", "currency", "interval")
|
||||
@discourseComputed("amountDollars", "currency", "interval")
|
||||
subscriptionRate(amountDollars, currency, interval) {
|
||||
return `${amountDollars} ${currency.toUpperCase()} / ${interval}`;
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import computed from "ember-addons/ember-computed-decorators";
|
||||
import discourseComputed from "discourse-common/utils/decorators";
|
||||
import { ajax } from "discourse/lib/ajax";
|
||||
import EmberObject from "@ember/object";
|
||||
|
||||
const Subscription = EmberObject.extend({
|
||||
@computed("status")
|
||||
@discourseComputed("status")
|
||||
canceled(status) {
|
||||
return status === "canceled";
|
||||
},
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import EmberObject from "@ember/object";
|
||||
import computed from "discourse-common/utils/decorators";
|
||||
import discourseComputed from "discourse-common/utils/decorators";
|
||||
import { ajax } from "discourse/lib/ajax";
|
||||
|
||||
const UserPayment = EmberObject.extend({
|
||||
@computed("amount")
|
||||
@discourseComputed("amount")
|
||||
amountDollars(amount) {
|
||||
return parseFloat(amount / 100).toFixed(2);
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import EmberObject from "@ember/object";
|
||||
import computed from "ember-addons/ember-computed-decorators";
|
||||
import discourseComputed from "discourse-common/utils/decorators";
|
||||
import { ajax } from "discourse/lib/ajax";
|
||||
import Plan from "discourse/plugins/discourse-subscriptions/discourse/models/plan";
|
||||
|
||||
const UserSubscription = EmberObject.extend({
|
||||
@computed("status")
|
||||
@discourseComputed("status")
|
||||
canceled(status) {
|
||||
return status === "canceled";
|
||||
},
|
||||
|
||||
+3
-1
@@ -1,6 +1,7 @@
|
||||
import Route from "@ember/routing/route";
|
||||
import AdminPlan from "discourse/plugins/discourse-subscriptions/discourse/models/admin-plan";
|
||||
import Group from "discourse/models/group";
|
||||
import { hash } from "rsvp";
|
||||
|
||||
export default Route.extend({
|
||||
model(params) {
|
||||
@@ -14,6 +15,7 @@ export default Route.extend({
|
||||
plan = AdminPlan.create({
|
||||
active: true,
|
||||
isNew: true,
|
||||
interval: "month",
|
||||
currency: Discourse.SiteSettings.discourse_subscriptions_currency,
|
||||
product: product.get("id")
|
||||
});
|
||||
@@ -23,7 +25,7 @@ export default Route.extend({
|
||||
|
||||
const groups = Group.findAll({ ignore_automatic: true });
|
||||
|
||||
return Ember.RSVP.hash({ plan, product, groups });
|
||||
return hash({ plan, product, groups });
|
||||
},
|
||||
|
||||
renderTemplate() {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user