commit
fc48d7d27d
@ -1,2 +1,5 @@
|
|||||||
node_modules/
|
node_modules/
|
||||||
.cache/
|
.cache/
|
||||||
|
docs/
|
||||||
|
spec/
|
||||||
|
storybook/
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
web: bundle exec puma -C config/puma.rb
|
web: bundle exec puma -C config/puma.rb
|
||||||
worker: bundle exec sidekiq -q default -q mailers -q push
|
worker: bundle exec sidekiq -q default -q push -q pull -q mailers
|
||||||
|
Before Width: | Height: | Size: 874 KiB After Width: | Height: | Size: 209 KiB |
@ -0,0 +1,19 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Localized
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
included do
|
||||||
|
before_action :set_locale
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_locale
|
||||||
|
I18n.locale = current_user.try(:locale) || default_locale
|
||||||
|
rescue I18n::InvalidLocale
|
||||||
|
I18n.locale = default_locale
|
||||||
|
end
|
||||||
|
|
||||||
|
def default_locale
|
||||||
|
ENV.fetch('DEFAULT_LOCALE') { I18n.default_locale }
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,16 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicationsController
|
||||||
|
include Localized
|
||||||
|
|
||||||
|
skip_before_action :authenticate_resource_owner!
|
||||||
|
|
||||||
|
before_action :store_current_location
|
||||||
|
before_action :authenticate_resource_owner!
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def store_current_location
|
||||||
|
store_location_for(:user, request.url)
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,351 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class AtomSerializer
|
||||||
|
include RoutingHelper
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def render(element)
|
||||||
|
document = Ox::Document.new(version: '1.0')
|
||||||
|
document << element
|
||||||
|
('<?xml version="1.0"?>' + Ox.dump(element)).force_encoding('UTF-8')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def author(account)
|
||||||
|
author = Ox::Element.new('author')
|
||||||
|
|
||||||
|
uri = TagManager.instance.uri_for(account)
|
||||||
|
|
||||||
|
append_element(author, 'id', uri)
|
||||||
|
append_element(author, 'activity:object-type', TagManager::TYPES[:person])
|
||||||
|
append_element(author, 'uri', uri)
|
||||||
|
append_element(author, 'name', account.username)
|
||||||
|
append_element(author, 'email', account.local? ? "#{account.acct}@#{Rails.configuration.x.local_domain}" : account.acct)
|
||||||
|
append_element(author, 'summary', account.note)
|
||||||
|
append_element(author, 'link', nil, rel: :alternate, type: 'text/html', href: TagManager.instance.url_for(account))
|
||||||
|
append_element(author, 'link', nil, rel: :avatar, type: account.avatar_content_type, 'media:width': 120, 'media:height': 120, href: full_asset_url(account.avatar.url(:original)))
|
||||||
|
append_element(author, 'link', nil, rel: :header, type: account.header_content_type, 'media:width': 700, 'media:height': 335, href: full_asset_url(account.header.url(:original)))
|
||||||
|
append_element(author, 'poco:preferredUsername', account.username)
|
||||||
|
append_element(author, 'poco:displayName', account.display_name) unless account.display_name.blank?
|
||||||
|
append_element(author, 'poco:note', Formatter.instance.simplified_format(account).to_str) unless account.note.blank?
|
||||||
|
append_element(author, 'mastodon:scope', account.locked? ? :private : :public)
|
||||||
|
|
||||||
|
author
|
||||||
|
end
|
||||||
|
|
||||||
|
def feed(account, stream_entries)
|
||||||
|
feed = Ox::Element.new('feed')
|
||||||
|
|
||||||
|
add_namespaces(feed)
|
||||||
|
|
||||||
|
append_element(feed, 'id', account_url(account, format: 'atom'))
|
||||||
|
append_element(feed, 'title', account.display_name)
|
||||||
|
append_element(feed, 'subtitle', account.note)
|
||||||
|
append_element(feed, 'updated', account.updated_at.iso8601)
|
||||||
|
append_element(feed, 'logo', full_asset_url(account.avatar.url(:original)))
|
||||||
|
|
||||||
|
feed << author(account)
|
||||||
|
|
||||||
|
append_element(feed, 'link', nil, rel: :alternate, type: 'text/html', href: TagManager.instance.url_for(account))
|
||||||
|
append_element(feed, 'link', nil, rel: :self, type: 'application/atom+xml', href: account_url(account, format: 'atom'))
|
||||||
|
append_element(feed, 'link', nil, rel: :next, type: 'application/atom+xml', href: account_url(account, format: 'atom', max_id: stream_entries.last.id)) if stream_entries.size == 20
|
||||||
|
append_element(feed, 'link', nil, rel: :hub, href: api_push_url)
|
||||||
|
append_element(feed, 'link', nil, rel: :salmon, href: api_salmon_url(account.id))
|
||||||
|
|
||||||
|
stream_entries.each do |stream_entry|
|
||||||
|
feed << entry(stream_entry)
|
||||||
|
end
|
||||||
|
|
||||||
|
feed
|
||||||
|
end
|
||||||
|
|
||||||
|
def entry(stream_entry, root = false)
|
||||||
|
entry = Ox::Element.new('entry')
|
||||||
|
|
||||||
|
add_namespaces(entry) if root
|
||||||
|
|
||||||
|
append_element(entry, 'id', TagManager.instance.unique_tag(stream_entry.created_at, stream_entry.activity_id, stream_entry.activity_type))
|
||||||
|
append_element(entry, 'published', stream_entry.created_at.iso8601)
|
||||||
|
append_element(entry, 'updated', stream_entry.updated_at.iso8601)
|
||||||
|
append_element(entry, 'title', stream_entry&.status&.title)
|
||||||
|
|
||||||
|
entry << author(stream_entry.account) if root
|
||||||
|
|
||||||
|
append_element(entry, 'activity:object-type', TagManager::TYPES[stream_entry.object_type])
|
||||||
|
append_element(entry, 'activity:verb', TagManager::VERBS[stream_entry.verb])
|
||||||
|
|
||||||
|
entry << object(stream_entry.target) if stream_entry.targeted?
|
||||||
|
|
||||||
|
serialize_status_attributes(entry, stream_entry.status) unless stream_entry.status.nil?
|
||||||
|
|
||||||
|
append_element(entry, 'link', nil, rel: :alternate, type: 'text/html', href: account_stream_entry_url(stream_entry.account, stream_entry))
|
||||||
|
append_element(entry, 'link', nil, rel: :self, type: 'application/atom+xml', href: account_stream_entry_url(stream_entry.account, stream_entry, format: 'atom'))
|
||||||
|
append_element(entry, 'thr:in-reply-to', nil, ref: TagManager.instance.uri_for(stream_entry.thread), href: TagManager.instance.url_for(stream_entry.thread)) if stream_entry.threaded?
|
||||||
|
|
||||||
|
entry
|
||||||
|
end
|
||||||
|
|
||||||
|
def object(status)
|
||||||
|
object = Ox::Element.new('activity:object')
|
||||||
|
|
||||||
|
append_element(object, 'id', TagManager.instance.uri_for(status))
|
||||||
|
append_element(object, 'published', status.created_at.iso8601)
|
||||||
|
append_element(object, 'updated', status.updated_at.iso8601)
|
||||||
|
append_element(object, 'title', status.title)
|
||||||
|
|
||||||
|
object << author(status.account)
|
||||||
|
|
||||||
|
append_element(object, 'activity:object-type', TagManager::TYPES[status.object_type])
|
||||||
|
append_element(object, 'activity:verb', TagManager::VERBS[status.verb])
|
||||||
|
|
||||||
|
serialize_status_attributes(object, status)
|
||||||
|
|
||||||
|
append_element(object, 'link', nil, rel: :alternate, type: 'text/html', href: TagManager.instance.url_for(status))
|
||||||
|
append_element(object, 'thr:in-reply-to', nil, ref: TagManager.instance.uri_for(status.thread), href: TagManager.instance.url_for(status.thread)) if status.reply? && !status.thread.nil?
|
||||||
|
|
||||||
|
object
|
||||||
|
end
|
||||||
|
|
||||||
|
def follow_salmon(follow)
|
||||||
|
entry = Ox::Element.new('entry')
|
||||||
|
add_namespaces(entry)
|
||||||
|
|
||||||
|
description = "#{follow.account.acct} started following #{follow.target_account.acct}"
|
||||||
|
|
||||||
|
append_element(entry, 'id', TagManager.instance.unique_tag(follow.created_at, follow.id, 'Follow'))
|
||||||
|
append_element(entry, 'title', description)
|
||||||
|
append_element(entry, 'content', description, type: :html)
|
||||||
|
|
||||||
|
entry << author(follow.account)
|
||||||
|
|
||||||
|
append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
|
||||||
|
append_element(entry, 'activity:verb', TagManager::VERBS[:follow])
|
||||||
|
|
||||||
|
object = author(follow.target_account)
|
||||||
|
object.value = 'activity:object'
|
||||||
|
|
||||||
|
entry << object
|
||||||
|
entry
|
||||||
|
end
|
||||||
|
|
||||||
|
def follow_request_salmon(follow_request)
|
||||||
|
entry = Ox::Element.new('entry')
|
||||||
|
add_namespaces(entry)
|
||||||
|
|
||||||
|
append_element(entry, 'id', TagManager.instance.unique_tag(follow_request.created_at, follow_request.id, 'FollowRequest'))
|
||||||
|
append_element(entry, 'title', "#{follow_request.account.acct} requested to follow #{follow_request.target_account.acct}")
|
||||||
|
|
||||||
|
entry << author(follow_request.account)
|
||||||
|
|
||||||
|
append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
|
||||||
|
append_element(entry, 'activity:verb', TagManager::VERBS[:request_friend])
|
||||||
|
|
||||||
|
object = author(follow_request.target_account)
|
||||||
|
object.value = 'activity:object'
|
||||||
|
|
||||||
|
entry << object
|
||||||
|
entry
|
||||||
|
end
|
||||||
|
|
||||||
|
def authorize_follow_request_salmon(follow_request)
|
||||||
|
entry = Ox::Element.new('entry')
|
||||||
|
add_namespaces(entry)
|
||||||
|
|
||||||
|
append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, follow_request.id, 'FollowRequest'))
|
||||||
|
append_element(entry, 'title', "#{follow_request.target_account.acct} authorizes follow request by #{follow_request.account.acct}")
|
||||||
|
|
||||||
|
entry << author(follow_request.target_account)
|
||||||
|
|
||||||
|
append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
|
||||||
|
append_element(entry, 'activity:verb', TagManager::VERBS[:authorize])
|
||||||
|
|
||||||
|
object = Ox::Element.new('activity:object')
|
||||||
|
object << author(follow_request.account)
|
||||||
|
|
||||||
|
append_element(object, 'activity:object-type', TagManager::TYPES[:activity])
|
||||||
|
append_element(object, 'activity:verb', TagManager::VERBS[:request_friend])
|
||||||
|
|
||||||
|
inner_object = author(follow_request.target_account)
|
||||||
|
inner_object.value = 'activity:object'
|
||||||
|
|
||||||
|
object << inner_object
|
||||||
|
entry << object
|
||||||
|
entry
|
||||||
|
end
|
||||||
|
|
||||||
|
def reject_follow_request_salmon(follow_request)
|
||||||
|
entry = Ox::Element.new('entry')
|
||||||
|
add_namespaces(entry)
|
||||||
|
|
||||||
|
append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, follow_request.id, 'FollowRequest'))
|
||||||
|
append_element(entry, 'title', "#{follow_request.target_account.acct} rejects follow request by #{follow_request.account.acct}")
|
||||||
|
|
||||||
|
entry << author(follow_request.target_account)
|
||||||
|
|
||||||
|
append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
|
||||||
|
append_element(entry, 'activity:verb', TagManager::VERBS[:reject])
|
||||||
|
|
||||||
|
object = Ox::Element.new('activity:object')
|
||||||
|
object << author(follow_request.account)
|
||||||
|
|
||||||
|
append_element(object, 'activity:object-type', TagManager::TYPES[:activity])
|
||||||
|
append_element(object, 'activity:verb', TagManager::VERBS[:request_friend])
|
||||||
|
|
||||||
|
inner_object = author(follow_request.target_account)
|
||||||
|
inner_object.value = 'activity:object'
|
||||||
|
|
||||||
|
object << inner_object
|
||||||
|
entry << object
|
||||||
|
entry
|
||||||
|
end
|
||||||
|
|
||||||
|
def unfollow_salmon(follow)
|
||||||
|
entry = Ox::Element.new('entry')
|
||||||
|
add_namespaces(entry)
|
||||||
|
|
||||||
|
description = "#{follow.account.acct} is no longer following #{follow.target_account.acct}"
|
||||||
|
|
||||||
|
append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, follow.id, 'Follow'))
|
||||||
|
append_element(entry, 'title', description)
|
||||||
|
append_element(entry, 'content', description, type: :html)
|
||||||
|
|
||||||
|
entry << author(follow.account)
|
||||||
|
|
||||||
|
append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
|
||||||
|
append_element(entry, 'activity:verb', TagManager::VERBS[:unfollow])
|
||||||
|
|
||||||
|
object = author(follow.target_account)
|
||||||
|
object.value = 'activity:object'
|
||||||
|
|
||||||
|
entry << object
|
||||||
|
entry
|
||||||
|
end
|
||||||
|
|
||||||
|
def block_salmon(block)
|
||||||
|
entry = Ox::Element.new('entry')
|
||||||
|
add_namespaces(entry)
|
||||||
|
|
||||||
|
description = "#{block.account.acct} no longer wishes to interact with #{block.target_account.acct}"
|
||||||
|
|
||||||
|
append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, block.id, 'Block'))
|
||||||
|
append_element(entry, 'title', description)
|
||||||
|
|
||||||
|
entry << author(block.account)
|
||||||
|
|
||||||
|
append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
|
||||||
|
append_element(entry, 'activity:verb', TagManager::VERBS[:block])
|
||||||
|
|
||||||
|
object = author(block.target_account)
|
||||||
|
object.value = 'activity:object'
|
||||||
|
|
||||||
|
entry << object
|
||||||
|
entry
|
||||||
|
end
|
||||||
|
|
||||||
|
def unblock_salmon(block)
|
||||||
|
entry = Ox::Element.new('entry')
|
||||||
|
add_namespaces(entry)
|
||||||
|
|
||||||
|
description = "#{block.account.acct} no longer blocks #{block.target_account.acct}"
|
||||||
|
|
||||||
|
append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, block.id, 'Block'))
|
||||||
|
append_element(entry, 'title', description)
|
||||||
|
|
||||||
|
entry << author(block.account)
|
||||||
|
|
||||||
|
append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
|
||||||
|
append_element(entry, 'activity:verb', TagManager::VERBS[:unblock])
|
||||||
|
|
||||||
|
object = author(block.target_account)
|
||||||
|
object.value = 'activity:object'
|
||||||
|
|
||||||
|
entry << object
|
||||||
|
entry
|
||||||
|
end
|
||||||
|
|
||||||
|
def favourite_salmon(favourite)
|
||||||
|
entry = Ox::Element.new('entry')
|
||||||
|
add_namespaces(entry)
|
||||||
|
|
||||||
|
description = "#{favourite.account.acct} favourited a status by #{favourite.status.account.acct}"
|
||||||
|
|
||||||
|
append_element(entry, 'id', TagManager.instance.unique_tag(favourite.created_at, favourite.id, 'Favourite'))
|
||||||
|
append_element(entry, 'title', description)
|
||||||
|
append_element(entry, 'content', description, type: :html)
|
||||||
|
|
||||||
|
entry << author(favourite.account)
|
||||||
|
|
||||||
|
append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
|
||||||
|
append_element(entry, 'activity:verb', TagManager::VERBS[:favorite])
|
||||||
|
|
||||||
|
entry << object(favourite.status)
|
||||||
|
|
||||||
|
append_element(entry, 'thr:in-reply-to', nil, ref: TagManager.instance.uri_for(favourite.status), href: TagManager.instance.url_for(favourite.status))
|
||||||
|
|
||||||
|
entry
|
||||||
|
end
|
||||||
|
|
||||||
|
def unfavourite_salmon(favourite)
|
||||||
|
entry = Ox::Element.new('entry')
|
||||||
|
add_namespaces(entry)
|
||||||
|
|
||||||
|
description = "#{favourite.account.acct} no longer favourites a status by #{favourite.status.account.acct}"
|
||||||
|
|
||||||
|
append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, favourite.id, 'Favourite'))
|
||||||
|
append_element(entry, 'title', description)
|
||||||
|
append_element(entry, 'content', description, type: :html)
|
||||||
|
|
||||||
|
entry << author(favourite.account)
|
||||||
|
|
||||||
|
append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
|
||||||
|
append_element(entry, 'activity:verb', TagManager::VERBS[:unfavorite])
|
||||||
|
|
||||||
|
entry << object(favourite.status)
|
||||||
|
|
||||||
|
append_element(entry, 'thr:in-reply-to', nil, ref: TagManager.instance.uri_for(favourite.status), href: TagManager.instance.url_for(favourite.status))
|
||||||
|
|
||||||
|
entry
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def append_element(parent, name, content = nil, attributes = {})
|
||||||
|
element = Ox::Element.new(name)
|
||||||
|
attributes.each { |k, v| element[k] = v.to_s }
|
||||||
|
element << content.to_s unless content.nil?
|
||||||
|
parent << element
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_namespaces(parent)
|
||||||
|
parent['xmlns'] = TagManager::XMLNS
|
||||||
|
parent['xmlns:thr'] = TagManager::THR_XMLNS
|
||||||
|
parent['xmlns:activity'] = TagManager::AS_XMLNS
|
||||||
|
parent['xmlns:poco'] = TagManager::POCO_XMLNS
|
||||||
|
parent['xmlns:media'] = TagManager::MEDIA_XMLNS
|
||||||
|
parent['xmlns:ostatus'] = TagManager::OS_XMLNS
|
||||||
|
parent['xmlns:mastodon'] = TagManager::MTDN_XMLNS
|
||||||
|
end
|
||||||
|
|
||||||
|
def serialize_status_attributes(entry, status)
|
||||||
|
append_element(entry, 'summary', status.spoiler_text) unless status.spoiler_text.blank?
|
||||||
|
append_element(entry, 'content', Formatter.instance.format(status.proper).to_str, type: 'html')
|
||||||
|
|
||||||
|
status.mentions.each do |mentioned|
|
||||||
|
append_element(entry, 'link', nil, rel: :mentioned, 'ostatus:object-type': TagManager::TYPES[:person], href: TagManager.instance.uri_for(mentioned.account))
|
||||||
|
end
|
||||||
|
|
||||||
|
append_element(entry, 'link', nil, rel: :mentioned, 'ostatus:object-type': TagManager::TYPES[:collection], href: TagManager::COLLECTIONS[:public]) if status.public_visibility?
|
||||||
|
|
||||||
|
status.tags.each do |tag|
|
||||||
|
append_element(entry, 'category', nil, term: tag.name)
|
||||||
|
end
|
||||||
|
|
||||||
|
append_element(entry, 'category', nil, term: 'nsfw') if status.sensitive?
|
||||||
|
|
||||||
|
status.media_attachments.each do |media|
|
||||||
|
append_element(entry, 'link', nil, rel: :enclosure, type: media.file_content_type, length: media.file_file_size, href: full_asset_url(media.file.url(:original, false)))
|
||||||
|
end
|
||||||
|
|
||||||
|
append_element(entry, 'mastodon:scope', status.visibility)
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,13 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class InlineRenderer
|
||||||
|
def self.render(status, current_account, template)
|
||||||
|
Rabl::Renderer.new(
|
||||||
|
template,
|
||||||
|
status,
|
||||||
|
view_path: 'app/views',
|
||||||
|
format: :json,
|
||||||
|
scope: InlineRablScope.new(current_account)
|
||||||
|
).render
|
||||||
|
end
|
||||||
|
end
|
@ -1,27 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
Nokogiri::XML::Builder.new do |xml|
|
|
||||||
feed(xml) do
|
|
||||||
simple_id xml, account_url(@account, format: 'atom')
|
|
||||||
title xml, @account.display_name
|
|
||||||
subtitle xml, @account.note
|
|
||||||
updated_at xml, stream_updated_at
|
|
||||||
logo xml, full_asset_url(@account.avatar.url(:original))
|
|
||||||
|
|
||||||
author(xml) do
|
|
||||||
include_author xml, @account
|
|
||||||
end
|
|
||||||
|
|
||||||
link_alternate xml, TagManager.instance.url_for(@account)
|
|
||||||
link_self xml, account_url(@account, format: 'atom')
|
|
||||||
link_next xml, account_url(@account, format: 'atom', max_id: @entries.last.id) if @entries.size == 20
|
|
||||||
link_hub xml, api_push_url
|
|
||||||
link_salmon xml, api_salmon_url(@account.id)
|
|
||||||
|
|
||||||
@entries.each do |stream_entry|
|
|
||||||
entry(xml, false) do
|
|
||||||
include_entry xml, stream_entry
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end.to_xml
|
|
@ -1,9 +0,0 @@
|
|||||||
Nokogiri::XML::Builder.new do |xml|
|
|
||||||
entry(xml, true) do
|
|
||||||
author(xml) do
|
|
||||||
include_author xml, @stream_entry.account
|
|
||||||
end
|
|
||||||
|
|
||||||
include_entry xml, @stream_entry
|
|
||||||
end
|
|
||||||
end.to_xml
|
|
@ -0,0 +1,5 @@
|
|||||||
|
<p>Tervetuloa <%= @resource.email %>!</p>
|
||||||
|
|
||||||
|
<p>Voit vahvistaa Mastodon tilisi klikkaamalla alla olevaa linkkiä:</p>
|
||||||
|
|
||||||
|
<p><%= link_to 'Varmista tilini', confirmation_url(@resource, confirmation_token: @token) %></p>
|
@ -0,0 +1,5 @@
|
|||||||
|
Tervetuloa <%= @resource.email %>!
|
||||||
|
|
||||||
|
Voit vahvistaa Mastodon tilisi klikkaamalla alla olevaa linkkiä:
|
||||||
|
|
||||||
|
<%= confirmation_url(@resource, confirmation_token: @token) %>
|
@ -0,0 +1,3 @@
|
|||||||
|
<p>Hei <%= @resource.email %>!</p>
|
||||||
|
|
||||||
|
<p>Lähetämme tämän viestin ilmoittaaksemme että salasanasi on vaihdettu.</p>
|
@ -0,0 +1,3 @@
|
|||||||
|
Hei <%= @resource.email %>!
|
||||||
|
|
||||||
|
Lähetämme tämän viestin ilmoittaaksemme että salasanasi on vaihdettu.
|
@ -0,0 +1,8 @@
|
|||||||
|
<p>Hei <%= @resource.email %>!</p>
|
||||||
|
|
||||||
|
<p>Joku on pyytänyt salasanvaihto Mastodonissa. Voit tehdä sen allaolevassa linkissä.</p>
|
||||||
|
|
||||||
|
<p><%= link_to 'Vaihda salasanani', edit_password_url(@resource, reset_password_token: @token) %></p>
|
||||||
|
|
||||||
|
<p>Jos et pyytänyt vaihtoa, poista tämä viesti.</p>
|
||||||
|
<p>Salasanaasi ei vaihdeta ennen kuin menet ylläolevaan linkkiin ja luot uuden.</p>
|
@ -0,0 +1,8 @@
|
|||||||
|
Hei <%= @resource.email %>!
|
||||||
|
|
||||||
|
Joku on pyytänyt salasanvaihto Mastodonissa. Voit tehdä sen allaolevassa linkissä.
|
||||||
|
|
||||||
|
<%= edit_password_url(@resource, reset_password_token: @token) %>
|
||||||
|
|
||||||
|
Jos et pyytänyt vaihtoa, poista tämä viesti.
|
||||||
|
Salasanaasi ei vaihdeta ennen kuin menet ylläolevaan linkkiin ja luot uuden.
|
@ -0,0 +1,15 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class PushUpdateWorker
|
||||||
|
include Sidekiq::Worker
|
||||||
|
|
||||||
|
def perform(account_id, status_id)
|
||||||
|
account = Account.find(account_id)
|
||||||
|
status = Status.find(status_id)
|
||||||
|
message = InlineRenderer.render(status, account, 'api/v1/statuses/show')
|
||||||
|
|
||||||
|
Redis.current.publish("timeline:#{account.id}", Oj.dump(event: :update, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i))
|
||||||
|
rescue ActiveRecord::RecordNotFound
|
||||||
|
true
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,20 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class RemoteProfileUpdateWorker
|
||||||
|
include Sidekiq::Worker
|
||||||
|
|
||||||
|
sidekiq_options queue: 'pull'
|
||||||
|
|
||||||
|
def perform(account_id, body, resubscribe)
|
||||||
|
account = Account.find(account_id)
|
||||||
|
|
||||||
|
xml = Nokogiri::XML(body)
|
||||||
|
xml.encoding = 'utf-8'
|
||||||
|
|
||||||
|
author_container = xml.at_xpath('/xmlns:feed', xmlns: TagManager::XMLNS) || xml.at_xpath('/xmlns:entry', xmlns: TagManager::XMLNS)
|
||||||
|
|
||||||
|
UpdateRemoteProfileService.new.call(author_container, account, resubscribe)
|
||||||
|
rescue ActiveRecord::RecordNotFound
|
||||||
|
true
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,7 @@
|
|||||||
|
class AddNotificationsAndFavouritesIndices < ActiveRecord::Migration[5.0]
|
||||||
|
def change
|
||||||
|
add_index :notifications, [:activity_id, :activity_type]
|
||||||
|
add_index :accounts, :url
|
||||||
|
add_index :favourites, :status_id
|
||||||
|
end
|
||||||
|
end
|
@ -1,3 +1,3 @@
|
|||||||
Fabricator(:media_attachment) do
|
Fabricator(:media_attachment) do
|
||||||
|
account
|
||||||
end
|
end
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
Fabricator(:status) do
|
Fabricator(:status) do
|
||||||
|
account
|
||||||
text "Lorem ipsum dolor sit amet"
|
text "Lorem ipsum dolor sit amet"
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in new issue