fix an edge case where there is no expiration info for messages already expired

This commit is contained in:
Ryan ZHAO 2023-12-12 13:51:12 +11:00
parent 0aa32bcab3
commit 2fc021c48c
1 changed files with 18 additions and 4 deletions

View File

@ -72,7 +72,7 @@ public enum GetExpirationJob: JobExecutor {
result[next.key] = TimeInterval(next.value - UInt64(expiresInSeconds * 1000))
}
let hashesToUseDefault: Set<String> = Set(expirationInfo.keys)
var hashesWithNoExiprationInfo: Set<String> = Set(expirationInfo.keys)
.subtracting(serverSpecifiedExpirationStartTimesMs.keys)
dependencies.storage.write(using: dependencies) { db in
@ -85,10 +85,24 @@ public enum GetExpirationJob: JobExecutor {
)
}
// FIXME: If currentTimestampMs - messageSentTimestampMs > expirationTimer, the message might already be expired and removed directly
let inferredExpiredMessageHashes: Set<String> = (try? Interaction
.select(Interaction.Columns.serverHash)
.filter(hashesWithNoExiprationInfo.contains(Interaction.Columns.serverHash))
.filter(Interaction.Columns.timestampMs + (Interaction.Columns.expiresInSeconds * 1000) <= details.startedAtTimestampMs)
.asRequest(of: String.self)
.fetchSet(db))
.defaulting(to: [])
hashesWithNoExiprationInfo = hashesWithNoExiprationInfo.subtracting(inferredExpiredMessageHashes)
if !inferredExpiredMessageHashes.isEmpty {
try Interaction
.filter(inferredExpiredMessageHashes.contains(Interaction.Columns.serverHash))
.deleteAll(db)
}
try Interaction
.filter(hashesToUseDefault.contains(Interaction.Columns.serverHash))
.filter(hashesWithNoExiprationInfo.contains(Interaction.Columns.serverHash))
.filter(Interaction.Columns.expiresStartedAtMs == nil)
.updateAll(
db,
@ -104,7 +118,7 @@ public enum GetExpirationJob: JobExecutor {
)
}
guard hashesToUseDefault.isEmpty else {
guard hashesWithNoExiprationInfo.isEmpty else {
let updatedJob: Job? = dependencies.storage.write(using: dependencies) { db in
try job
.with(nextRunTimestamp: dependencies.dateNow.timeIntervalSince1970 + minRunFrequency)