Ensure we always set expiration timer
This commit is contained in:
parent
34afb98fcf
commit
61ad1231df
1 changed files with 46 additions and 108 deletions
154
ts/sql/Server.ts
154
ts/sql/Server.ts
|
@ -36,6 +36,7 @@ import { combineNames } from '../util/combineNames';
|
||||||
import { getExpiresAt } from '../services/MessageUpdater';
|
import { getExpiresAt } from '../services/MessageUpdater';
|
||||||
import { isNormalNumber } from '../util/isNormalNumber';
|
import { isNormalNumber } from '../util/isNormalNumber';
|
||||||
import { isNotNil } from '../util/isNotNil';
|
import { isNotNil } from '../util/isNotNil';
|
||||||
|
import * as iterables from '../util/iterables';
|
||||||
import { ConversationColorType, CustomColorType } from '../types/Colors';
|
import { ConversationColorType, CustomColorType } from '../types/Colors';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
@ -3267,73 +3268,6 @@ function getExpireData(
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateExpirationTimers(
|
|
||||||
conversationId: string,
|
|
||||||
newestUnreadId: number,
|
|
||||||
messagesWithExpireTimer: Map<
|
|
||||||
string,
|
|
||||||
{
|
|
||||||
id: string;
|
|
||||||
expireTimer: number;
|
|
||||||
}
|
|
||||||
>,
|
|
||||||
readAt?: number
|
|
||||||
) {
|
|
||||||
const db = getInstance();
|
|
||||||
|
|
||||||
const rowsWithSameExpireTimer = new Map();
|
|
||||||
for (const row of messagesWithExpireTimer.values()) {
|
|
||||||
const { expireTimer } = row;
|
|
||||||
const expireTimerRow = rowsWithSameExpireTimer.get(expireTimer);
|
|
||||||
|
|
||||||
if (expireTimerRow) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const { expirationStartTimestamp, expiresAt } = getExpireData(
|
|
||||||
expireTimer,
|
|
||||||
readAt
|
|
||||||
);
|
|
||||||
|
|
||||||
rowsWithSameExpireTimer.set(expireTimer, {
|
|
||||||
expirationStartTimestamp,
|
|
||||||
expireTimer,
|
|
||||||
expiresAt,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
rowsWithSameExpireTimer.forEach(
|
|
||||||
({ expirationStartTimestamp, expireTimer, expiresAt }) => {
|
|
||||||
db.prepare<Query>(
|
|
||||||
`
|
|
||||||
UPDATE messages
|
|
||||||
SET
|
|
||||||
unread = 0,
|
|
||||||
expires_at = $expiresAt,
|
|
||||||
expirationStartTimestamp = $expirationStartTimestamp,
|
|
||||||
json = json_patch(json, $jsonPatch)
|
|
||||||
WHERE
|
|
||||||
unread = 0 AND
|
|
||||||
conversationId = $conversationId AND
|
|
||||||
received_at <= $newestUnreadId AND
|
|
||||||
expireTimer = $expireTimer
|
|
||||||
`
|
|
||||||
).run({
|
|
||||||
conversationId,
|
|
||||||
expirationStartTimestamp,
|
|
||||||
expireTimer,
|
|
||||||
expiresAt,
|
|
||||||
jsonPatch: JSON.stringify({
|
|
||||||
expirationStartTimestamp,
|
|
||||||
expires_at: expiresAt,
|
|
||||||
unread: 0,
|
|
||||||
}),
|
|
||||||
newestUnreadId,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getUnreadCountForConversation(
|
async function getUnreadCountForConversation(
|
||||||
conversationId: string
|
conversationId: string
|
||||||
): Promise<number> {
|
): Promise<number> {
|
||||||
|
@ -3383,26 +3317,6 @@ async function getUnreadByConversationAndMarkRead(
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
const messagesWithExpireTimer: Map<
|
|
||||||
string,
|
|
||||||
{
|
|
||||||
id: string;
|
|
||||||
expireTimer: number;
|
|
||||||
}
|
|
||||||
> = new Map();
|
|
||||||
|
|
||||||
rows.forEach(row => {
|
|
||||||
if (
|
|
||||||
row.expireTimer &&
|
|
||||||
(!row.expirationStartTimestamp || !row.expires_at)
|
|
||||||
) {
|
|
||||||
messagesWithExpireTimer.set(row.id, {
|
|
||||||
id: row.id,
|
|
||||||
expireTimer: row.expireTimer,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
db.prepare<Query>(
|
db.prepare<Query>(
|
||||||
`
|
`
|
||||||
UPDATE messages
|
UPDATE messages
|
||||||
|
@ -3421,34 +3335,58 @@ async function getUnreadByConversationAndMarkRead(
|
||||||
unread: 1,
|
unread: 1,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (messagesWithExpireTimer.size) {
|
const rowsWithExpireTimers = iterables.filter(rows, row => row.expireTimer);
|
||||||
updateExpirationTimers(
|
const rowsNeedingExpirationUpdates = iterables.filter(
|
||||||
conversationId,
|
rowsWithExpireTimers,
|
||||||
newestUnreadId,
|
row =>
|
||||||
messagesWithExpireTimer,
|
!row.expirationStartTimestamp ||
|
||||||
readAt
|
!row.expires_at ||
|
||||||
);
|
getExpireData(row.expireTimer, readAt).expirationStartTimestamp <
|
||||||
|
row.expirationStartTimestamp
|
||||||
|
);
|
||||||
|
const expirationStartTimestampUpdates: Iterable<{
|
||||||
|
id: string;
|
||||||
|
expirationStartTimestamp: number;
|
||||||
|
expiresAt: number;
|
||||||
|
}> = iterables.map(rowsNeedingExpirationUpdates, row => ({
|
||||||
|
id: row.id,
|
||||||
|
...getExpireData(row.expireTimer, readAt),
|
||||||
|
}));
|
||||||
|
const stmt = db.prepare<Query>(
|
||||||
|
`
|
||||||
|
UPDATE messages
|
||||||
|
SET
|
||||||
|
expirationStartTimestamp = $expirationStartTimestamp,
|
||||||
|
expires_at = $expiresAt
|
||||||
|
WHERE
|
||||||
|
id = $id;
|
||||||
|
`
|
||||||
|
);
|
||||||
|
const updatedExpireDataByRowId = new Map<
|
||||||
|
string,
|
||||||
|
{
|
||||||
|
expirationStartTimestamp: number;
|
||||||
|
expiresAt: number;
|
||||||
|
}
|
||||||
|
>();
|
||||||
|
for (const update of expirationStartTimestampUpdates) {
|
||||||
|
stmt.run(update);
|
||||||
|
updatedExpireDataByRowId.set(update.id, update);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rows.map(row => {
|
return rows.map(row => {
|
||||||
const json = jsonToObject(row.json);
|
const json = jsonToObject(row.json);
|
||||||
const expireAttrs = {};
|
const updatedExpireData = updatedExpireDataByRowId.get(row.id);
|
||||||
const expiringMessage = messagesWithExpireTimer.get(row.id);
|
|
||||||
if (expiringMessage) {
|
|
||||||
const { expirationStartTimestamp, expiresAt } = getExpireData(
|
|
||||||
expiringMessage.expireTimer,
|
|
||||||
readAt
|
|
||||||
);
|
|
||||||
Object.assign(expireAttrs, {
|
|
||||||
expirationStartTimestamp,
|
|
||||||
expires_at: expiresAt,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
unread: false,
|
unread: false,
|
||||||
...pick(json, ['id', 'sent_at', 'source', 'sourceUuid', 'type']),
|
...pick(json, ['id', 'sent_at', 'source', 'sourceUuid', 'type']),
|
||||||
...expireAttrs,
|
...(updatedExpireData
|
||||||
|
? {
|
||||||
|
expirationStartTimestamp:
|
||||||
|
updatedExpireData.expirationStartTimestamp,
|
||||||
|
expires_at: updatedExpireData.expiresAt,
|
||||||
|
}
|
||||||
|
: {}),
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
})();
|
})();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue