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:
parent
cd22f395d3
commit
96b0d7fa09
5 changed files with 83 additions and 7 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue