From 23cb6ef93e73e3a9c5173ec50c01bc9235970415 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Tue, 15 Oct 2019 21:50:30 +1100 Subject: [PATCH] create the products --- app/controllers/admin/products_controller.rb | 18 ++++++++ ...ins-discourse-patrons-products-show.js.es6 | 9 +++- .../controllers/patrons-subscribe.js.es6 | 42 +++++++++++-------- .../discourse/models/admin-product.js.es6 | 8 +++- .../models/admin-subscription.js.es6 | 5 ++- ...ins-discourse-patrons-products-show.js.es6 | 10 +++-- ...ugins-discourse-patrons-products-index.hbs | 4 ++ ...lugins-discourse-patrons-products-show.hbs | 10 +++-- config/locales/client.en.yml | 11 +++++ config/routes.rb | 2 +- .../admin/products_controller_spec.rb | 36 ++++++++++++++-- 11 files changed, 123 insertions(+), 32 deletions(-) diff --git a/app/controllers/admin/products_controller.rb b/app/controllers/admin/products_controller.rb index 3c46e7b..0cdde2f 100644 --- a/app/controllers/admin/products_controller.rb +++ b/app/controllers/admin/products_controller.rb @@ -11,6 +11,24 @@ module DiscoursePatrons products = ::Stripe::Product.list render_json_dump products.data end + + def create + begin + product = ::Stripe::Product.create( + type: 'service', + name: params[:name], + active: params[:active], + metadata: { + group_name: params[:groupName] + } + ) + + render_json_dump product + + rescue ::Stripe::InvalidRequestError => e + return render_json_error e.message + end + end end end end 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 d6a5293..165c325 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 @@ -2,8 +2,13 @@ import { popupAjaxError } from "discourse/lib/ajax-error"; export default Ember.Controller.extend({ actions: { - createPlan() { - this.get("model") + createProduct() { + // TODO: set default group name beforehand + if(this.get("model.product.groupName") === undefined) { + this.set("model.product.groupName", this.get("model.group.firstObject")); + } + + this.get("model.product") .save() .then(() => { this.transitionToRoute("adminPlugins.discourse-patrons.products"); diff --git a/assets/javascripts/discourse/controllers/patrons-subscribe.js.es6 b/assets/javascripts/discourse/controllers/patrons-subscribe.js.es6 index f648b82..bd22b73 100644 --- a/assets/javascripts/discourse/controllers/patrons-subscribe.js.es6 +++ b/assets/javascripts/discourse/controllers/patrons-subscribe.js.es6 @@ -26,25 +26,33 @@ export default Ember.Controller.extend({ source: result.token.id }; - return ajax("/patrons/customers", { method: "post", data: customerData }).then( - customer => { - // TODO move default plan into settings - if(this.get('model.selectedPlan') === undefined) { - this.set('model.selectedPlan', this.get('model.plans.firstObject')); - } - - const subscriptionData = { - customer: customer.id, - plan: this.get('model.selectedPlan') - }; - - return ajax("/patrons/subscriptions", { method: "post", data: subscriptionData }).then( - () => { - return DiscourseURL.redirectTo(Discourse.SiteSettings.discourse_patrons_subscription_group_landing_page); - } + return ajax("/patrons/customers", { + method: "post", + data: customerData + }).then(customer => { + // TODO move default plan into settings + if (this.get("model.selectedPlan") === undefined) { + this.set( + "model.selectedPlan", + this.get("model.plans.firstObject") ); } - ); + + const subscriptionData = { + customer: customer.id, + plan: this.get("model.selectedPlan") + }; + + return ajax("/patrons/subscriptions", { + method: "post", + data: subscriptionData + }).then(() => { + return DiscourseURL.redirectTo( + Discourse.SiteSettings + .discourse_patrons_subscription_group_landing_page + ); + }); + }); } }); } diff --git a/assets/javascripts/discourse/models/admin-product.js.es6 b/assets/javascripts/discourse/models/admin-product.js.es6 index 5861ef5..82a904b 100644 --- a/assets/javascripts/discourse/models/admin-product.js.es6 +++ b/assets/javascripts/discourse/models/admin-product.js.es6 @@ -1,10 +1,16 @@ import { ajax } from "discourse/lib/ajax"; const AdminProduct = Discourse.Model.extend({ + active: true, + destroy() {}, save() { - const data = {}; + const data = { + name: this.name, + groupName: this.groupName, + active: this.active + }; return ajax("/patrons/admin/products", { method: "post", data }); } diff --git a/assets/javascripts/discourse/models/admin-subscription.js.es6 b/assets/javascripts/discourse/models/admin-subscription.js.es6 index bef063e..9ef13f7 100644 --- a/assets/javascripts/discourse/models/admin-subscription.js.es6 +++ b/assets/javascripts/discourse/models/admin-subscription.js.es6 @@ -4,8 +4,9 @@ const AdminSubscription = Discourse.Model.extend({}); AdminSubscription.reopenClass({ find() { - return ajax("/patrons/admin/subscriptions", { method: "get" }).then(result => - result.data.map(subscription => AdminSubscription.create(subscription)) + return ajax("/patrons/admin/subscriptions", { method: "get" }).then( + result => + result.data.map(subscription => AdminSubscription.create(subscription)) ); } }); 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 5e61d7b..4771d63 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 @@ -1,7 +1,11 @@ -import AdminProduct from "discourse/plugins/discourse-patrons/discourse/models/admin-plan"; +import AdminProduct from "discourse/plugins/discourse-patrons/discourse/models/admin-product"; +import Group from "discourse/models/group"; export default Discourse.Route.extend({ - model() { - return AdminProduct.create(); + model(param) { + const product = AdminProduct.create(); + const groups = Group.findAll({ ignore_automatic: true }); + + return Ember.RSVP.hash({ product, groups }); } }); diff --git a/assets/javascripts/discourse/templates/admin/plugins-discourse-patrons-products-index.hbs b/assets/javascripts/discourse/templates/admin/plugins-discourse-patrons-products-index.hbs index b08d335..9279e76 100644 --- a/assets/javascripts/discourse/templates/admin/plugins-discourse-patrons-products-index.hbs +++ b/assets/javascripts/discourse/templates/admin/plugins-discourse-patrons-products-index.hbs @@ -2,11 +2,15 @@ + + {{#each model as |product|}} + +
{{i18n 'discourse_patrons.admin.products.product.product_id'}}{{i18n 'discourse_patrons.admin.products.product.group'}}{{i18n 'discourse_patrons.admin.products.product.active'}}
{{product.id}}{{product.group}}{{product.active}} {{d-button action=(action "editProduct" product.id) 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 c658fc4..3e47074 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 @@ -4,11 +4,15 @@
- {{input type="text" name="name" value=model.name}} + {{input type="text" name="name" value=model.product.name}}
- - {{combo-box valueAttribute="value" content=model.intervals value=model.interval}} + + {{combo-box valueAttribute="value" content=model.groups value=model.product.groupName}} +
+
+ + {{input type="checkbox" checked=model.product.active}}
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 6abec00..640dd1b 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -62,6 +62,17 @@ en: products: title: Products new: New Product + show: + group: User Group + create: Create Product + active: Active + product: + product_id: Product ID + group: 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 d30599a..9485ccc 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] + resources :products, only: [:index, :create] end resources :customers, only: [:create] diff --git a/spec/requests/admin/products_controller_spec.rb b/spec/requests/admin/products_controller_spec.rb index 8c426a0..cebf5d0 100644 --- a/spec/requests/admin/products_controller_spec.rb +++ b/spec/requests/admin/products_controller_spec.rb @@ -15,6 +15,12 @@ module DiscoursePatrons get "/patrons/admin/products.json" expect(response.status).to eq(403) end + + it "does nothing" do + ::Stripe::Product.expects(:create).never + post "/patrons/admin/products.json" + expect(response.status).to eq(403) + end end context 'authenticated' do @@ -22,9 +28,33 @@ module DiscoursePatrons before { sign_in(admin) } - it "gets the empty products" do - ::Stripe::Product.expects(:list) - get "/patrons/admin/products.json" + describe 'index' do + it "gets the empty products" do + ::Stripe::Product.expects(:list) + get "/patrons/admin/products.json" + end + end + + describe 'create' do + it 'is of product type service' do + ::Stripe::Product.expects(:create).with(has_entry(:type, 'service')) + post "/patrons/admin/products.json", params: {} + end + + it 'has a name' do + ::Stripe::Product.expects(:create).with(has_entry(:name, 'Jesse Pinkman')) + post "/patrons/admin/products.json", params: { name: 'Jesse Pinkman' } + end + + it 'has an active attribute' do + ::Stripe::Product.expects(:create).with(has_entry(active: false)) + post "/patrons/admin/products.json", params: { active: false } + end + + it 'has a metadata' do + ::Stripe::Product.expects(:create).with(has_entry(:metadata, { group_name: 'discourse-user-group-name' })) + post "/patrons/admin/products.json", params: { group_name: 'discourse-user-group-name' } + end end end end