* show blurb for tag sponsors * check that sponsorhip is live and account for expiration time * automatically add expiration date to tags * update tag offering * rewrite tag auto expiration * night mode compatibility for sponsor logos * fix spec * update specs * Small css adjustment
99 lines
2.9 KiB
Ruby
99 lines
2.9 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,
|
|
)
|
|
|
|
slackbot_ping(tag_sponsorship)
|
|
|
|
redirect_back(fallback_location: "/partnerships")
|
|
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
|
|
|
|
def slackbot_ping(tag_sponsorship)
|
|
text = if tag_sponsorship
|
|
"@#{current_user.username} bought a ##{@tag.name} sponsorship for @#{@organization.username}"
|
|
else
|
|
"@#{current_user.username} bought a #{@level} sponsorship for @#{@organization.username}"
|
|
end
|
|
|
|
SlackBot.ping(
|
|
text,
|
|
channel: "incoming-partners",
|
|
username: "media_sponsor",
|
|
icon_emoji: ":partyparrot:",
|
|
)
|
|
end
|
|
end
|