Make credit pricing configurable (#9326)

* Add credit prices to SiteConfig

* Add credit prices to /internal/config

* Fix spec and transform values on update
This commit is contained in:
Michael Kohl 2020-07-24 23:03:13 +07:00 committed by GitHub
parent cd22f395d3
commit 96b0d7fa09
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 83 additions and 7 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -248,6 +248,49 @@
</div>
</div>
<div class="card mt-3">
<%= render partial: "card_header",
locals: {
header: "Credits",
state: "collapse",
target: "creditsBodyContainer",
expanded: "false"
} %>
<div id="creditsBodyContainer" class="card-body collapse hide" aria-labelledby="creditsBodyContainer">
<%= f.fields_for :credit_prices_in_cents do |price_field| %>
<div class="form-group">
<%= price_field.label "Credit price in cents (S)" %>
<%= price_field.number_field :small,
class: "form-control",
value: SiteConfig.credit_prices_in_cents[:small] %>
<div class="alert alert-info">Price for small credit purchase (< 10 credits).</div>
</div>
<div class="form-group">
<%= price_field.label "Credit price in cents (M)" %>
<%= price_field.number_field :medium,
class: "form-control",
value: SiteConfig.credit_prices_in_cents[:medium] %>
<div class="alert alert-info">Price for medium credit purchase (10 - 99 credits).</div>
</div>
<div class="form-group">
<%= price_field.label "Credit price in cents (L)" %>
<%= price_field.number_field :large,
class: "form-control",
value: SiteConfig.credit_prices_in_cents[:large] %>
<div class="alert alert-info">Price for large credit purchase (100 - 999 credits).</div>
</div>
<div class="form-group">
<%= price_field.label "Credit price in cents (XL)" %>
<%= price_field.number_field :xlarge,
class: "form-control",
value: SiteConfig.credit_prices_in_cents[:xlarge] %>
<div class="alert alert-info">Price for extra large credit purchase (1000 credits or more).</div>
</div>
<% end %>
</div>
</div>
<div class="card mt-3">
<%= render partial: "card_header",
locals: {

View file

@ -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