Skip to content

Commit

Permalink
Merge pull request #2 from paviliondev/send_products_on_server
Browse files Browse the repository at this point in the history
Send a list of available products when server details are requested
  • Loading branch information
merefield authored May 10, 2023
2 parents 3b82798 + b39763f commit d9a0fe7
Show file tree
Hide file tree
Showing 8 changed files with 65 additions and 37 deletions.
5 changes: 4 additions & 1 deletion app/controllers/subscription_server/server_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ class SubscriptionServer::ServerController < ApplicationController

def index
if SiteSetting.subscription_server_supplier_name.present?
render json: success_json.merge(supplier: SiteSetting.subscription_server_supplier_name)
render json: success_json.merge(
supplier: SiteSetting.subscription_server_supplier_name,
products: SubscriptionServer::Subscription.product_map
)
else
render json: failed_json, status: 404
end
Expand Down
2 changes: 1 addition & 1 deletion config/locales/server.en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ en:
site_settings:
subscription_server_enabled: Enable subscription server
subscription_server_supplier_name: Supplier name, e.g. "Pavilion"
subscription_server_subscriptions: "List of supported subscriptions. resource_name:provider_name:product_id:domain_limit e.g. custom-wizard:stripe:prod_Jyy6B9gyTJUURi:1"
subscription_server_subscriptions: "List of supported subscriptions. resource:product_slug:provider:product_id:domain_limit e.g. discourse-custom-wizard:business:stripe:prod_Jyy6B9gyTJUURi:1"

user_api_key:
scopes:
Expand Down
36 changes: 36 additions & 0 deletions lib/subscription_server/subscription.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,40 @@ def initialize(resource: nil, product_id: nil, product_name: nil, price_id: nil,
@price_id = price_id
@price_name = price_name
end

def self.subscription_map
SiteSetting.subscription_server_subscriptions.split('|')
.reduce({}) do |result, str|
parts = str.split(':')

if parts.size >= 3
resource = parts[0]
product_slug = parts[1]
provider = parts[2]
product_id = parts[3]
domain_limit = parts[4]

result[resource] ||= { provider: provider, products: [] }
result[resource][:products] << {
product_slug: product_slug,
product_id: product_id
}

if domain_limit
result[resource][:domain_limits] ||= []
result[resource][:domain_limits] << { product_id: product_id, domain_limit: domain_limit.to_i }
end
end

result
end
end

def self.product_map
result = {}
subscription_map.each do |resource, attrs|
result[resource] = attrs[:products]
end
result
end
end
35 changes: 3 additions & 32 deletions lib/subscription_server/user_subscriptions.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ def load(resources = nil)
return unless resources.present? && @user.present? && @domain.present?

resources.each do |resource|
sub_atts = subscriptions_map[resource]
sub_atts = SubscriptionServer::Subscription.subscription_map[resource]
next handle_failure(resource, "no subscription found for #{resource}") unless sub_atts.present?

klass = providers[sub_atts[:provider].to_sym]
Expand All @@ -45,7 +45,8 @@ def load(resources = nil)
next handle_failure(resource, "#{provider.name} is not installed") unless provider.installed?
next handle_failure(resource, "failed to setup #{provider.name}") unless provider.setup

resource_subscriptions = provider.subscriptions(sub_atts[:product_ids], resource)
product_ids = sub_atts[:products].map { |p| p[:product_id] }
resource_subscriptions = provider.subscriptions(product_ids, resource)
next handle_failure(resource, "no subscriptions found for #{resource}") if resource_subscriptions.none?

product_ids = resource_subscriptions.map(&:product_id)
Expand All @@ -64,36 +65,6 @@ def load(resources = nil)
@subscriptions = subscriptions
end

def subscriptions_map
@subscriptions_map ||= begin
SiteSetting.subscription_server_subscriptions.split('|')
.reduce({}) do |result, str|
parts = str.split(':')

if parts.size >= 3
resource = parts[0]
provider = parts[1]
product_id = parts[2]
domain_limit = parts[3]

result[resource] ||= { provider: provider, product_ids: [] }
result[resource][:product_ids] << product_id

if domain_limit
result[resource][:domain_limits] ||= []
result[resource][:domain_limits] << { product_id: product_id, domain_limit: domain_limit.to_i }
end
end

result
end
end
end

def self.subscriptions_map
new.subscriptions_map
end

protected

def handle_failure(resource, message)
Expand Down
2 changes: 1 addition & 1 deletion plugin.rb
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
end

add_to_class(:user, :subscription_domains) do
subscriptions_map = SubscriptionServer::UserSubscriptions.subscriptions_map
subscriptions_map = SubscriptionServer::Subscription.subscription_map
subscription_domains = {}

custom_fields
Expand Down
3 changes: 2 additions & 1 deletion spec/components/subscription_server/user_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@
fab!(:user) { Fabricate(:user) }
let(:provider) { "stripe" }
let(:product_id) { "prod_CBTNpi3fqWWkq0" }
let(:product_slug) { "business" }
let(:resource) { "custom_wizard" }
let(:domain) { "demo.pavilion.tech" }
let(:another_domain) { "another.pavilion.tech" }
let(:domain_limit) { 1 }
let(:subscriptions) { "#{resource}:#{provider}:#{product_id}:#{domain_limit.to_s}" }
let(:subscriptions) { "#{resource}:#{product_slug}:#{provider}:#{product_id}:#{domain_limit.to_s}" }

before do
SiteSetting.subscription_server_subscriptions = subscriptions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
let(:provider) { "stripe" }
let(:invalid_provider) { "braintree" }
let(:product_id) { "prod_CBTNpi3fqWWkq0" }
let(:product_slug) { "business" }
let(:resource) { "custom_wizard" }
let(:subscriptions) { "#{resource}:#{provider}:#{product_id}" }
let(:subscriptions) { "#{resource}:#{product_slug}:#{provider}:#{product_id}" }
let(:resources) { [resource] }
let(:domain) { "demo.pavilion.tech" }

Expand Down
16 changes: 16 additions & 0 deletions spec/requests/subscription_server/server_controller_spec.rb
Original file line number Diff line number Diff line change
@@ -1,15 +1,31 @@
# frozen_string_literal: true

describe SubscriptionServer::ServerController do
let(:provider) { "stripe" }
let(:product_id) { "prod_CBTNpi3fqWWkq0" }
let(:product_slug) { "business" }
let(:resource) { "custom_wizard" }

it "returns a 404 if the server details are not set" do
get "/subscription-server"
expect(response.status).to eq(404)
end

it "returns server details" do
SiteSetting.subscription_server_supplier_name = "Pavilion"
SiteSetting.subscription_server_subscriptions = "#{resource}:#{product_slug}:#{provider}:#{product_id}"
get "/subscription-server"
expect(response.status).to eq(200)
expect(response.parsed_body["supplier"]).to eq("Pavilion")
expect(response.parsed_body["products"]).to eq(
{
"#{resource}": [
{
product_slug: product_slug,
product_id: product_id
}
]
}.as_json
)
end
end

0 comments on commit d9a0fe7

Please sign in to comment.