# frozen_string_literal: true # License: AGPL-3.0-or-later WITH WTO-AP-3.0-or-later # Full license explanation at https://github.com/houdiniproject/houdini/blob/master/LICENSE module Nonprofits class SupportersController < ApplicationController include Controllers::Nonprofit::Current include Controllers::Nonprofit::Authorization include Controllers::Supporter::Current before_action :authenticate_nonprofit_user!, except: %i[new create] # get /nonprofit/:nonprofit_id/supporters def index @panels_layout = true @nonprofit = current_nonprofit respond_to do |format| format.html format.json do render json: QuerySupporters.full_search(params[:nonprofit_id], params) end format.csv do file_date = Date.today.strftime('%m-%d-%Y') supporters = QuerySupporters.for_export(params[:nonprofit_id], params) send_data(Format::Csv.from_vectors(supporters), filename: "supporters-#{file_date}.csv") end end end def export begin @nonprofit = current_nonprofit @user = current_user_id ExportSupporters.initiate_export(@nonprofit.id, params, @user) rescue StandardError => e e end if e.nil? flash[:notice] = "Your export was successfully initiated and you'll be emailed at #{current_user.email} as soon as it's available. Feel free to use the site in the meantime." render json: {}, status: :ok else render json: e, status: :ok end end def index_metrics render_json do QuerySupporters.full_search_metrics(params[:nonprofit_id], params) end end def show render json: { data: QuerySupporters.for_crm_profile(params[:nonprofit_id], [params[:id]]).first } end def email_address render json: current_supporter.email end def full_contact begin if current_supporter.method_defined? :full_contact_infos && (fc = current_supporter.full_contact_infos.first) render json: { full_contact: QueryFullContactInfos.fetch_associated_tables(fc.id) } else render json: { full_contact: nil } end rescue render json: { full_contact: nil } end end def info_card render json: QuerySupporters.for_info_card(params[:supporter_id]) end # post /nonprofits/:nonprofit_id/supporters def create render_json { InsertSupporter.create_or_update(nonprofit, create_supporter_params.to_h) } end # put /nonprofits/:nonprofit_id/supporters/:id def update json_saved UpdateSupporter.from_info(current_supporter, update_supporter_params[:supporter]) end def bulk_delete if params[:selecting_all] supporter_ids = QuerySupporters.full_filter_expr(current_nonprofit.id, params[:query]).select('supporters.id').execute.map { |h| h['id'] } else supporter_ids = params[:supporter_ids]. map(&:to_i) end render_json { UpdateSupporter.bulk_delete(current_nonprofit.id, supporter_ids) } end # get /nonprofits/:nonprofit_id/supporters/merge_data # returns the info required to merge two supporters def merge_data render json: QuerySupporters.merge_data(params[:ids]) end # post /nonprofits/:nonprofit_id/supporters/merge def merge render JsonResp.new(params) do |_params| requires(:supporter) requires(:nonprofit_id).as_int requires(:supporter_ids).as_array end.when_valid do |params| params[:supporter][:nonprofit_id] = params[:nonprofit_id] MergeSupporters.selected(update_supporter_params[:supporter], params[:supporter_ids], params[:nonprofit_id], current_user.id) end end private def create_supporter_params params.require(:supporter).permit(:name, :address, :city, :state_code, :country, :address_line2, :first_name, :last_name, :customFields, :email) end def update_supporter_params params.require(:supporter).permit(:name, :address, :city, :state_code, :country, :address_line2) end end end