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'}}

-
+

- {{input type="text" name="name" value=model.name}} -

-
+ {{input type="text" name="name" value=model.plan.name}} +

+

- {{input type="text" name="name" value=model.amount}} -

-
+ {{input type="text" name="name" value=model.plan.amount}} +

+

+ + {{combo-box valueAttribute="value" content=model.products value=defaultProduct}} +

+

- {{combo-box valueAttribute="value" content=model.intervals value=model.interval}} -

+ {{combo-box valueAttribute="value" content=model.plan.intervals value=model.plan.interval}} +

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'}}

-
- +

+ {{input type="text" name="name" value=model.product.name}} -

-
- +

+

+ {{combo-box valueAttribute="value" content=model.groups value=model.product.groupName}} -

-
- +

+

+ {{input type="checkbox" checked=model.product.active}} -

+

- {{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')