From 6fbcea2cf3edca8cab650fd080c95e67866d7feb Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Fri, 25 Oct 2019 08:18:16 +1100 Subject: [PATCH] product controller --- app/controllers/plans_controller.rb | 1 + app/controllers/products_controller.rb | 21 +++++++++++++++++++ .../discourse/models/product.js.es6 | 13 ++++++++++++ .../discourse/patrons-route-map.js.es6 | 4 +++- .../discourse/routes/patrons-subscribe.js.es6 | 3 +-- config/routes.rb | 1 + plugin.rb | 1 + spec/requests/products_controller_spec.rb | 14 +++++++++++++ 8 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 app/controllers/products_controller.rb create mode 100644 assets/javascripts/discourse/models/product.js.es6 create mode 100644 spec/requests/products_controller_spec.rb diff --git a/app/controllers/plans_controller.rb b/app/controllers/plans_controller.rb index 03dbe1e..8a72737 100644 --- a/app/controllers/plans_controller.rb +++ b/app/controllers/plans_controller.rb @@ -10,6 +10,7 @@ module DiscoursePatrons begin plans = ::Stripe::Plan.list(active: true) + # TODO: Serialize. Remove some attributes like meta.group_name render_json_dump plans.data rescue ::Stripe::InvalidRequestError => e diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb new file mode 100644 index 0000000..74ca99d --- /dev/null +++ b/app/controllers/products_controller.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module DiscoursePatrons + class ProductsController < ::ApplicationController + include DiscoursePatrons::Stripe + + before_action :set_api_key + + def index + begin + products = ::Stripe::Product.list(active: true) + + # TODO: Serialize. Remove some attributes like metadata + render_json_dump products.data + + rescue ::Stripe::InvalidRequestError => e + return render_json_error e.message + end + end + end +end diff --git a/assets/javascripts/discourse/models/product.js.es6 b/assets/javascripts/discourse/models/product.js.es6 new file mode 100644 index 0000000..71dd5a2 --- /dev/null +++ b/assets/javascripts/discourse/models/product.js.es6 @@ -0,0 +1,13 @@ +import { ajax } from "discourse/lib/ajax"; + +const Product = Discourse.Model.extend({}); + +Product.reopenClass({ + findAll() { + return ajax("/patrons/products", { method: "get" }).then(result => + result.map(product => Product.create(product)) + ); + } +}); + +export default Product; diff --git a/assets/javascripts/discourse/patrons-route-map.js.es6 b/assets/javascripts/discourse/patrons-route-map.js.es6 index c8fa513..160d1b8 100644 --- a/assets/javascripts/discourse/patrons-route-map.js.es6 +++ b/assets/javascripts/discourse/patrons-route-map.js.es6 @@ -1,6 +1,8 @@ export default function() { this.route("patrons", function() { - this.route("subscribe"); + this.route("subscribe", function() { + this.route("product", { path: ":product_id" }) + }); this.route("show", { path: ":pid" }); }); } diff --git a/assets/javascripts/discourse/routes/patrons-subscribe.js.es6 b/assets/javascripts/discourse/routes/patrons-subscribe.js.es6 index c1a6fb5..e304a2b 100644 --- a/assets/javascripts/discourse/routes/patrons-subscribe.js.es6 +++ b/assets/javascripts/discourse/routes/patrons-subscribe.js.es6 @@ -10,10 +10,9 @@ export default Discourse.Route.extend({ return `$${toCurrency(plan.amount)} ${plan.currency.toUpperCase()} / ${plan.interval}`; }; - const group = Group.find(); const plans = Plan.findAll().then(results => results.map(p => planSelectText(p))); const subscription = Subscription.create(); - return Ember.RSVP.hash({ group, plans, subscription }); + return Ember.RSVP.hash({ plans, subscription }); } }); diff --git a/config/routes.rb b/config/routes.rb index 1cee7bc..2b543d5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -15,6 +15,7 @@ DiscoursePatrons::Engine.routes.draw do resources :customers, only: [:create] resources :subscriptions, only: [:create] resources :plans, only: [:index] + resources :products, only: [:index] resources :patrons, only: [:index, :create] get '/' => 'patrons#index' diff --git a/plugin.rb b/plugin.rb index 3bcba5a..4b34b96 100644 --- a/plugin.rb +++ b/plugin.rb @@ -50,6 +50,7 @@ after_initialize do "../app/controllers/customers_controller", "../app/controllers/patrons_controller", "../app/controllers/plans_controller", + "../app/controllers/products_controller", "../app/controllers/subscriptions_controller", "../app/models/payment", "../app/serializers/payment_serializer", diff --git a/spec/requests/products_controller_spec.rb b/spec/requests/products_controller_spec.rb new file mode 100644 index 0000000..b9fc776 --- /dev/null +++ b/spec/requests/products_controller_spec.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require 'rails_helper' + +module DiscoursePatrons + RSpec.describe ProductsController do + describe "index" do + it "lists the active products" do + ::Stripe::Product.expects(:list).with(active: true) + get "/patrons/products.json" + end + end + end +end