From 496f2b970694415ae138d5b0af0f93522f69bcfe Mon Sep 17 00:00:00 2001
From: Rimian Perkins
Date: Wed, 16 Oct 2019 14:15:01 +1100
Subject: [PATCH] save the product
---
app/controllers/admin/products_controller.rb | 30 +++++++++++++++++++
...lugins-discourse-patrons-plans-show.js.es6 | 2 +-
...ins-discourse-patrons-products-show.js.es6 | 9 ++++++
.../discourse-patrons-route-map.js.es6 | 2 +-
.../discourse/models/admin-product.js.es6 | 20 ++++++++++++-
...lugins-discourse-patrons-plans-show.js.es6 | 6 +++-
...ins-discourse-patrons-products-show.js.es6 | 13 ++++++--
.../plugins-discourse-patrons-plans-show.hbs | 22 ++++++++------
...lugins-discourse-patrons-products-show.hbs | 24 ++++++++-------
.../plugins-discourse-patrons-products.hbs | 2 +-
config/locales/client.en.yml | 15 +++++-----
config/routes.rb | 2 +-
plugin.rb | 2 +-
.../admin/products_controller_spec.rb | 30 +++++++++++++++++--
14 files changed, 141 insertions(+), 38 deletions(-)
diff --git a/app/controllers/admin/products_controller.rb b/app/controllers/admin/products_controller.rb
index fb7f5d4..4129bc5 100644
--- a/app/controllers/admin/products_controller.rb
+++ b/app/controllers/admin/products_controller.rb
@@ -30,6 +30,36 @@ module DiscoursePatrons
end
end
+ def show
+ begin
+ product = ::Stripe::Product.retrieve(params[:id])
+
+ render_json_dump product
+
+ rescue ::Stripe::InvalidRequestError => e
+ return render_json_error e.message
+ end
+ end
+
+ def update
+ begin
+ product = ::Stripe::Product.update(
+ params[:id], {
+ name: params[:name],
+ active: params[:active],
+ metadata: {
+ group_name: params[:group_name]
+ }
+ }
+ )
+
+ render_json_dump product
+
+ rescue ::Stripe::InvalidRequestError => e
+ return render_json_error e.message
+ end
+ end
+
def destroy
begin
product = ::Stripe::Product.delete(params[:id])
diff --git a/assets/javascripts/discourse/controllers/admin-plugins-discourse-patrons-plans-show.js.es6 b/assets/javascripts/discourse/controllers/admin-plugins-discourse-patrons-plans-show.js.es6
index 5c8a8d4..ce50880 100644
--- a/assets/javascripts/discourse/controllers/admin-plugins-discourse-patrons-plans-show.js.es6
+++ b/assets/javascripts/discourse/controllers/admin-plugins-discourse-patrons-plans-show.js.es6
@@ -3,7 +3,7 @@ import { popupAjaxError } from "discourse/lib/ajax-error";
export default Ember.Controller.extend({
actions: {
createPlan() {
- this.get("model")
+ this.get("model.plan")
.save()
.then(() => {
this.transitionToRoute("adminPlugins.discourse-patrons.plans");
diff --git a/assets/javascripts/discourse/controllers/admin-plugins-discourse-patrons-products-show.js.es6 b/assets/javascripts/discourse/controllers/admin-plugins-discourse-patrons-products-show.js.es6
index 7533876..963b93f 100644
--- a/assets/javascripts/discourse/controllers/admin-plugins-discourse-patrons-products-show.js.es6
+++ b/assets/javascripts/discourse/controllers/admin-plugins-discourse-patrons-products-show.js.es6
@@ -17,6 +17,15 @@ export default Ember.Controller.extend({
this.transitionToRoute("adminPlugins.discourse-patrons.products");
})
.catch(popupAjaxError);
+ },
+
+ updateProduct() {
+ this.get("model.product")
+ .update()
+ .then(() => {
+ this.transitionToRoute("adminPlugins.discourse-patrons.products");
+ })
+ .catch(popupAjaxError);
}
}
});
diff --git a/assets/javascripts/discourse/discourse-patrons-route-map.js.es6 b/assets/javascripts/discourse/discourse-patrons-route-map.js.es6
index 78ba315..dcefa3f 100644
--- a/assets/javascripts/discourse/discourse-patrons-route-map.js.es6
+++ b/assets/javascripts/discourse/discourse-patrons-route-map.js.es6
@@ -5,7 +5,7 @@ export default {
this.route("discourse-patrons", function() {
this.route("dashboard");
this.route("products", function() {
- this.route("show", { path: "/:plan-id" });
+ this.route("show", { path: "/:product-id" });
});
this.route("plans", function() {
this.route("show", { path: "/:plan-id" });
diff --git a/assets/javascripts/discourse/models/admin-product.js.es6 b/assets/javascripts/discourse/models/admin-product.js.es6
index c875c43..5da5791 100644
--- a/assets/javascripts/discourse/models/admin-product.js.es6
+++ b/assets/javascripts/discourse/models/admin-product.js.es6
@@ -1,6 +1,8 @@
import { ajax } from "discourse/lib/ajax";
const AdminProduct = Discourse.Model.extend({
+ isNew: false,
+
destroy() {
return ajax(`/patrons/admin/products/${this.id}`, { method: "delete" });
},
@@ -13,6 +15,16 @@ const AdminProduct = Discourse.Model.extend({
};
return ajax("/patrons/admin/products", { method: "post", data });
+ },
+
+ update() {
+ const data = {
+ name: this.name,
+ groupName: this.groupName,
+ active: this.active
+ };
+
+ return ajax(`/patrons/admin/products/${this.id}`, { method: "patch", data });
}
});
@@ -21,7 +33,13 @@ AdminProduct.reopenClass({
return ajax("/patrons/admin/products", { method: "get" }).then(result =>
result.map(product => AdminProduct.create(product))
);
- }
+ },
+
+ find(id) {
+ return ajax(`/patrons/admin/products/${id}`, { method: "get" }).then(product =>
+ AdminProduct.create(product)
+ );
+ },
});
export default AdminProduct;
diff --git a/assets/javascripts/discourse/routes/admin-plugins-discourse-patrons-plans-show.js.es6 b/assets/javascripts/discourse/routes/admin-plugins-discourse-patrons-plans-show.js.es6
index 1818889..7b49b78 100644
--- a/assets/javascripts/discourse/routes/admin-plugins-discourse-patrons-plans-show.js.es6
+++ b/assets/javascripts/discourse/routes/admin-plugins-discourse-patrons-plans-show.js.es6
@@ -1,7 +1,11 @@
import AdminPlan from "discourse/plugins/discourse-patrons/discourse/models/admin-plan";
+import AdminProduct from "discourse/plugins/discourse-patrons/discourse/models/admin-product";
export default Discourse.Route.extend({
model() {
- return AdminPlan.create();
+ const plan = AdminPlan.create();
+ const products = AdminProduct.findAll();
+
+ return Ember.RSVP.hash({ plan, products });
}
});
diff --git a/assets/javascripts/discourse/routes/admin-plugins-discourse-patrons-products-show.js.es6 b/assets/javascripts/discourse/routes/admin-plugins-discourse-patrons-products-show.js.es6
index 4771d63..9a22327 100644
--- a/assets/javascripts/discourse/routes/admin-plugins-discourse-patrons-products-show.js.es6
+++ b/assets/javascripts/discourse/routes/admin-plugins-discourse-patrons-products-show.js.es6
@@ -2,8 +2,17 @@ import AdminProduct from "discourse/plugins/discourse-patrons/discourse/models/a
import Group from "discourse/models/group";
export default Discourse.Route.extend({
- model(param) {
- const product = AdminProduct.create();
+ model(params) {
+ const id = params['product-id'];
+ let product;
+
+ if(id === 'new') {
+ product = AdminProduct.create({ active: true, isNew: true });
+ }
+ else {
+ product = AdminProduct.find(id);
+ }
+
const groups = Group.findAll({ ignore_automatic: true });
return Ember.RSVP.hash({ product, groups });
diff --git a/assets/javascripts/discourse/templates/admin/plugins-discourse-patrons-plans-show.hbs b/assets/javascripts/discourse/templates/admin/plugins-discourse-patrons-plans-show.hbs
index 48f83c4..7c2905f 100644
--- a/assets/javascripts/discourse/templates/admin/plugins-discourse-patrons-plans-show.hbs
+++ b/assets/javascripts/discourse/templates/admin/plugins-discourse-patrons-plans-show.hbs
@@ -2,18 +2,22 @@
{{i18n 'discourse_patrons.admin.plans.title'}}
diff --git a/assets/javascripts/discourse/templates/admin/plugins-discourse-patrons-products-show.hbs b/assets/javascripts/discourse/templates/admin/plugins-discourse-patrons-products-show.hbs
index 3e47074..89e7dad 100644
--- a/assets/javascripts/discourse/templates/admin/plugins-discourse-patrons-products-show.hbs
+++ b/assets/javascripts/discourse/templates/admin/plugins-discourse-patrons-products-show.hbs
@@ -2,20 +2,24 @@
{{i18n 'discourse_patrons.admin.products.title'}}
- {{d-button label="discourse_patrons.admin.products.show.create" action="createProduct" icon="plus"}}
+ {{#if model.product.isNew}}
+ {{d-button label="discourse_patrons.admin.products.operations.create" action="createProduct" icon="plus"}}
+ {{else}}
+ {{d-button label="discourse_patrons.admin.products.operations.update" action="updateProduct" icon="fa-save"}}
+ {{/if}}
diff --git a/assets/javascripts/discourse/templates/admin/plugins-discourse-patrons-products.hbs b/assets/javascripts/discourse/templates/admin/plugins-discourse-patrons-products.hbs
index 025420a..efa8bd5 100644
--- a/assets/javascripts/discourse/templates/admin/plugins-discourse-patrons-products.hbs
+++ b/assets/javascripts/discourse/templates/admin/plugins-discourse-patrons-products.hbs
@@ -2,7 +2,7 @@
{{#link-to 'adminPlugins.discourse-patrons.products.show' 'new' class="btn btn-primary"}}
{{d-icon "plus"}}
- {{i18n 'discourse_patrons.admin.products.new'}}
+ {{i18n 'discourse_patrons.admin.products.operations.new'}}
{{/link-to}}
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 9942488..05cab60 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -61,18 +61,17 @@ en:
amount: Amount
products:
title: Products
- new: New Product
- show:
- group: User Group
- create: Create Product
- active: Active
+ operations:
+ create: Create New Product
+ update: Update Product
+ new: New Product
+ destroy:
+ confirm: Are you sure you want to destroy this product?
product:
product_id: Product ID
+ name: Product Name
group: User Group
active: Active
- operations:
- destroy:
- confirm: Are you sure you want to destroy this product?
plans:
title: Plans
new: New Plan
diff --git a/config/routes.rb b/config/routes.rb
index 29407a6..1cee7bc 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -9,7 +9,7 @@ DiscoursePatrons::Engine.routes.draw do
namespace :admin do
resources :plans
resources :subscriptions, only: [:index]
- resources :products, only: [:index, :create, :destroy]
+ resources :products
end
resources :customers, only: [:create]
diff --git a/plugin.rb b/plugin.rb
index 97731f7..14b1ac0 100644
--- a/plugin.rb
+++ b/plugin.rb
@@ -8,7 +8,7 @@
enabled_site_setting :discourse_patrons_enabled
-gem 'stripe', '5.7.0'
+gem 'stripe', '5.7.1'
register_asset "stylesheets/common/discourse-patrons.scss"
register_asset "stylesheets/mobile/discourse-patrons.scss"
diff --git a/spec/requests/admin/products_controller_spec.rb b/spec/requests/admin/products_controller_spec.rb
index 00a4d03..cf18933 100644
--- a/spec/requests/admin/products_controller_spec.rb
+++ b/spec/requests/admin/products_controller_spec.rb
@@ -16,13 +16,25 @@ module DiscoursePatrons
expect(response.status).to eq(403)
end
- it "does not create the products" do
+ it "does not create the product" do
::Stripe::Product.expects(:create).never
post "/patrons/admin/products.json"
expect(response.status).to eq(403)
end
- it "does not delete the products" do
+ it "does not show the product" do
+ ::Stripe::Product.expects(:retrieve).never
+ get "/patrons/admin/products/prod_qwerty123.json"
+ expect(response.status).to eq(403)
+ end
+
+ it "does not update the product" do
+ ::Stripe::Product.expects(:update).never
+ put "/patrons/admin/products/prod_qwerty123.json"
+ expect(response.status).to eq(403)
+ end
+
+ it "does not delete the product" do
::Stripe::Product.expects(:delete).never
delete "/patrons/admin/products/u2.json"
expect(response.status).to eq(403)
@@ -63,6 +75,20 @@ module DiscoursePatrons
end
end
+ describe 'show' do
+ it 'retrieves the product' do
+ ::Stripe::Product.expects(:retrieve).with('prod_walterwhite')
+ get "/patrons/admin/products/prod_walterwhite.json"
+ end
+ end
+
+ describe 'update' do
+ it 'updates the product' do
+ ::Stripe::Product.expects(:update)
+ patch "/patrons/admin/products/prod_walterwhite.json", params: {}
+ end
+ end
+
describe 'delete' do
it 'deletes the product' do
::Stripe::Product.expects(:delete).with('prod_walterwhite')