class GithubIssue < ApplicationRecord serialize :issue_serialized, Hash validates :category, inclusion: { in: %w(issue issue_comment) } def self.find_or_fetch(url) find_by_url(url) || fetch(url) end # def self.fetch(url) # begin # return try_to_get_issue(url) # rescue StandardError => e # raise StandardError, e.message # end # end def self.fetch(url) tries = 0 issue = nil until tries > 4 || issue begin return issue = try_to_get_issue(url) rescue => e puts e tries += 1 end end end def self.try_to_get_issue(url) client = Octokit::Client.new(access_token: random_token) issue = GithubIssue.new(url: url) if !!(url !~ /\/issues\/comments/) repo, issue_id = url.gsub(/.*github\.com\/repos\//, "").split("/issues/") issue.issue_serialized = get_issue_serialized(client, repo, issue_id) issue.category = "issue" else repo, issue_id = url.gsub(/.*github\.com\/repos\//, "").split("/issues/comments/") issue.issue_serialized = client.issue_comment(repo, issue_id).to_hash issue.category = "issue_comment" end issue.processed_html = get_html(client, issue) issue.save! issue end def self.get_html(client, issue) client.markdown(issue.issue_serialized[:body]) end def self.get_issue_serialized(client, repo, issue_id) client.issue(repo, issue_id).to_hash end def self.random_token if Rails.env.test? "ddsddsdsdssdsds" else random_identity.token end end def self.random_identity if Rails.env.production? Identity.where(provider: "github").last(250).sample else Identity.where(provider: "github").last end end end