Commit 709c6685 authored by Eugen Rochko's avatar Eugen Rochko
Browse files

Made some progress

parent 9c4856bd
......@@ -38,6 +38,8 @@ group :development do
gem 'web-console', '~> 2.0'
gem 'spring'
gem 'rubocop', require: false
gem 'better_errors'
gem 'binding_of_caller'
end
group :production do
......
......@@ -43,6 +43,10 @@ GEM
descendants_tracker (~> 0.0.4)
ice_nine (~> 0.11.0)
thread_safe (~> 0.3, >= 0.3.1)
better_errors (2.1.1)
coderay (>= 1.0.0)
erubis (>= 2.6.6)
rack (>= 0.9.0)
binding_of_caller (0.7.2)
debug_inspector (>= 0.0.1)
builder (3.2.2)
......@@ -284,6 +288,8 @@ PLATFORMS
DEPENDENCIES
addressable
better_errors
binding_of_caller
byebug
coffee-rails (~> 4.1.0)
dotenv-rails
......
......@@ -3,6 +3,8 @@ module Mastodon
class Account < Grape::Entity
expose :username
expose :domain
expose :display_name
expose :note
end
class Status < Grape::Entity
......
......@@ -8,12 +8,10 @@ module Mastodon
resource :subscriptions do
helpers do
def subscription_url(account)
"https://649841dc.ngrok.io/api#{subscriptions_path(id: account.id)}"
end
include ApplicationHelper
end
desc 'Receive updates from a feed'
desc 'Receive updates from an account'
params do
requires :id, type: String, desc: 'Account ID'
......@@ -23,14 +21,14 @@ module Mastodon
body = request.body.read
if @account.subscription(subscription_url(@account)).verify(body, env['HTTP_X_HUB_SIGNATURE'])
ProcessFeedUpdateService.new.(body, @account)
ProcessFeedService.new.(body, @account)
status 201
else
status 202
end
end
desc 'Confirm PuSH subscription to a feed'
desc 'Confirm PuSH subscription to an account'
params do
requires :id, type: String, desc: 'Account ID'
......@@ -49,14 +47,15 @@ module Mastodon
end
resource :salmon do
desc 'Receive Salmon updates'
desc 'Receive Salmon updates targeted to account'
params do
requires :id, type: String, desc: 'Account ID'
end
post ':id' do
# todo
ProcessInteractionService.new.(request.body.read, @account)
status 201
end
end
end
......
......@@ -5,9 +5,34 @@ module Mastodon
resource :statuses do
desc 'Return a public timeline'
get :all do
present Status.all, with: Mastodon::Entities::Status
end
desc 'Return the home timeline of a logged in user'
get :home do
# todo
end
desc 'Return the notifications timeline of a logged in user'
get :notifications do
# todo
end
end
resource :accounts do
desc 'Return a user profile'
params do
requires :id, type: String, desc: 'Account ID'
end
get ':id' do
present Account.find(params[:id]), with: Mastodon::Entities::Account
end
end
end
end
......@@ -12,5 +12,4 @@
//
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree .
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://coffeescript.org/
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://coffeescript.org/
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://coffeescript.org/
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://coffeescript.org/
// Place all the styles related to the Atom controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
// Place all the styles related to the Home controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
// Place all the styles related to the Profile controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
// Place all the styles related to the XRD controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
class AtomController < ApplicationController
before_filter :set_format
def user_stream
@account = Account.find_by!(id: params[:id], domain: nil)
end
private
def set_format
request.format = 'xml'
response.headers['Content-Type'] = 'application/atom+xml'
end
end
class HomeController < ApplicationController
def index
end
end
class ProfileController < ApplicationController
def show
end
end
class XrdController < ApplicationController
before_filter :set_format
def host_meta
@webfinger_template = "#{webfinger_url}?resource={uri}"
end
def webfinger
@account = Account.find_by!(username: username_from_resource, domain: nil)
@canonical_account_uri = "acct:#{@account.username}#{LOCAL_DOMAIN}"
@magic_key = pem_to_magic_key(@account.keypair.public_key)
end
private
def set_format
request.format = 'xml'
response.headers['Content-Type'] = 'application/xrd+xml'
end
def username_from_resource
params[:resource].split('@').first.gsub('acct:', '')
end
def pem_to_magic_key(public_key)
modulus, exponent = [public_key.n, public_key.e].map do |component|
result = ""
until component == 0 do
result << [component % 256].pack('C')
component >>= 8
end
result.reverse!
end
(["RSA"] + [modulus, exponent].map { |n| Base64.urlsafe_encode64(n) }).join('.')
end
end
module ApplicationHelper
include GrapeRouteHelpers::NamedRouteMatcher
def unique_tag(date, id, type)
"tag:#{LOCAL_DOMAIN},#{date.strftime('%Y-%m-%d')}:objectId=#{id}:objectType=#{type}"
end
def subscription_url(account)
add_base_url_prefix subscription_path(id: account.id, format: '')
end
def salmon_url(account)
add_base_url_prefix salmon_path(id: account.id, format: '')
end
def add_base_url_prefix(suffix)
"#{root_url}api#{suffix}"
end
end
module AtomHelper
def stream_updated_at
@account.stream_entries.last ? @account.stream_entries.last.created_at.iso8601 : @account.updated_at.iso8601
end
end
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment