docbrown/app/controllers/api/v0/github_repos_controller.rb

66 lines
2.2 KiB
Ruby

module Api
module V0
class GithubReposController < ApiController
def index
client = create_octokit_client
existing_user_repos = GithubRepo.
where(user_id: current_user.id, featured: true).pluck(:github_id_code) #=> [1,2,3]
existing_user_repos = Set.new(existing_user_repos)
@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 update_or_create
@client = create_octokit_client
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 = Identity.find_by(provider: "github", user_id: current_user.id).token
Octokit::Client.new(access_token: current_user_token)
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: permitted_attributes(GithubRepo)[:featured],
info_hash: fetched_repo.to_hash
}
end
def fetch_repo
params[:github_repo] = JSON.parse(params[:github_repo])
@client.repositories.detect do |repo|
repo.id == permitted_attributes(GithubRepo)[:github_id_code].to_i
end
end
end
end
end