Skip to content

Instantly share code, notes, and snippets.

@ckk-scratch
Created December 5, 2016 19:42
Show Gist options
  • Save ckk-scratch/229ce9c2f61feb0d210257273da77574 to your computer and use it in GitHub Desktop.
Save ckk-scratch/229ce9c2f61feb0d210257273da77574 to your computer and use it in GitHub Desktop.
class CampaignsController < ApplicationController
authorize_resource except: [:public, :confirm_event, :cancel_talent]
load_resource except: [:public, :index]
before_filter :prepare_events, only: [:show, :show_events]
before_filter :check_campaign_open, only: [:confirm_event, :cancel_talent, :add_talent, :remove_talent, :add_events, :remove_events]
def index
@campaigns = Campaign.order(created_at: :desc)
end
def show
end
def update
if @campaign.update_attributes(campaign_params)
flash[:notice] = "This has been successfully updated!"
if campaign_params[:message].nil?
redirect_to edit_mail_message_campaign_path(@campaign)
else
redirect_to slug_campaign_path(slug: @campaign.slug)
end
else
flash[:notice] = "This could not be updated!"
end
end
def public
@campaign = Campaign.find_by_slug!(params[:slug])
@events = Event.none
if @campaign.open?
@campaigns_user = @campaign.campaigns_users.find_by_access_hash(params[:invitation])
if @campaigns_user
@events = @campaigns_user.eligible_events.order("start ASC")
@eligible = (@campaigns_user.event_id.nil? and @campaigns_user.cancelled? == false)
@campaigns_user.update_attribute(:last_viewed_at, Time.now) unless user_signed_in?
if flash[:success].blank?
if @campaigns_user.event
flash.now[:success] = "You are all set to perform at #{@campaigns_user.event.name} on #{@campaigns_user.event.start.strftime("%a. %-m/%-d")}. Please contact #{@campaign.manager_email} if you have any questions."
elsif @campaigns_user.cancelled?
flash.now[:warning] = "Your invitation has been cancelled. Please contact #{@campaign.manager_email} if you have any questions."
end
end
elsif user_signed_in? and current_user.admin_or_manager?
@can_edit = true
@events = @campaign.events.includes(:campaigns_user).where( :campaigns_users => {:event_id => nil} ).order("start ASC")
@eligible = true
end
end
flash.now[:disable_alert_timeout] = true
end
def show_events
respond_to do |format|
format.js
format.html {render 'show'}
end
end
def show_talent
respond_to do |format|
format.js
format.html {render 'show'}
end
end
def show_regions
respond_to do |format|
format.js
format.html {render 'show'}
end
end
def edit_mail_message
render 'show'
end
def confirm_event
campaigns_user = @campaign.campaigns_users.find_by_access_hash(params[:access_hash])
if campaigns_user
if campaigns_user.event_id.nil?
event = @campaign.events.find(params[:event_id])
if event.campaigns_user
flash[:error] = "Sorry that event is no longer available. Please choose another event from the list below."
else
campaigns_user.confirm!(event)
flash[:success] = "Congratulations! You are all set to perform at #{event.name} on #{event.start.strftime("%a. %-m/%-d")}. Your event has been removed from this list. You will receive a confirmation email shortly."
end
else
flash[:warning] = "Warning! You are already confirmed to at #{campaigns_user.event.name} on #{campaigns_user.event.start.strftime("%a. %-m/%-d")}. Please contact #{@campaign.manager.email} if you have any questions."
end
else
flash[:error] = "You are not authorized to access this feature."
end
redirect_to slug_campaign_path(slug: @campaign.slug, invitation: params[:access_hash])
end
def cancel_talent
campaigns_user = @campaign.campaigns_users.find_by_access_hash(params[:access_hash])
if campaigns_user
campaigns_user.cancel!
flash[:success] = "Thank you for your feedback! You have been removed from the invitation list."
else
flash[:error] = "Failed to cancel talent, Something went wrong."
end
redirect_to slug_campaign_path(slug: @campaign.slug, invitation: params[:access_hash])
end
def search_talent
@status = params[:status].nil? ? "All Talent" : params[:status]
@campaign_date = @campaign.event_start
campaign_regions = @campaign.regions.order(:state, :name)
all_regions = Region.where(type: Region.name).order(:state,:name)
@regions = @campaign.regions.order(:state,:name) + (all_regions - campaign_regions)
@region_options = []
@regions.each_with_index do |r, i|
if i < campaign_regions.count
@region_options << [ "* #{r.display_name} *", r.id]
else
@region_options << [r.display_name, r.id]
end
end
@region_id = params[:region_id]
unless @region_id.blank?
@region = Region.find(@region_id)
@campaigns_region = @campaign.campaigns_regions.find_by_region_id(@region_id)
end
case @status
when "All Talent"
relation = @region ? @region.talent : Talent.all
campaign_user_ids = @campaign.campaigns_users.pluck(:user_id)
relation = relation.where("users.id NOT IN (?)", campaign_user_ids) unless campaign_user_ids.empty?
talent_relation = relation.joins(:events_users).where("events_users.status = ?", EventsUser::STATUS_CONFIRMED).uniq
when "New"
talent_relation = @campaigns_region ? @campaigns_region.new_talent : @campaign.new_talent
when "Invited"
talent_relation = @campaigns_region ? @campaigns_region.invited_talent : @campaign.invited_talent
when "Confirmed"
talent_relation = @campaigns_region ? @campaigns_region.confirmed_talent : @campaign.confirmed_talent
when "Cancelled"
talent_relation = @campaigns_region ? @campaigns_region.cancelled_talent : @campaign.cancelled_talent
when "Campaign"
talent_relation = @campaigns_region ? @campaigns_region.talent : @campaign.talent
end
@q = talent_relation.search(params[:q])
page = params[:page].nil? ? 1 : params[:page].to_i
@talent_records = @q.result.paginate(page: page)
respond_to do |format|
format.js
format.html {render 'show'}
end
end
def add_talent
talent_ids = params[:talent_ids].split(",").map {|t| t.to_i}
count_was = @campaign.campaigns_users.count
talent_ids.each do |talent_id|
talent = Talent.find(talent_id)
@campaign.campaigns_users.where(user_id: talent_id).first_or_create(status: CampaignsUser::STATUS_NEW, email: talent.email)
end
new_count = @campaign.campaigns_users.count - count_was
flash[:success] = "Successfully added #{new_count} #{"talent user".pluralize(new_count)}."
page = params[:page].blank? ? 1 : params[:page].to_i
redirect_to search_talent_campaign_path(@campaign, region_id: params[:region_id], page: page)
end
def remove_talent
talent_ids = params[:talent_ids].split(",").map {|t| t.to_i}
campaigns_users = @campaign.campaigns_users.where("user_id IN (?)", talent_ids)
if campaigns_users.any?
campaigns_users.each {|campaigns_user| campaigns_user.cancel! }
flash[:success] = "Successfully cancelled talent user(s)."
else
flash[:notice] = "All users filtered."
end
redirect_to search_talent_campaign_path(@campaign)
end
def invite_talent
if @campaign.open?
talent_ids = params[:talent_ids].split(",").map {|t| t.to_i}
campaigns_users = @campaign.campaigns_users.where("user_id IN (?)", talent_ids)
if campaigns_users.any?
campaigns_users.each {|campaigns_user| campaigns_user.invite!}
flash[:success] = "Sent invite email to #{campaigns_users.count} #{"DJ".pluralize(campaigns_users.count)} successfully."
else
flash[:error] = "Please select talent that has been added to the campaign."
end
else
flash[:error] = "This campaign is not currently open."
end
redirect_to search_talent_campaign_path(@campaign, status: "Invited")
end
def add_events
event_ids = params[:event_ids].split(",").map {|t| t.to_i}
count_was = @campaign.events.count
Event.where("id IN (?)", event_ids).update_all(campaign_id: @campaign.id)
@campaign.update_regions
new_count = @campaign.events.count - count_was
flash[:success] = "Successfully added #{new_count} #{"event".pluralize(new_count)}."
redirect_to show_events_campaign_path(@campaign)
end
def remove_events
event_ids = params[:event_ids].split(",").map {|t| t.to_i}
count_was = @campaign.events.count
Event.where("id IN (?)", event_ids).update_all(campaign_id: nil)
CampaignsUser.where("event_id IN (?)", event_ids).update_all(event_id: nil, status: CampaignsUser::STATUS_INVITED, confirmed_at: nil)
new_count = count_was - @campaign.events.count
flash[:success] = "Successfully removed #{new_count} #{"event".pluralize(new_count)}."
redirect_to show_events_campaign_path(@campaign)
end
def send_invite
campaigns_user = CampaignsUser.find(params[:campaigns_user_id])
campaigns_user.send_invite_email
flash[:success] = "Sent Invite email to #{campaigns_user.user.artist_name}."
redirect_to search_talent_campaign_path(@campaign, status: "Campaign")
end
def send_test_invite
CampaignMailer.delay.test_invite(current_user.id, @campaign.id)
flash[:success] = "Sent test to #{current_user.email}."
redirect_to edit_mail_message_campaign_path(@campaign)
end
private
def prepare_events
@event_scope = params[:event_scope].nil? ? "campaign" : params[:event_scope]
relation = @event_scope == "company" ? @campaign.other_company_events : @campaign.events
@events = relation.includes(:campaigns_user).includes(:region).order("campaigns_users.confirmed_at DESC, events.start, locations.name").paginate(page: params[:page], per_page: 100)
end
def check_campaign_open
if @campaign.closed?
flash[:warning] = "This campaign is closed and can no longer be changed."
redirect_to slug_campaign_path(slug: @campaign.slug, invitation: params[:access_hash])
end
end
def campaign_params
params.require(:campaign).permit(:message, :email_body, :email_subject)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment