docbrown/app/controllers/github_repos_controller.rb
rhymes f3845f4d07
Fix Github repo pin and and unpin (#6582) [deploy]
* Fix GitHub repo pin and and unpin

* Update spec/requests/github_repos_spec.rb

Co-Authored-By: Vaidehi Joshi <vaidehi.sj@gmail.com>

* Update spec/requests/github_repos_spec.rb

Co-Authored-By: Vaidehi Joshi <vaidehi.sj@gmail.com>

Co-authored-by: Vaidehi Joshi <vaidehi.sj@gmail.com>
2020-03-11 17:50:13 +01:00

103 lines
2.8 KiB
Ruby

class GithubReposController < ApplicationController
before_action :authenticate_user!
after_action :verify_authorized
def index
authorize GithubRepo
client = create_octokit_client
existing_user_repos = current_user.github_repos.where(featured: true).
distinct.pluck(:github_id_code)
@repos = client.repositories.map do |repo|
repo.selected = existing_user_repos.include?(repo.id)
repo
end
rescue Octokit::Unauthorized => e
render json: { error: "Github Unauthorized: #{e.message}", status: 401 }, status: :unauthorized
end
def create
authorize GithubRepo
@repo = GithubRepo.find_or_create(fetched_repo_params(fetch_repo))
current_user.touch(:github_repos_updated_at)
if @repo.valid?
redirect_to "/settings/integrations", notice: "GitHub repo added"
else
redirect_to "/settings/integrations",
error: "There was an error adding your Github repo"
end
end
def update
@repo = GithubRepo.find(params[:id])
current_user.touch(:github_repos_updated_at)
authorize @repo
if @repo.update(featured: false)
redirect_to "/settings/integrations", notice: "GitHub repo added"
else
redirect_to "/settings/integrations",
error: "There was an error removing your Github repo"
end
end
def update_or_create
authorize GithubRepo
params[:github_repo] = JSON.parse(params[:github_repo])
fetched_repo = fetch_repo
unless fetched_repo
render json: "error: Could not find Github repo", status: :not_found
return
end
repo = GithubRepo.find_or_create(fetched_repo_params(fetched_repo))
current_user.touch(:github_repos_updated_at)
if repo.valid?
render json: { featured: repo.featured }
else
render json: "error: #{repo.errors.full_messages}"
end
end
private
def create_octokit_client
current_user_token = current_user.identities.where(provider: "github").last.token
client = Octokit::Client.new(access_token: current_user_token)
client&.repositories&.sort_by!(&:name)
client
end
def fetched_repo_params(fetched_repo)
{
github_id_code: fetched_repo.id,
user_id: current_user.id,
name: fetched_repo.name,
description: fetched_repo.description,
language: fetched_repo.language,
fork: fetched_repo.fork,
url: fetched_repo.html_url,
bytes_size: fetched_repo.size,
watchers_count: fetched_repo.watchers,
stargazers_count: fetched_repo.stargazers_count,
featured: repo_params[:featured],
info_hash: fetched_repo.to_hash
}
end
def fetch_repo
client = create_octokit_client
client.repositories.detect do |repo|
repo.id == repo_params[:github_id_code].to_i
end
end
def repo_params
permitted_attributes(GithubRepo)
end
end