From 96b0d7fa091f2dff5e4ce4c388c2faea9d3b0a88 Mon Sep 17 00:00:00 2001 From: Michael Kohl Date: Fri, 24 Jul 2020 23:03:13 +0700 Subject: [PATCH] Make credit pricing configurable (#9326) * Add credit prices to SiteConfig * Add credit prices to /internal/config * Fix spec and transform values on update --- app/controllers/credits_controller.rb | 17 +++++--- .../internal/configs_controller.rb | 2 + app/models/site_config.rb | 8 ++++ app/views/internal/configs/show.html.erb | 43 +++++++++++++++++++ spec/requests/internal/configs_spec.rb | 20 +++++++++ 5 files changed, 83 insertions(+), 7 deletions(-) diff --git a/app/controllers/credits_controller.rb b/app/controllers/credits_controller.rb index 70997f59d..9dbcc4d4a 100644 --- a/app/controllers/credits_controller.rb +++ b/app/controllers/credits_controller.rb @@ -99,14 +99,17 @@ class CreditsController < ApplicationController end def cost_per_credit - if @number_to_purchase < 10 - 500 - elsif @number_to_purchase < 100 - 400 - elsif @number_to_purchase < 1000 - 300 + prices = SiteConfig.credit_prices_in_cents + + case @number_to_purchase + when ..9 + prices[:small] + when 10..99 + prices[:medium] + when 100..999 + prices[:large] else - 250 + prices[:xlarge] end end end diff --git a/app/controllers/internal/configs_controller.rb b/app/controllers/internal/configs_controller.rb index a68ce94ef..5fd3579c7 100644 --- a/app/controllers/internal/configs_controller.rb +++ b/app/controllers/internal/configs_controller.rb @@ -56,6 +56,7 @@ module Internal social_media_handles: SiteConfig.social_media_handles.keys, email_addresses: SiteConfig.email_addresses.keys, meta_keywords: SiteConfig.meta_keywords.keys, + credit_prices_in_cents: SiteConfig.credit_prices_in_cents.keys, ) end @@ -70,6 +71,7 @@ module Internal %i[sidebar_tags suggested_tags suggested_users].each do |param| config[param] = config[param].downcase.delete(" ") if config[param] end + config[:credit_prices_in_cents]&.transform_values!(&:to_i) end def bust_relevant_caches diff --git a/app/models/site_config.rb b/app/models/site_config.rb index 56f4c786b..6a7e22a68 100644 --- a/app/models/site_config.rb +++ b/app/models/site_config.rb @@ -138,4 +138,12 @@ class SiteConfig < RailsSettings::Base # Broadcast field :welcome_notifications_live_at, type: :date + + # Credits + field :credit_prices_in_cents, type: :hash, default: { + small: 500, + medium: 400, + large: 300, + xlarge: 250 + } end diff --git a/app/views/internal/configs/show.html.erb b/app/views/internal/configs/show.html.erb index 7ef057ab0..37b900ea9 100644 --- a/app/views/internal/configs/show.html.erb +++ b/app/views/internal/configs/show.html.erb @@ -248,6 +248,49 @@ +
+ <%= render partial: "card_header", + locals: { + header: "Credits", + state: "collapse", + target: "creditsBodyContainer", + expanded: "false" + } %> + +
+ <%= f.fields_for :credit_prices_in_cents do |price_field| %> +
+ <%= price_field.label "Credit price in cents (S)" %> + <%= price_field.number_field :small, + class: "form-control", + value: SiteConfig.credit_prices_in_cents[:small] %> +
Price for small credit purchase (< 10 credits).
+
+
+ <%= price_field.label "Credit price in cents (M)" %> + <%= price_field.number_field :medium, + class: "form-control", + value: SiteConfig.credit_prices_in_cents[:medium] %> +
Price for medium credit purchase (10 - 99 credits).
+
+
+ <%= price_field.label "Credit price in cents (L)" %> + <%= price_field.number_field :large, + class: "form-control", + value: SiteConfig.credit_prices_in_cents[:large] %> +
Price for large credit purchase (100 - 999 credits).
+
+
+ <%= price_field.label "Credit price in cents (XL)" %> + <%= price_field.number_field :xlarge, + class: "form-control", + value: SiteConfig.credit_prices_in_cents[:xlarge] %> +
Price for extra large credit purchase (1000 credits or more).
+
+ <% end %> +
+
+
<%= render partial: "card_header", locals: { diff --git a/spec/requests/internal/configs_spec.rb b/spec/requests/internal/configs_spec.rb index f0dceb74d..09d8e675e 100644 --- a/spec/requests/internal/configs_spec.rb +++ b/spec/requests/internal/configs_spec.rb @@ -513,6 +513,26 @@ RSpec.describe "/internal/config", type: :request do expect(SiteConfig.public).to eq(is_public) end end + + describe "Credits" do + it "updates the credit prices", :aggregate_failures do + original_prices = { + small: 500, + medium: 400, + large: 300, + xlarge: 250 + } + SiteConfig.credit_prices_in_cents = original_prices + + SiteConfig.credit_prices_in_cents.each_key do |size| + new_prices = original_prices.merge(size => 123) + expect do + post "/internal/config", params: { site_config: { credit_prices_in_cents: new_prices }, + confirmation: confirmation_message } + end.to change { SiteConfig.credit_prices_in_cents[size] }.from(original_prices[size.to_sym]).to(123) + end + end + end end end # rubocop:enable RSpec/NestedGroups