mirror of
https://github.com/discourse/discourse.git
synced 2024-11-22 16:02:46 +08:00
58 lines
1.8 KiB
Ruby
58 lines
1.8 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
require_relative "../mixins/github_body"
|
||
|
require_relative "../mixins/github_auth_header"
|
||
|
|
||
|
module Onebox
|
||
|
module Engine
|
||
|
class GithubRepoOnebox
|
||
|
include Engine
|
||
|
include LayoutSupport
|
||
|
include JSON
|
||
|
include Onebox::Mixins::GithubAuthHeader
|
||
|
|
||
|
GITHUB_COMMENT_REGEX = /(<!--.*?-->\r\n)/
|
||
|
|
||
|
matches_regexp(%r{^https?:\/\/(?:www\.)?(?!gist\.)[^\/]*github\.com\/[^\/]+\/[^\/]+\/?$})
|
||
|
always_https
|
||
|
|
||
|
def url
|
||
|
"https://api.github.com/repos/#{match[:org]}/#{match[:repository]}"
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def match
|
||
|
@match ||= @url.match(%r{github\.com/(?<org>[^/]+)/(?<repository>[^/]+)})
|
||
|
end
|
||
|
|
||
|
def data
|
||
|
result = raw(github_auth_header(match[:org])).clone
|
||
|
result["link"] = link
|
||
|
description = result["description"]
|
||
|
title = "GitHub - #{result["full_name"]}"
|
||
|
|
||
|
if description.blank?
|
||
|
description = I18n.t("onebox.github.no_description", repo: result["full_name"])
|
||
|
else
|
||
|
title += ": #{Onebox::Helpers.truncate(description)}"
|
||
|
end
|
||
|
|
||
|
result["description"] = description
|
||
|
result["title"] = title
|
||
|
result["is_private"] = result["private"]
|
||
|
|
||
|
# The SecureRandom part of this doesn't matter, it's just used for caching the
|
||
|
# repo thumbnail which is generated on the fly by GitHub. There isn't detail
|
||
|
# in https://github.blog/2021-06-22-framework-building-open-graph-images/,
|
||
|
# but this SO answer https://stackoverflow.com/a/69043743 suggests this is
|
||
|
# how it works and testing confirms it.
|
||
|
result[
|
||
|
"thumbnail"
|
||
|
] = "https://opengraph.githubassets.com/#{SecureRandom.hex}/#{match[:org]}/#{match[:repository]}"
|
||
|
result
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|