remomueller/tasktracker

View on GitHub
app/controllers/project_users_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

# Allows collaborators to be added to projects.
class ProjectUsersController < ApplicationController
  before_action :authenticate_user!, except: [:invite]
  before_action :find_editable_project_or_redirect, only: [:create]

  # GET /invite/TOKEN
  def invite
    session[:invite_token] = params[:invite_token]
    if current_user
      redirect_to accept_project_users_path
    else
      redirect_to new_user_session_path
    end
  end

  # POST /project_users.js
  def create
    create_member_invite
    render :index
  end

  # POST /project_users/1.js
  def resend
    @project_user = ProjectUser.find_by_id(params[:id])
    @project = current_user.all_projects.find_by_id(@project_user.project_id) if @project_user

    if @project && @project_user
      @project_user.generate_invite_token!
    else
      head :ok
    end
  end

  def accept
    invite_token = session.delete(:invite_token)
    @project_user = ProjectUser.find_by_invite_token invite_token
    if @project_user && @project_user.user == current_user
      redirect_to @project_user.project, notice: "You have already been added to #{@project_user.project.name}."
    elsif @project_user && @project_user.user
      redirect_to root_path, alert: 'This invite has already been claimed.'
    elsif @project_user
      @project_user.update user_id: current_user.id
      redirect_to @project_user.project, notice: 'You have been successfully been added to the project.'
    else
      redirect_to root_path, alert: 'Invalid invitation token.'
    end
  end

  # DELETE /project_users/1.js
  def destroy
    @project_user = ProjectUser.find_by_id(params[:id])
    @project = current_user.all_projects.find_by_id(@project_user.project_id) if @project_user
    if @project.blank? && @project_user && current_user == @project_user.user
      @project = current_user.all_viewable_projects.find_by_id(@project_user.project_id)
    end
    if @project && @project_user
      @project_user.destroy
      render :index
    else
      head :ok
    end
  end

  private

  def editor?
    (params[:editor] == '1')
  end

  def invite_email
    params[:invite_email].to_s.strip
  end

  def associated_user
    current_user.associated_users.find_by_email(invite_email.split('[').last.to_s.split(']').first)
  end

  def create_member_invite
    if associated_user
      add_existing_project_user(associated_user)
    elsif invite_email.present?
      invite_new_project_user
    end
  end

  def add_existing_project_user(user)
    @project_user = @project.project_users.where(user_id: user.id).first_or_create(creator_id: current_user.id)
    @project_user.update allow_editing: editor?
  end

  def invite_new_project_user
    @project_user = @project.project_users.where(invite_email: invite_email).first_or_create(creator_id: current_user.id)
    @project_user.update allow_editing: editor?
    @project_user.generate_invite_token!
  end
end