Assert presence of sent_at timestamp for receipts

This commit is contained in:
Fedor Indutny 2023-05-11 09:04:17 -07:00 committed by GitHub
parent 9a7f1e86e2
commit 9d1252ae19
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,7 +1,7 @@
// Copyright 2021 Signal Messenger, LLC // Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only // SPDX-License-Identifier: AGPL-3.0-only
import { omit } from 'lodash'; import { omit, isNumber } from 'lodash';
import type { ConversationAttributesType } from '../model-types.d'; import type { ConversationAttributesType } from '../model-types.d';
import { hasErrors } from '../state/selectors/message'; import { hasErrors } from '../state/selectors/message';
@ -13,6 +13,8 @@ import { isGroup, isDirectConversation } from './whatTypeOfConversation';
import * as log from '../logging/log'; import * as log from '../logging/log';
import { getConversationIdForLogging } from './idForLogging'; import { getConversationIdForLogging } from './idForLogging';
import { drop } from './drop'; import { drop } from './drop';
import { isNotNil } from './isNotNil';
import { assertDev } from './assert';
import { isConversationAccepted } from './isConversationAccepted'; import { isConversationAccepted } from './isConversationAccepted';
import { ReadStatus } from '../messages/MessageReadStatus'; import { ReadStatus } from '../messages/MessageReadStatus';
import { import {
@ -52,8 +54,10 @@ export async function markConversationRead(
}), }),
]); ]);
log.info('markConversationRead', { const convoId = getConversationIdForLogging(conversationAttrs);
conversationId: getConversationIdForLogging(conversationAttrs), const logId = `markConversationRead(${convoId})`;
log.info(logId, {
newestSentAt: options.newestSentAt, newestSentAt: options.newestSentAt,
newestUnreadAt, newestUnreadAt,
unreadMessages: unreadMessages.length, unreadMessages: unreadMessages.length,
@ -94,29 +98,46 @@ export async function markConversationRead(
const allUnreadMessages = [...unreadMessages, ...unreadEditedMessages]; const allUnreadMessages = [...unreadMessages, ...unreadEditedMessages];
const allReadMessagesSync = allUnreadMessages.map(messageSyncData => { const allReadMessagesSync = allUnreadMessages
const message = window.MessageController.getById(messageSyncData.id); .map(messageSyncData => {
// we update the in-memory MessageModel with the fresh database call data const message = window.MessageController.getById(messageSyncData.id);
if (message) { // we update the in-memory MessageModel with the fresh database call data
message.set(omit(messageSyncData, 'originalReadStatus')); if (message) {
} message.set(omit(messageSyncData, 'originalReadStatus'));
}
return { const {
messageId: messageSyncData.id, sent_at: timestamp,
conversationId: conversationAttrs.id, source: senderE164,
originalReadStatus: messageSyncData.originalReadStatus, sourceUuid: senderUuid,
senderE164: messageSyncData.source, } = messageSyncData;
senderUuid: messageSyncData.sourceUuid,
senderId: window.ConversationController.lookupOrCreate({ if (!isNumber(timestamp)) {
e164: messageSyncData.source, assertDev(
uuid: messageSyncData.sourceUuid, false,
reason: 'markConversationRead', `${logId}: message sent_at timestamp is not number` +
})?.id, `type=${messageSyncData.type}`
timestamp: messageSyncData.sent_at, );
isDirectConversation: isDirectConversation(conversationAttrs), return undefined;
hasErrors: message ? hasErrors(message.attributes) : false, }
};
}); return {
messageId: messageSyncData.id,
conversationId: conversationAttrs.id,
originalReadStatus: messageSyncData.originalReadStatus,
senderE164,
senderUuid,
senderId: window.ConversationController.lookupOrCreate({
e164: senderE164,
uuid: senderUuid,
reason: 'markConversationRead',
})?.id,
timestamp,
isDirectConversation: isDirectConversation(conversationAttrs),
hasErrors: message ? hasErrors(message.attributes) : false,
};
})
.filter(isNotNil);
// Some messages we're marking read are local notifications with no sender or were just // Some messages we're marking read are local notifications with no sender or were just
// unseen and not unread. // unseen and not unread.