60 lines
1.7 KiB
Ruby
60 lines
1.7 KiB
Ruby
class Github::GithubService
|
|
attr_reader :hook
|
|
|
|
def initialize(hook:)
|
|
@hook = hook
|
|
end
|
|
|
|
def repositories
|
|
client.repositories(nil, type: 'all')
|
|
rescue Octokit::Error => e
|
|
Rails.logger.error("GitHub API error fetching repositories: #{e.message}")
|
|
raise_api_error(e)
|
|
end
|
|
|
|
def assignees(repo_full_name)
|
|
client.repository_assignees(repo_full_name)
|
|
rescue Octokit::Error => e
|
|
Rails.logger.error("GitHub API error fetching assignees for #{repo_full_name}: #{e.message}")
|
|
raise_api_error(e)
|
|
end
|
|
|
|
def search_repositories(query)
|
|
return repositories if query.blank?
|
|
|
|
# Get all user's repositories first
|
|
user_repos = repositories
|
|
|
|
# Filter repositories by query string (case-insensitive)
|
|
user_repos.select do |repo|
|
|
repo.full_name.downcase.include?(query.downcase) ||
|
|
(repo.description&.downcase&.include?(query.downcase))
|
|
end
|
|
rescue Octokit::Error => e
|
|
Rails.logger.error("GitHub API error searching repositories with query '#{query}': #{e.message}")
|
|
raise_api_error(e)
|
|
end
|
|
|
|
private
|
|
|
|
def client
|
|
@client ||= Octokit::Client.new(
|
|
access_token: hook.access_token,
|
|
auto_paginate: true,
|
|
per_page: 100
|
|
)
|
|
end
|
|
|
|
def raise_api_error(error)
|
|
case error.response_status
|
|
when 401
|
|
raise CustomExceptions::Base.new('GitHub authentication failed', 401)
|
|
when 403
|
|
raise CustomExceptions::Base.new('GitHub API rate limit exceeded or insufficient permissions', 403)
|
|
when 404
|
|
raise CustomExceptions::Base.new('GitHub resource not found', 404)
|
|
else
|
|
raise CustomExceptions::Base.new("GitHub API error: #{error.message}", error.response_status || 500)
|
|
end
|
|
end
|
|
end |