Conflicts: - `streaming/index.js`: Filtering code for streaming notifications has been refactored upstream, but glitch-soc had similar code for local-only toots in the same places. Ported upstream changes, but did not refactor local-only filtering.main
commit
3622110778
@ -0,0 +1,15 @@
|
|||||||
|
import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from '../actions/importer';
|
||||||
|
import { Map as ImmutableMap } from 'immutable';
|
||||||
|
|
||||||
|
const initialState = ImmutableMap();
|
||||||
|
|
||||||
|
export default function accountsMap(state = initialState, action) {
|
||||||
|
switch(action.type) {
|
||||||
|
case ACCOUNT_IMPORT:
|
||||||
|
return state.set(action.account.acct, action.account.id);
|
||||||
|
case ACCOUNTS_IMPORT:
|
||||||
|
return state.withMutations(map => action.accounts.forEach(account => map.set(account.acct, account.id)));
|
||||||
|
default:
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,63 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class PermalinkRedirector
|
||||||
|
include RoutingHelper
|
||||||
|
|
||||||
|
def initialize(path)
|
||||||
|
@path = path
|
||||||
|
end
|
||||||
|
|
||||||
|
def redirect_path
|
||||||
|
if path_segments[0] == 'web'
|
||||||
|
if path_segments[1].present? && path_segments[1].start_with?('@') && path_segments[2] =~ /\d/
|
||||||
|
find_status_url_by_id(path_segments[2])
|
||||||
|
elsif path_segments[1].present? && path_segments[1].start_with?('@')
|
||||||
|
find_account_url_by_name(path_segments[1])
|
||||||
|
elsif path_segments[1] == 'statuses' && path_segments[2] =~ /\d/
|
||||||
|
find_status_url_by_id(path_segments[2])
|
||||||
|
elsif path_segments[1] == 'accounts' && path_segments[2] =~ /\d/
|
||||||
|
find_account_url_by_id(path_segments[2])
|
||||||
|
elsif path_segments[1] == 'timelines' && path_segments[2] == 'tag' && path_segments[3].present?
|
||||||
|
find_tag_url_by_name(path_segments[3])
|
||||||
|
elsif path_segments[1] == 'tags' && path_segments[2].present?
|
||||||
|
find_tag_url_by_name(path_segments[2])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def path_segments
|
||||||
|
@path_segments ||= @path.gsub(/\A\//, '').split('/')
|
||||||
|
end
|
||||||
|
|
||||||
|
def find_status_url_by_id(id)
|
||||||
|
status = Status.find_by(id: id)
|
||||||
|
|
||||||
|
return unless status&.distributable?
|
||||||
|
|
||||||
|
ActivityPub::TagManager.instance.url_for(status)
|
||||||
|
end
|
||||||
|
|
||||||
|
def find_account_url_by_id(id)
|
||||||
|
account = Account.find_by(id: id)
|
||||||
|
|
||||||
|
return unless account
|
||||||
|
|
||||||
|
ActivityPub::TagManager.instance.url_for(account)
|
||||||
|
end
|
||||||
|
|
||||||
|
def find_account_url_by_name(name)
|
||||||
|
username, domain = name.gsub(/\A@/, '').split('@')
|
||||||
|
domain = nil if TagManager.instance.local_domain?(domain)
|
||||||
|
account = Account.find_remote(username, domain)
|
||||||
|
|
||||||
|
return unless account
|
||||||
|
|
||||||
|
ActivityPub::TagManager.instance.url_for(account)
|
||||||
|
end
|
||||||
|
|
||||||
|
def find_tag_url_by_name(name)
|
||||||
|
tag_path(CGI.unescape(name))
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,42 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe PermalinkRedirector do
|
||||||
|
describe '#redirect_url' do
|
||||||
|
before do
|
||||||
|
account = Fabricate(:account, username: 'alice', id: 1)
|
||||||
|
Fabricate(:status, account: account, id: 123)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns path for legacy account links' do
|
||||||
|
redirector = described_class.new('web/accounts/1')
|
||||||
|
expect(redirector.redirect_path).to eq 'https://cb6e6126.ngrok.io/@alice'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns path for legacy status links' do
|
||||||
|
redirector = described_class.new('web/statuses/123')
|
||||||
|
expect(redirector.redirect_path).to eq 'https://cb6e6126.ngrok.io/@alice/123'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns path for legacy tag links' do
|
||||||
|
redirector = described_class.new('web/timelines/tag/hoge')
|
||||||
|
expect(redirector.redirect_path).to eq '/tags/hoge'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns path for pretty account links' do
|
||||||
|
redirector = described_class.new('web/@alice')
|
||||||
|
expect(redirector.redirect_path).to eq 'https://cb6e6126.ngrok.io/@alice'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns path for pretty status links' do
|
||||||
|
redirector = described_class.new('web/@alice/123')
|
||||||
|
expect(redirector.redirect_path).to eq 'https://cb6e6126.ngrok.io/@alice/123'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns path for pretty tag links' do
|
||||||
|
redirector = described_class.new('web/tags/hoge')
|
||||||
|
expect(redirector.redirect_path).to eq '/tags/hoge'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in new issue