resource-watch/prep-api

View on GitHub
app/controllers/api/partners_controller.rb

Summary

Maintainability
A
2 hrs
Test Coverage
class Api::PartnersController < ApiController

  before_action :set_partner, only: [:show, :update, :destroy]

  # GET /partners
  def index
    partners =
      if params[:env].present?
        environments = params[:env].split(',')

        ids = environments.map do |env|
          Partner.where(env => true)
        end.flatten.uniq.pluck(:id)

        Partner.where(id: ids)
      else
        Partner.production
      end

    if params.has_key?(:published)
      partners = partners.published(params[:published]) if params[:published] != 'all'
    else
      partners = partners.published
    end

    if params.has_key?(:featured)
      partners = partners.featured(params[:featured])
    end

    if params.has_key?(:partner_type)
      partners = partners.partner_type(params[:partner_type])
    end

    render json: partners, each_serializer: Api::PartnerSerializer, status: 200
  end

  def show
    if @partner
      render json: @partner, serializer: Api::PartnerSerializer, status: 200
    else
      render json: {status: 404, error: 'Partner not found'}
    end
  end

  # POST /partners
  def create
    @partner = Partner.new(partner_params)
    if @partner.save
      render json: @partner, status: 201
    else
      render json: { status: :unprocessable_entity, errors: @partner.errors }, status: 422
    end
  end

  # PUT /partners/:id
  def update
    if @partner.update(partner_params)
      render json: @partner
    else
      render json: { status: :unprocessable_entity, errors: @partner.errors }, status: 422
    end
  end

  # DELETE /partners/:id
  def destroy
    @partner.destroy
    head :no_content
  end

  private

    def partner_params
      # whitelist params
      params.permit(:name, :description, :url, :thumbnail, :logo, :white_logo, :contact_name, :contact_email, :featured, :published, :content, :partner_type)
    end

    def set_partner
      environments = params[:env].present? ? params[:env].split(',') : ['production']
      partner = Partner.find_by(id: params[:id])

      matches = environments.map do |env|
        partner.public_send(env)
      end

      @partner = matches.include?(true) ? partner : nil
    end

end