This repository has been archived by the owner on Apr 26, 2020. It is now read-only.
forked from mastodon/mastodon
-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement florence-social/mastodon-fork#134
- Loading branch information
Showing
6 changed files
with
170 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
# frozen_string_literal: true | ||
|
||
module WellKnown | ||
class NodeInfoController < ActionController::Base | ||
include RoutingHelper | ||
|
||
before_action { response.headers['Vary'] = 'Accept' } | ||
|
||
def index | ||
render json: ActiveModelSerializers::SerializableResource.new({}, serializer: NodeDiscoverySerializer) | ||
end | ||
|
||
def show | ||
render json: ActiveModelSerializers::SerializableResource.new({}, serializer: NodeInfoSerializer, version: "2.#{ params[:format] }") | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
# frozen_string_literal: true | ||
|
||
class NodeDiscoverySerializer < ActiveModel::Serializer | ||
include RoutingHelper | ||
|
||
attributes :links | ||
|
||
def links | ||
[ | ||
{ | ||
rel: 'http://nodeinfo.diaspora.software/ns/schema/2.0', | ||
href: node_info_schema_url('2.0'), | ||
}, | ||
{ | ||
rel: 'http://nodeinfo.diaspora.software/ns/schema/2.1', | ||
href: node_info_schema_url('2.1'), | ||
}, | ||
] | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
# frozen_string_literal: true | ||
|
||
class NodeInfoSerializer < ActiveModel::Serializer | ||
include RoutingHelper | ||
|
||
attributes :version, :usage, :software, :services, | ||
:protocols, :openRegistrations, :metadata | ||
|
||
def version | ||
object.adapter.serializer.instance_options[:version] | ||
end | ||
|
||
def usage | ||
{ | ||
users: { | ||
total: instance_presenter.user_count, | ||
activeHalfyear: instance_presenter.active_count(timespan: Time.zone.now - 6.months..Time.zone.now), | ||
activeMonth: instance_presenter.active_count, | ||
}, | ||
localPosts: instance_presenter.status_count, | ||
} | ||
end | ||
|
||
def software | ||
sw = { | ||
version: Mastodon::Version.to_s, | ||
name: 'mastodon' | ||
} | ||
sw[:repository] = Mastodon::Version.source_base_url if version == '2.1' | ||
sw | ||
end | ||
|
||
def services | ||
{ | ||
outbound: [], | ||
inbound: [], | ||
} | ||
end | ||
|
||
def protocols | ||
%w(ostatus activitypub) | ||
end | ||
|
||
def openRegistrations | ||
Setting.open_registrations | ||
end | ||
|
||
def metadata | ||
{ | ||
nodeName: instance_presenter.site_title, | ||
nodeDescription: instance_presenter.site_description, | ||
nodeTerms: instance_presenter.site_terms, | ||
siteContactEmail: instance_presenter.site_contact_email, | ||
domain_count: instance_presenter.domain_count, | ||
features: features, | ||
invitesEnabled: Setting.min_invite_role != 'admin', | ||
federation: federation, | ||
} | ||
end | ||
|
||
def features | ||
%w(mastodon_api mastodon_api_streaming) | ||
end | ||
|
||
def federation | ||
domains = DomainBlock.all | ||
feds = { | ||
reject_media: [], | ||
reject_reports: [], | ||
} | ||
domains.each do |domain| | ||
feds[domain.severity] = [] unless feds.keys.include?(domain.severity) | ||
feds[domain.severity] << domain.domain | ||
feds[:reject_media] << domain.domain if domain.reject_media | ||
feds[:reject_reports] << domain.domain if domain.reject_reports | ||
end | ||
feds | ||
end | ||
|
||
private | ||
|
||
def instance_presenter | ||
@instance_presenter ||= InstancePresenter.new | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
require 'rails_helper' | ||
|
||
describe WellKnown::NodeInfoController, type: :controller do | ||
render_views | ||
|
||
describe 'GET #index' do | ||
it 'returns json document pointing to node info' do | ||
get :index | ||
|
||
json_response = JSON.parse(response.body) | ||
|
||
expect(response).to have_http_status(200) | ||
expect(response.content_type).to eq 'application/json' | ||
expect(json_response.keys.include?('links')).to be true | ||
expect(json_response['links'][0]['rel']).to eq 'http://nodeinfo.diaspora.software/ns/schema/2.0' | ||
expect(json_response['links'][0]['href'].include?('nodeinfo/2.0')).to be true | ||
expect(json_response['links'][0]['rel']).to eq 'http://nodeinfo.diaspora.software/ns/schema/2.1' | ||
expect(json_response['links'][0]['href'].include?('nodeinfo/2.1')).to be true | ||
end | ||
end | ||
|
||
describe 'GET #show' do | ||
it 'returns json document pointing to node info' do | ||
get :show, params: { version_number: 2 } | ||
|
||
json_response = JSON.parse(response.body) | ||
|
||
expect(response).to have_http_status(200) | ||
expect(response.content_type).to eq 'application/json' | ||
expect(json_response.keys.include?('version')).to be true | ||
expect(json_response.keys.include?('usage')).to be true | ||
expect(json_response.keys.include?('software')).to be true | ||
expect(json_response.keys.include?('services')).to be true | ||
expect(json_response.keys.include?('protocols')).to be true | ||
expect(json_response.keys.include?('openRegistrations')).to be true | ||
expect(json_response.keys.include?('usage')).to be true | ||
expect(json_response.keys.include?('metaData')).to be true | ||
end | ||
end | ||
end |