docbrown/app/controllers/partnerships_controller.rb
rhymes e9e4059ad3
Add Slack messengers: part 1 (#6748)
* Add Slack::Announcer and SlackClient

* Add Slack::Messengers::Feedback class

* Use Slack::Messengers::Feedback and refactor test

* Should not raise an error if params are nil, let the job fail

* Add Slack::Messengers::Sponsorship

* Rename spec

* Use Slack::Messengers::Sponsorship

* Add Slack::Messengers::PotentialSpammer

* Use Slack::Messengers::PotentialSpammer

* Add Slack::Messengers::RateLimit and use it

* Refactor a bit and improve tests

* Add Slack::Messengers::Note and use it

* Use Slack::Announcer and fix spec

* Fix specs

* Update app/services/slack/announcer.rb

Co-Authored-By: Vaidehi Joshi <vaidehi.sj@gmail.com>

* Implement review suggestions

* Empty commit to trigger Travis

Co-authored-by: Vaidehi Joshi <vaidehi.sj@gmail.com>
2020-03-24 18:45:40 +01:00

89 lines
2.6 KiB
Ruby

class PartnershipsController < ApplicationController
before_action :set_cache_control_headers, only: %i[index]
before_action :authenticate_user!, only: %i[create]
after_action :verify_authorized
def index
skip_authorization
set_surrogate_key_header "partnership-index"
end
def show
skip_authorization
@organizations = current_user&.admin_organizations
end
def create
@organization = Organization.find(sponsorship_params[:organization_id])
authorize @organization, :admin_of_org?
@level = sponsorship_params[:level]
@number_of_credits_needed = Sponsorship::CREDITS[@level]
if @level == "media" && @number_of_credits_needed.nil?
@number_of_credits_needed = sponsorship_params[:amount].to_i
end
@available_org_credits = @organization.credits.unspent
# NOTE: this should probably be a redirect with a notice
raise "Not enough credits" unless @available_org_credits.size >= @number_of_credits_needed
tag_sponsorship = @level == "tag"
@tag = Tag.find_by!(name: sponsorship_params[:tag_name]) if tag_sponsorship
sponsorable = tag_sponsorship ? @tag : nil
purchase_sponsorship(
organization: @organization,
level: @level,
cost: @number_of_credits_needed,
sponsorable: sponsorable,
)
Slack::Messengers::Sponsorship.call(
user: current_user,
organization: @organization,
level: @level,
tag: @tag,
)
redirect_back(fallback_location: partnerships_path)
end
private
def sponsorship_params
allowed_params = %i[organization_id level amount tag_name instructions]
params.permit(allowed_params)
end
# NOTE: this should probably end up in a service object at some point
def purchase_sponsorship(organization:, level:, cost:, sponsorable: nil)
expires_at = Sponsorship::LEVELS_WITH_EXPIRATION.include?(level) ? 1.month.from_now : nil
create_params = {
user: current_user,
level: level,
status: :pending,
expires_at: expires_at
}
if sponsorable
create_params[:sponsorable] = sponsorable
create_params[:expires_at] = 1.month.from_now
end
if sponsorship_params[:instructions]
create_params[:instructions] = sponsorship_params[:instructions]
# NOTE: why are we storing the updated_at of the instructions?
create_params[:instructions_updated_at] = Time.current
end
ActiveRecord::Base.transaction do
sponsorship = organization.sponsorships.create!(create_params)
Credits::Buyer.call(
purchaser: organization,
purchase: sponsorship,
cost: cost,
)
end
end
end