forked from treehouse/mastodon
Individual atom entries
parent
1dad72bf13
commit
2bc48e9064
|
@ -5,6 +5,10 @@ class AtomController < ApplicationController
|
||||||
@account = Account.find_by!(id: params[:id], domain: nil)
|
@account = Account.find_by!(id: params[:id], domain: nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def entry
|
||||||
|
@entry = StreamEntry.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_format
|
def set_format
|
||||||
|
|
|
@ -37,6 +37,14 @@ class Account < ActiveRecord::Base
|
||||||
:person
|
:person
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def title
|
||||||
|
self.username
|
||||||
|
end
|
||||||
|
|
||||||
|
def summary
|
||||||
|
self.note
|
||||||
|
end
|
||||||
|
|
||||||
def subscribed?
|
def subscribed?
|
||||||
!(self.secret.blank? || self.verify_token.blank?)
|
!(self.secret.blank? || self.verify_token.blank?)
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@ class ProcessInteractionService
|
||||||
body = salmon.unpack(envelope)
|
body = salmon.unpack(envelope)
|
||||||
xml = Nokogiri::XML(body)
|
xml = Nokogiri::XML(body)
|
||||||
|
|
||||||
return if xml.at_xpath('//author/name').nil? || xml.at_xpath('//author/uri').nil?
|
return if !involves_target_account(xml, target_account) || xml.at_xpath('//author/name').nil? || xml.at_xpath('//author/uri').nil?
|
||||||
|
|
||||||
username = xml.at_xpath('//author/name').content
|
username = xml.at_xpath('//author/name').content
|
||||||
url = xml.at_xpath('//author/uri').content
|
url = xml.at_xpath('//author/uri').content
|
||||||
|
@ -28,6 +28,9 @@ class ProcessInteractionService
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def involves_target_account(target_account)
|
||||||
|
end
|
||||||
|
|
||||||
def salmon
|
def salmon
|
||||||
OStatus2::Salmon.new
|
OStatus2::Salmon.new
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
Nokogiri::XML::Builder.new do |xml|
|
||||||
|
xml.entry(xmlns: 'http://www.w3.org/2005/Atom', 'xmlns:thr': 'http://purl.org/syndication/thread/1.0', 'xmlns:activity': 'http://activitystrea.ms/spec/1.0/', 'xmlns:poco': 'http://portablecontacts.net/spec/1.0') do
|
||||||
|
xml.id_ unique_tag(@entry.created_at, @entry.activity_id, @entry.activity_type)
|
||||||
|
|
||||||
|
xml.published @entry.activity.created_at.iso8601
|
||||||
|
xml.updated @entry.activity.updated_at.iso8601
|
||||||
|
|
||||||
|
xml.title @entry.title
|
||||||
|
xml.content({ type: 'html' }, @entry.content)
|
||||||
|
xml['activity'].send('verb', "http://activitystrea.ms/schema/1.0/#{@entry.verb}")
|
||||||
|
|
||||||
|
xml.author do
|
||||||
|
xml['activity'].send('object-type', 'http://activitystrea.ms/schema/1.0/person')
|
||||||
|
xml.uri profile_url(name: @entry.account.username)
|
||||||
|
xml.name @entry.account.username
|
||||||
|
xml.summary @entry.account.note
|
||||||
|
|
||||||
|
xml.link(rel: 'alternate', type: 'text/html', href: profile_url(name: @entry.account.username))
|
||||||
|
|
||||||
|
xml['poco'].preferredUsername @entry.account.username
|
||||||
|
xml['poco'].displayName @entry.account.display_name
|
||||||
|
xml['poco'].note @entry.account.note
|
||||||
|
end
|
||||||
|
|
||||||
|
if @entry.targeted?
|
||||||
|
xml['activity'].send('object') do
|
||||||
|
xml['activity'].send('object-type', "http://activitystrea.ms/schema/1.0/#{@entry.target.object_type}")
|
||||||
|
xml.id_ @entry.target.uri
|
||||||
|
xml.title @entry.target.title
|
||||||
|
xml.summary @entry.target.summary
|
||||||
|
xml.link(rel: 'alternate', type: 'text/html', href: @entry.target.uri)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
xml['activity'].send('object-type', "http://activitystrea.ms/schema/1.0/#{@entry.object_type}")
|
||||||
|
end
|
||||||
|
|
||||||
|
xml.link(rel: 'self', type: 'application/atom+xml', href: atom_entry_url(id: @entry.id))
|
||||||
|
end
|
||||||
|
end.to_xml
|
|
@ -1,5 +1,5 @@
|
||||||
Nokogiri::XML::Builder.new do |xml|
|
Nokogiri::XML::Builder.new do |xml|
|
||||||
xml.feed(xmlns: 'http://www.w3.org/2005/Atom', 'xmlns:thr': 'http://purl.org/syndication/thread/1.0', 'xmlns:activity': 'http://activitystrea.ms/spec/1.0/') do
|
xml.feed(xmlns: 'http://www.w3.org/2005/Atom', 'xmlns:thr': 'http://purl.org/syndication/thread/1.0', 'xmlns:activity': 'http://activitystrea.ms/spec/1.0/', 'xmlns:poco': 'http://portablecontacts.net/spec/1.0') do
|
||||||
xml.id_ atom_user_stream_url(id: @account.id)
|
xml.id_ atom_user_stream_url(id: @account.id)
|
||||||
xml.title @account.display_name
|
xml.title @account.display_name
|
||||||
xml.subtitle @account.note
|
xml.subtitle @account.note
|
||||||
|
@ -12,6 +12,10 @@ Nokogiri::XML::Builder.new do |xml|
|
||||||
xml.summary @account.note
|
xml.summary @account.note
|
||||||
|
|
||||||
xml.link(rel: 'alternate', type: 'text/html', href: profile_url(name: @account.username))
|
xml.link(rel: 'alternate', type: 'text/html', href: profile_url(name: @account.username))
|
||||||
|
|
||||||
|
xml['poco'].preferredUsername @account.username
|
||||||
|
xml['poco'].displayName @account.display_name
|
||||||
|
xml['poco'].note @account.note
|
||||||
end
|
end
|
||||||
|
|
||||||
xml.link(rel: 'alternate', type: 'text/html', href: profile_url(name: @account.username))
|
xml.link(rel: 'alternate', type: 'text/html', href: profile_url(name: @account.username))
|
||||||
|
@ -19,7 +23,7 @@ Nokogiri::XML::Builder.new do |xml|
|
||||||
xml.link(rel: 'salmon', href: salmon_url(@account))
|
xml.link(rel: 'salmon', href: salmon_url(@account))
|
||||||
xml.link(rel: 'self', type: 'application/atom+xml', href: atom_user_stream_url(id: @account.id))
|
xml.link(rel: 'self', type: 'application/atom+xml', href: atom_user_stream_url(id: @account.id))
|
||||||
|
|
||||||
@account.stream_entries.each do |stream_entry|
|
@account.stream_entries.order('id desc').each do |stream_entry|
|
||||||
xml.entry do
|
xml.entry do
|
||||||
xml.id_ unique_tag(stream_entry.created_at, stream_entry.activity_id, stream_entry.activity_type)
|
xml.id_ unique_tag(stream_entry.created_at, stream_entry.activity_id, stream_entry.activity_type)
|
||||||
|
|
||||||
|
@ -34,10 +38,15 @@ Nokogiri::XML::Builder.new do |xml|
|
||||||
xml['activity'].send('object') do
|
xml['activity'].send('object') do
|
||||||
xml['activity'].send('object-type', "http://activitystrea.ms/schema/1.0/#{stream_entry.target.object_type}")
|
xml['activity'].send('object-type', "http://activitystrea.ms/schema/1.0/#{stream_entry.target.object_type}")
|
||||||
xml.id_ stream_entry.target.uri
|
xml.id_ stream_entry.target.uri
|
||||||
|
xml.title stream_entry.target.title
|
||||||
|
xml.summary stream_entry.target.summary
|
||||||
|
xml.link(rel: 'alternate', type: 'text/html', href: stream_entry.target.uri)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
xml['activity'].send('object-type', "http://activitystrea.ms/schema/1.0/#{stream_entry.object_type}")
|
xml['activity'].send('object-type', "http://activitystrea.ms/schema/1.0/#{stream_entry.object_type}")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
xml.link(rel: 'self', type: 'application/atom+xml', href: atom_entry_url(id: stream_entry.id))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,7 +2,8 @@ Rails.application.routes.draw do
|
||||||
get '.well-known/host-meta', to: 'xrd#host_meta', as: :host_meta
|
get '.well-known/host-meta', to: 'xrd#host_meta', as: :host_meta
|
||||||
get '.well-known/webfinger', to: 'xrd#webfinger', as: :webfinger
|
get '.well-known/webfinger', to: 'xrd#webfinger', as: :webfinger
|
||||||
|
|
||||||
get 'atom/:id', to: 'atom#user_stream', as: :atom_user_stream
|
get 'atom/entry/:id', to: 'atom#entry', as: :atom_entry
|
||||||
|
get 'atom/user/:id', to: 'atom#user_stream', as: :atom_user_stream
|
||||||
get 'user/:name', to: 'profile#show', as: :profile
|
get 'user/:name', to: 'profile#show', as: :profile
|
||||||
|
|
||||||
mount Mastodon::API => '/api/'
|
mount Mastodon::API => '/api/'
|
||||||
|
|
Loading…
Reference in New Issue