docbrown/app/controllers/api/v0/github_repos_controller.rb
Andy Zhao ebd4b50f3f Use Preact for asynchronous rendering for /settings/integrations (#986)
* Set default styles and move button style out of form

* Add MVP of Preact /settings/integrations

* Change background color on hover and focus

* Remove unused constructor

* Improve optimistic rendering

* Add display name

* Use loading indicator for optimistic rendering

* WIP test

* Add basic snapshot tests
2018-10-31 15:51:07 -04:00

54 lines
1.8 KiB
Ruby

module Api
module V0
class GithubReposController < ApplicationController
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
end
def update_or_create
@client = create_octokit_client
@repo = GithubRepo.find_or_create(fetched_repo_params)
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
params[:github_repo] = JSON.parse(params[:github_repo])
fetched_repo = @client.repositories.select do |repo|
repo.id == permitted_attributes(GithubRepo)[:github_id_code].to_i
end.first
{
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
end
end
end