#29 Add personal limited_scope
This commit is contained in:
parent
b70576df15
commit
002c4bfe74
8 changed files with 39 additions and 2 deletions
|
@ -73,6 +73,7 @@ const messages = defineMessages({
|
||||||
limited_short: { id: 'privacy.limited.short', defaultMessage: 'Limited menbers only' },
|
limited_short: { id: 'privacy.limited.short', defaultMessage: 'Limited menbers only' },
|
||||||
mutual_short: { id: 'privacy.mutual.short', defaultMessage: 'Mutual followers only' },
|
mutual_short: { id: 'privacy.mutual.short', defaultMessage: 'Mutual followers only' },
|
||||||
circle_short: { id: 'privacy.circle.short', defaultMessage: 'Circle members only' },
|
circle_short: { id: 'privacy.circle.short', defaultMessage: 'Circle members only' },
|
||||||
|
personal_short: { id: 'privacy.personal.short', defaultMessage: 'Yourself only' },
|
||||||
direct_short: { id: 'privacy.direct.short', defaultMessage: 'Mentioned people only' },
|
direct_short: { id: 'privacy.direct.short', defaultMessage: 'Mentioned people only' },
|
||||||
edited: { id: 'status.edited', defaultMessage: 'Edited {date}' },
|
edited: { id: 'status.edited', defaultMessage: 'Edited {date}' },
|
||||||
});
|
});
|
||||||
|
@ -405,6 +406,7 @@ class Status extends ImmutablePureComponent {
|
||||||
'limited': { icon: 'get-pocket', text: intl.formatMessage(messages.limited_short) },
|
'limited': { icon: 'get-pocket', text: intl.formatMessage(messages.limited_short) },
|
||||||
'mutual': { icon: 'exchange', text: intl.formatMessage(messages.mutual_short) },
|
'mutual': { icon: 'exchange', text: intl.formatMessage(messages.mutual_short) },
|
||||||
'circle': { icon: 'user-circle', text: intl.formatMessage(messages.circle_short) },
|
'circle': { icon: 'user-circle', text: intl.formatMessage(messages.circle_short) },
|
||||||
|
'personal': { icon: 'sticky-note-o', text: intl.formatMessage(messages.personal_short) },
|
||||||
'direct': { icon: 'at', text: intl.formatMessage(messages.direct_short) },
|
'direct': { icon: 'at', text: intl.formatMessage(messages.direct_short) },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ const messages = defineMessages({
|
||||||
limited_short: { id: 'privacy.limited.short', defaultMessage: 'Limited menbers only' },
|
limited_short: { id: 'privacy.limited.short', defaultMessage: 'Limited menbers only' },
|
||||||
mutual_short: { id: 'privacy.mutual.short', defaultMessage: 'Mutual followers only' },
|
mutual_short: { id: 'privacy.mutual.short', defaultMessage: 'Mutual followers only' },
|
||||||
circle_short: { id: 'privacy.circle.short', defaultMessage: 'Circle members only' },
|
circle_short: { id: 'privacy.circle.short', defaultMessage: 'Circle members only' },
|
||||||
|
personal_short: { id: 'privacy.personal.short', defaultMessage: 'Yourself only' },
|
||||||
direct_short: { id: 'privacy.direct.short', defaultMessage: 'Mentioned people only' },
|
direct_short: { id: 'privacy.direct.short', defaultMessage: 'Mentioned people only' },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -57,6 +58,7 @@ class StatusCheckBox extends PureComponent {
|
||||||
'limited': { icon: 'get-pocket', text: intl.formatMessage(messages.limited_short) },
|
'limited': { icon: 'get-pocket', text: intl.formatMessage(messages.limited_short) },
|
||||||
'mutual': { icon: 'exchange', text: intl.formatMessage(messages.mutual_short) },
|
'mutual': { icon: 'exchange', text: intl.formatMessage(messages.mutual_short) },
|
||||||
'circle': { icon: 'user-circle', text: intl.formatMessage(messages.circle_short) },
|
'circle': { icon: 'user-circle', text: intl.formatMessage(messages.circle_short) },
|
||||||
|
'personal': { icon: 'sticky-note-o', text: intl.formatMessage(messages.personal_short) },
|
||||||
'direct': { icon: 'at', text: intl.formatMessage(messages.direct_short) },
|
'direct': { icon: 'at', text: intl.formatMessage(messages.direct_short) },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@ const messages = defineMessages({
|
||||||
limited_short: { id: 'privacy.limited.short', defaultMessage: 'Limited menbers only' },
|
limited_short: { id: 'privacy.limited.short', defaultMessage: 'Limited menbers only' },
|
||||||
mutual_short: { id: 'privacy.mutual.short', defaultMessage: 'Mutual followers only' },
|
mutual_short: { id: 'privacy.mutual.short', defaultMessage: 'Mutual followers only' },
|
||||||
circle_short: { id: 'privacy.circle.short', defaultMessage: 'Circle members only' },
|
circle_short: { id: 'privacy.circle.short', defaultMessage: 'Circle members only' },
|
||||||
|
personal_short: { id: 'privacy.personal.short', defaultMessage: 'Yourself only' },
|
||||||
direct_short: { id: 'privacy.direct.short', defaultMessage: 'Mentioned people only' },
|
direct_short: { id: 'privacy.direct.short', defaultMessage: 'Mentioned people only' },
|
||||||
searchability_public_short: { id: 'searchability.public.short', defaultMessage: 'Public' },
|
searchability_public_short: { id: 'searchability.public.short', defaultMessage: 'Public' },
|
||||||
searchability_private_short: { id: 'searchability.unlisted.short', defaultMessage: 'Followers' },
|
searchability_private_short: { id: 'searchability.unlisted.short', defaultMessage: 'Followers' },
|
||||||
|
@ -260,6 +261,7 @@ class DetailedStatus extends ImmutablePureComponent {
|
||||||
'limited': { icon: 'get-pocket', text: intl.formatMessage(messages.limited_short) },
|
'limited': { icon: 'get-pocket', text: intl.formatMessage(messages.limited_short) },
|
||||||
'mutual': { icon: 'exchange', text: intl.formatMessage(messages.mutual_short) },
|
'mutual': { icon: 'exchange', text: intl.formatMessage(messages.mutual_short) },
|
||||||
'circle': { icon: 'user-circle', text: intl.formatMessage(messages.circle_short) },
|
'circle': { icon: 'user-circle', text: intl.formatMessage(messages.circle_short) },
|
||||||
|
'personal': { icon: 'sticky-note-o', text: intl.formatMessage(messages.personal_short) },
|
||||||
'direct': { icon: 'at', text: intl.formatMessage(messages.direct_short) },
|
'direct': { icon: 'at', text: intl.formatMessage(messages.direct_short) },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ const messages = defineMessages({
|
||||||
limited_short: { id: 'privacy.limited.short', defaultMessage: 'Limited menbers only' },
|
limited_short: { id: 'privacy.limited.short', defaultMessage: 'Limited menbers only' },
|
||||||
mutual_short: { id: 'privacy.mutual.short', defaultMessage: 'Mutual followers only' },
|
mutual_short: { id: 'privacy.mutual.short', defaultMessage: 'Mutual followers only' },
|
||||||
circle_short: { id: 'privacy.circle.short', defaultMessage: 'Circle members only' },
|
circle_short: { id: 'privacy.circle.short', defaultMessage: 'Circle members only' },
|
||||||
|
personal_short: { id: 'privacy.personal.short', defaultMessage: 'Yourself only' },
|
||||||
direct_short: { id: 'privacy.direct.short', defaultMessage: 'Mentioned people only' },
|
direct_short: { id: 'privacy.direct.short', defaultMessage: 'Mentioned people only' },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -100,6 +101,7 @@ class BoostModal extends ImmutablePureComponent {
|
||||||
'limited': { icon: 'get-pocket', text: intl.formatMessage(messages.limited_short) },
|
'limited': { icon: 'get-pocket', text: intl.formatMessage(messages.limited_short) },
|
||||||
'mutual': { icon: 'exchange', text: intl.formatMessage(messages.mutual_short) },
|
'mutual': { icon: 'exchange', text: intl.formatMessage(messages.mutual_short) },
|
||||||
'circle': { icon: 'user-circle', text: intl.formatMessage(messages.circle_short) },
|
'circle': { icon: 'user-circle', text: intl.formatMessage(messages.circle_short) },
|
||||||
|
'personal': { icon: 'sticky-note-o', text: intl.formatMessage(messages.personal_short) },
|
||||||
'direct': { icon: 'at', text: intl.formatMessage(messages.direct_short) },
|
'direct': { icon: 'at', text: intl.formatMessage(messages.direct_short) },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ class Status < ApplicationRecord
|
||||||
|
|
||||||
enum visibility: { public: 0, unlisted: 1, private: 2, direct: 3, limited: 4, public_unlisted: 10, login: 11 }, _suffix: :visibility
|
enum visibility: { public: 0, unlisted: 1, private: 2, direct: 3, limited: 4, public_unlisted: 10, login: 11 }, _suffix: :visibility
|
||||||
enum searchability: { public: 0, private: 1, direct: 2, limited: 3, unsupported: 4, public_unlisted: 10 }, _suffix: :searchability
|
enum searchability: { public: 0, private: 1, direct: 2, limited: 3, unsupported: 4, public_unlisted: 10 }, _suffix: :searchability
|
||||||
enum limited_scope: { none: 0, mutual: 1, circle: 2 }, _suffix: :limited
|
enum limited_scope: { none: 0, mutual: 1, circle: 2, personal: 3 }, _suffix: :limited
|
||||||
|
|
||||||
belongs_to :application, class_name: 'Doorkeeper::Application', optional: true
|
belongs_to :application, class_name: 'Doorkeeper::Application', optional: true
|
||||||
|
|
||||||
|
|
|
@ -145,6 +145,8 @@ class PostStatusService < BaseService
|
||||||
process_mentions_service.call(@status, limited_type: @status.limited_visibility? ? @limited_scope : '', circle: @circle, save_records: false)
|
process_mentions_service.call(@status, limited_type: @status.limited_visibility? ? @limited_scope : '', circle: @circle, save_records: false)
|
||||||
safeguard_mentions!(@status)
|
safeguard_mentions!(@status)
|
||||||
|
|
||||||
|
@status.limited_scope = :personal if @status.limited_visibility? && !process_mentions_service.mentions?
|
||||||
|
|
||||||
UpdateStatusExpirationService.new.call(@status)
|
UpdateStatusExpirationService.new.call(@status)
|
||||||
|
|
||||||
# The following transaction block is needed to wrap the UPDATEs to
|
# The following transaction block is needed to wrap the UPDATEs to
|
||||||
|
@ -221,7 +223,7 @@ class PostStatusService < BaseService
|
||||||
end
|
end
|
||||||
|
|
||||||
def process_mentions_service
|
def process_mentions_service
|
||||||
ProcessMentionsService.new
|
@process_mentions_service ||= ProcessMentionsService.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def process_hashtags_service
|
def process_hashtags_service
|
||||||
|
|
|
@ -24,6 +24,10 @@ class ProcessMentionsService < BaseService
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def mentions?
|
||||||
|
@current_mentions.present?
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def scan_text!
|
def scan_text!
|
||||||
|
|
|
@ -188,6 +188,17 @@ RSpec.describe PostStatusService, type: :service do
|
||||||
expect(status.mentioned_accounts.first.id).to eq mutual_account.id
|
expect(status.mentioned_accounts.first.id).to eq mutual_account.id
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'personal visibility with mutual' do
|
||||||
|
account = Fabricate(:account)
|
||||||
|
text = 'This is an English text.'
|
||||||
|
|
||||||
|
status = subject.call(account, text: text, visibility: 'mutual')
|
||||||
|
|
||||||
|
expect(status.visibility).to eq 'limited'
|
||||||
|
expect(status.limited_scope).to eq 'personal'
|
||||||
|
expect(status.mentioned_accounts.count).to eq 0
|
||||||
|
end
|
||||||
|
|
||||||
it 'circle visibility' do
|
it 'circle visibility' do
|
||||||
account = Fabricate(:account)
|
account = Fabricate(:account)
|
||||||
circle_account = Fabricate(:account)
|
circle_account = Fabricate(:account)
|
||||||
|
@ -227,6 +238,18 @@ RSpec.describe PostStatusService, type: :service do
|
||||||
expect { subject.call(account, text: text, visibility: 'limited') }.to raise_exception ActiveRecord::RecordInvalid
|
expect { subject.call(account, text: text, visibility: 'limited') }.to raise_exception ActiveRecord::RecordInvalid
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'personal visibility with circle' do
|
||||||
|
account = Fabricate(:account)
|
||||||
|
circle = Fabricate(:circle, account: account)
|
||||||
|
text = 'This is an English text.'
|
||||||
|
|
||||||
|
status = subject.call(account, text: text, visibility: 'circle', circle_id: circle.id)
|
||||||
|
|
||||||
|
expect(status.visibility).to eq 'limited'
|
||||||
|
expect(status.limited_scope).to eq 'personal'
|
||||||
|
expect(status.mentioned_accounts.count).to eq 0
|
||||||
|
end
|
||||||
|
|
||||||
it 'safeguards mentions' do
|
it 'safeguards mentions' do
|
||||||
account = Fabricate(:account)
|
account = Fabricate(:account)
|
||||||
mentioned_account = Fabricate(:account, username: 'alice')
|
mentioned_account = Fabricate(:account, username: 'alice')
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue