More defensive status normalization

improve-ci
Alex Gleason 2022-02-23 22:11:40 -05:00
rodzic cd6d575ae9
commit 02f05abeaa
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 7211D1F99744FBB7
3 zmienionych plików z 39 dodań i 19 usunięć

Wyświetl plik

@ -1,4 +1,4 @@
import { fromJS } from 'immutable';
import { Map as ImmutableMap } from 'immutable';
import { normalizeStatus } from 'soapbox/normalizers/status';
import { calculateStatus } from 'soapbox/reducers/statuses';
@ -11,7 +11,7 @@ export const buildStatus = (state, scheduledStatus) => {
const params = scheduledStatus.get('params');
const account = getAccount(state, me);
const status = {
const status = ImmutableMap({
account,
content: params.get('text', '').replace(new RegExp('\n', 'g'), '<br>'), /* eslint-disable-line no-control-regex */
created_at: params.get('scheduled_at'),
@ -23,7 +23,7 @@ export const buildStatus = (state, scheduledStatus) => {
uri: `/scheduled_statuses/${scheduledStatus.get('id')}`,
url: `/scheduled_statuses/${scheduledStatus.get('id')}`,
visibility: params.get('visibility'),
};
});
return calculateStatus(normalizeStatus(fromJS(status)));
return calculateStatus(normalizeStatus(status));
};

Wyświetl plik

@ -1,4 +1,4 @@
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
import { normalizeStatus } from 'soapbox/normalizers/status';
import { calculateStatus } from 'soapbox/reducers/statuses';
@ -6,11 +6,11 @@ import { makeGetAccount } from 'soapbox/selectors';
const getAccount = makeGetAccount();
const getMentions = pendingStatus => {
const buildMentions = pendingStatus => {
if (pendingStatus.get('in_reply_to_id')) {
return ImmutableList(pendingStatus.get('to') || []).map(mention => ImmutableMap({
username: mention.split('@')[0],
acct: mention,
return ImmutableList(pendingStatus.get('to') || []).map(acct => ImmutableMap({
acct,
username: acct.split('@')[0],
}));
} else {
return ImmutableList();
@ -22,19 +22,19 @@ export const buildStatus = (state, pendingStatus, idempotencyKey) => {
const account = getAccount(state, me);
const inReplyToId = pendingStatus.get('in_reply_to_id');
const status = {
const status = ImmutableMap({
account,
content: pendingStatus.get('status', '').replace(new RegExp('\n', 'g'), '<br>'), /* eslint-disable-line no-control-regex */
id: `末pending-${idempotencyKey}`,
in_reply_to_account_id: state.getIn(['statuses', inReplyToId, 'account'], null),
in_reply_to_id: inReplyToId,
media_attachments: pendingStatus.get('media_ids', ImmutableList()).map(id => ImmutableMap({ id })),
mentions: getMentions(pendingStatus),
mentions: buildMentions(pendingStatus),
poll: pendingStatus.get('poll', null),
quote: pendingStatus.get('quote_id', null),
sensitive: pendingStatus.get('sensitive', false),
visibility: pendingStatus.get('visibility', 'public'),
};
});
return calculateStatus(normalizeStatus(fromJS(status)));
return calculateStatus(normalizeStatus(status));
};

Wyświetl plik

@ -28,8 +28,10 @@ const baseStatus = ImmutableMap({
visibility: 'public',
});
// Merger function for only overriding undefined values
const mergeDefined = (oldVal, newVal) => oldVal === undefined ? newVal : oldVal;
// Merge base status
const setRequiredFields = status => {
return status.mergeDeepWith(mergeDefined, baseStatus);
};
@ -49,7 +51,7 @@ const normalizeAttachment = attachment => {
remote_url: url,
});
return attachment.mergeWith((o, n) => o || n, base);
return attachment.mergeWith(mergeDefined, base);
};
const normalizeAttachments = status => {
@ -58,9 +60,26 @@ const normalizeAttachments = status => {
});
};
// Normalize mentions
const normalizeMention = mention => {
const base = ImmutableMap({
acct: '',
username: (mention.get('acct') || '').split('@')[0],
url: '',
});
return mention.mergeWith(mergeDefined, base);
};
const normalizeMentions = status => {
return status.update('mentions', ImmutableList(), mentions => {
return mentions.map(normalizeMention);
});
};
// Fix order of mentions
const fixMentions = status => {
const mentions = status.get('mentions');
const fixMentionsOrder = status => {
const mentions = status.get('mentions', ImmutableList());
const inReplyToAccountId = status.get('in_reply_to_account_id');
// Sort the replied-to mention to the top
@ -103,9 +122,10 @@ const fixQuote = status => {
export const normalizeStatus = status => {
return status.withMutations(status => {
setRequiredFields(status);
fixMentions(status);
fixQuote(status);
addSelfMention(status);
normalizeAttachments(status);
normalizeMentions(status);
fixMentionsOrder(status);
addSelfMention(status);
fixQuote(status);
});
};