Fixed a couple more bugs with link previews

Fixed an issue where sending a link with a preview wouldn't work if you have a previous "failed" preview for the same link
Fixed an issue where receiving a link with a preview could update all existing previews to an invalid state
This commit is contained in:
Morgan Pretty 2023-09-19 15:40:58 +10:00
parent 5f25abc213
commit f92579db07
3 changed files with 30 additions and 15 deletions

View File

@ -532,16 +532,34 @@ extension ConversationVC:
let insertedInteraction: Interaction = try optimisticData.interaction.inserted(db)
self?.viewModel.associate(optimisticMessageId: optimisticData.id, to: insertedInteraction.id)
// If there is a LinkPreview and it doesn't match an existing one then add it now
if
let linkPreviewDraft: LinkPreviewDraft = optimisticData.linkPreviewDraft,
(try? insertedInteraction.linkPreview.isEmpty(db)) == true
{
try LinkPreview(
url: linkPreviewDraft.urlString,
title: linkPreviewDraft.title,
attachmentId: try optimisticData.linkPreviewAttachment?.inserted(db).id
).insert(db)
// If there is a LinkPreview draft then check the state of any existing link previews and
// insert a new one if needed
if let linkPreviewDraft: LinkPreviewDraft = optimisticData.linkPreviewDraft {
let invalidLinkPreviewAttachmentStates: [Attachment.State] = [
.failedDownload, .pendingDownload, .downloading, .failedUpload, .invalid
]
let linkPreviewAttachmentId: String? = try? insertedInteraction.linkPreview
.select(.attachmentId)
.asRequest(of: String.self)
.fetchOne(db)
let linkPreviewAttachmentState: Attachment.State = linkPreviewAttachmentId
.map {
try? Attachment
.filter(id: $0)
.select(.state)
.asRequest(of: Attachment.State.self)
.fetchOne(db)
}
.defaulting(to: .invalid)
// If we don't have a "valid" existing link preview then upsert a new one
if invalidLinkPreviewAttachmentStates.contains(linkPreviewAttachmentState) {
try LinkPreview(
url: linkPreviewDraft.urlString,
title: linkPreviewDraft.title,
attachmentId: try optimisticData.linkPreviewAttachment?.inserted(db).id
).save(db)
}
}
// If there is a Quote the insert it now

View File

@ -77,7 +77,7 @@ public struct LinkPreview: Codable, Equatable, Hashable, FetchableRecord, Persis
// MARK: - Protobuf
public extension LinkPreview {
init?(_ db: Database, proto: SNProtoDataMessage, body: String?, sentTimestampMs: TimeInterval) throws {
init?(_ db: Database, proto: SNProtoDataMessage, sentTimestampMs: TimeInterval) throws {
guard let previewProto = proto.preview.first else { throw LinkPreviewError.noPreview }
guard URL(string: previewProto.url) != nil else { throw LinkPreviewError.invalidInput }
guard LinkPreview.isValidLinkUrl(previewProto.url) else { throw LinkPreviewError.invalidInput }
@ -86,9 +86,7 @@ public extension LinkPreview {
let timestamp: TimeInterval = LinkPreview.timestampFor(sentTimestampMs: sentTimestampMs)
let maybeLinkPreview: LinkPreview? = try? LinkPreview
.filter(LinkPreview.Columns.url == previewProto.url)
.filter(LinkPreview.Columns.timestamp == LinkPreview.timestampFor(
sentTimestampMs: Double(proto.timestamp)
))
.filter(LinkPreview.Columns.timestamp == timestamp)
.fetchOne(db)
if let linkPreview: LinkPreview = maybeLinkPreview {

View File

@ -276,7 +276,6 @@ extension MessageReceiver {
let linkPreview: LinkPreview? = try? LinkPreview(
db,
proto: dataMessage,
body: message.text,
sentTimestampMs: (messageSentTimestamp * 1000)
)?.saved(db)