rubygems/adoption-center

View on GitHub
app/controllers/gems_adoptions_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
class GemsAdoptionsController < ApplicationController
  before_action :require_login, except: :index

  def index
    @title = 'Gems up for adoption'
    @gems_adoptions = GemsAdoption.includes(:ruby_gem).page(params[:page])
  end

  def new
    @ruby_gem = current_user.ruby_gems.find(params[:id])
    @gems_adoption = @ruby_gem.build_gems_adoption
  end

  def create
    @gems_adoption = current_user.gems_adoptions.build(gems_adoption_params)
    if @gems_adoption.save
      flash[:success] = 'Gem up for adoption'
      redirect_to gem_path(@gems_adoption.ruby_gem)
    else
      render :new
    end
  end

  def update
    adoption_request = AdoptionRequest.find(params[:id])
    gems_adoption = adoption_request.gems_adoption
    if gems_adoption.update(status: 'closed') && GemOwnershipTransfer.create(old_user: current_user, new_user_id: adoption_request.user_id, ruby_gem_id: gems_adoption.ruby_gem_id)
      deliver_adoption_request_accepted_email(adoption_request)
      deliver_adoption_request_rejected_email(adoption_request)
      flash[:success] = "Gem ownership transferred"
      redirect_to gem_path(gems_adoption.ruby_gem)
    else
      flash[:danger] = "Gem couldn't be transferred"
      redirect_to :adoption_requests
    end
  end

  def destroy
    current_user.gems_adoptions.find(params[:id]).destroy
    flash[:success] = 'Gem removed from adoption'
    redirect_to :gems
  end

  private

  def gems_adoption_params
    params.require(:gems_adoption).permit(:ruby_gem_id, :description)
  end

  def deliver_adoption_request_accepted_email(adoption_request)
    NotificationMailer.email_adoption_request_status(adoption_request.user, adoption_request.gems_adoption.ruby_gem, "Accepted").deliver_now
  end

  def deliver_adoption_request_rejected_email(adoption_request)
    rejected_users = AdoptionRequest.where(gems_adoption_id: adoption_request.gems_adoption).where.not(user_id: adoption_request.user)
    rejected_users.each do |rejected_user|
      NotificationMailer.email_adoption_request_status(rejected_user.user, adoption_request.gems_adoption.ruby_gem, "Rejected").deliver_now
    end
  end
end