Skip to content

[WIP] Remove database usage from push notification extension #452

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 14 commits into
base: dev
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 75 additions & 21 deletions Session.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,8 @@ extension ContextMenuVC {
dependencies[singleton: .openGroupManager].isUserModeratorOrAdmin(
publicKey: threadViewModel.currentUserSessionId,
for: threadViewModel.openGroupRoomToken,
on: threadViewModel.openGroupServer
on: threadViewModel.openGroupServer,
currentUserSessionIds: (threadViewModel.currentUserSessionIds ?? [])
)
)
let shouldShowEmojiActions: Bool = {
Expand Down
19 changes: 7 additions & 12 deletions Session/Conversations/ConversationVC+Interaction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -854,9 +854,7 @@ extension ConversationVC:
currentMentionStartIndex = lastCharacterIndex
snInputView.showMentionsUI(
for: self.viewModel.mentions(),
currentUserSessionId: self.viewModel.threadData.currentUserSessionId,
currentUserBlinded15SessionId: self.viewModel.threadData.currentUserBlinded15SessionId,
currentUserBlinded25SessionId: self.viewModel.threadData.currentUserBlinded25SessionId
currentUserSessionIds: (self.viewModel.threadData.currentUserSessionIds ?? [])
)
}
else if lastCharacter.isWhitespace || lastCharacter == "@" { // the lastCharacter == "@" is to check for @@
Expand All @@ -868,9 +866,7 @@ extension ConversationVC:
let query = String(newText[newText.index(after: currentMentionStartIndex)...]) // + 1 to get rid of the @
snInputView.showMentionsUI(
for: self.viewModel.mentions(for: query),
currentUserSessionId: self.viewModel.threadData.currentUserSessionId,
currentUserBlinded15SessionId: self.viewModel.threadData.currentUserBlinded15SessionId,
currentUserBlinded25SessionId: self.viewModel.threadData.currentUserBlinded25SessionId
currentUserSessionIds: (self.viewModel.threadData.currentUserSessionIds ?? [])
)
}
}
Expand Down Expand Up @@ -1473,7 +1469,8 @@ extension ConversationVC:
shouldShowClearAllButton: viewModel.dependencies[singleton: .openGroupManager].isUserModeratorOrAdmin(
publicKey: self.viewModel.threadData.currentUserSessionId,
for: self.viewModel.threadData.openGroupRoomToken,
on: self.viewModel.threadData.openGroupServer
on: self.viewModel.threadData.openGroupServer,
currentUserSessionIds: (self.viewModel.threadData.currentUserSessionIds ?? [])
)
)
reactionListSheet.modalPresentationStyle = .overFullScreen
Expand Down Expand Up @@ -1664,7 +1661,7 @@ extension ConversationVC:
guard !remove else {
return try? Reaction
.filter(Reaction.Columns.interactionId == cellViewModel.id)
.filter(Reaction.Columns.authorId == cellViewModel.currentUserSessionId)
.filter((cellViewModel.currentUserSessionIds ?? []).contains(Reaction.Columns.authorId))
.filter(Reaction.Columns.emoji == emoji)
.fetchOne(db)
}
Expand All @@ -1690,7 +1687,7 @@ extension ConversationVC:
if remove {
try Reaction
.filter(Reaction.Columns.interactionId == cellViewModel.id)
.filter(Reaction.Columns.authorId == cellViewModel.currentUserSessionId)
.filter((cellViewModel.currentUserSessionIds ?? []).contains(Reaction.Columns.authorId))
.filter(Reaction.Columns.emoji == emoji)
.deleteAll(db)
}
Expand Down Expand Up @@ -2028,9 +2025,7 @@ extension ConversationVC:
timestampMs: cellViewModel.timestampMs,
attachments: cellViewModel.attachments,
linkPreviewAttachment: cellViewModel.linkPreviewAttachment,
currentUserSessionId: cellViewModel.currentUserSessionId,
currentUserBlinded15SessionId: cellViewModel.currentUserBlinded15SessionId,
currentUserBlinded25SessionId: cellViewModel.currentUserBlinded25SessionId
currentUserSessionIds: (cellViewModel.currentUserSessionIds ?? [])
)

guard let quoteDraft: QuotedReplyModel = maybeQuoteDraft else { return }
Expand Down
138 changes: 68 additions & 70 deletions Session/Conversations/ConversationViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public class ConversationViewModel: OWSAudioPlayerDelegate, NavigatableStateHold
}()

// MARK: - Initialization

// TODO: [Database Relocation] Initialise this with the thread data from the home screen (might mean we can avoid some of the `initialData` query?
init(
threadId: String,
threadVariant: SessionThread.Variant,
Expand All @@ -125,8 +125,7 @@ public class ConversationViewModel: OWSAudioPlayerDelegate, NavigatableStateHold
currentUserIsClosedGroupAdmin: Bool?,
openGroupPermissions: OpenGroup.Permissions?,
threadWasMarkedUnread: Bool,
blinded15SessionId: SessionId?,
blinded25SessionId: SessionId?
currentUserSessionIds: Set<String>
)

let initialData: InitialData? = dependencies[singleton: .storage].read { db -> InitialData in
Expand Down Expand Up @@ -216,20 +215,28 @@ public class ConversationViewModel: OWSAudioPlayerDelegate, NavigatableStateHold
.asRequest(of: Bool.self)
.fetchOne(db))
.defaulting(to: false)
let blinded15SessionId: SessionId? = SessionThread.getCurrentUserBlindedSessionId(
db,
threadId: threadId,
threadVariant: threadVariant,
blindingPrefix: .blinded15,
using: dependencies
)
let blinded25SessionId: SessionId? = SessionThread.getCurrentUserBlindedSessionId(
db,
threadId: threadId,
threadVariant: threadVariant,
blindingPrefix: .blinded25,
using: dependencies
)
var currentUserSessionIds: Set<String> = Set([userSessionId.hexString])

if
threadVariant == .community,
let openGroupCapabilityInfo: LibSession.OpenGroupCapabilityInfo = try? LibSession.OpenGroupCapabilityInfo
.fetchOne(db, id: threadId)
{
currentUserSessionIds = currentUserSessionIds.inserting(SessionThread.getCurrentUserBlindedSessionId(
threadId: threadId,
threadVariant: threadVariant,
blindingPrefix: .blinded15,
openGroupCapabilityInfo: openGroupCapabilityInfo,
using: dependencies
)?.hexString)
currentUserSessionIds = currentUserSessionIds.inserting(SessionThread.getCurrentUserBlindedSessionId(
threadId: threadId,
threadVariant: threadVariant,
blindingPrefix: .blinded25,
openGroupCapabilityInfo: openGroupCapabilityInfo,
using: dependencies
)?.hexString)
}

return (
userSessionId,
Expand All @@ -241,8 +248,7 @@ public class ConversationViewModel: OWSAudioPlayerDelegate, NavigatableStateHold
currentUserIsClosedGroupAdmin,
openGroupPermissions,
threadWasMarkedUnread,
blinded15SessionId,
blinded25SessionId
currentUserSessionIds
)
}

Expand All @@ -264,18 +270,23 @@ public class ConversationViewModel: OWSAudioPlayerDelegate, NavigatableStateHold
threadWasMarkedUnread: initialData?.threadWasMarkedUnread,
using: dependencies
).populatingPostQueryData(
currentUserBlinded15SessionIdForThisThread: initialData?.blinded15SessionId?.hexString,
currentUserBlinded25SessionIdForThisThread: initialData?.blinded25SessionId?.hexString,
currentUserSessionIds: (
initialData?.currentUserSessionIds ??
[dependencies[cache: .general].sessionId.hexString]
),
wasKickedFromGroup: (
threadVariant == .group &&
LibSession.wasKickedFromGroup(groupSessionId: SessionId(.group, hex: threadId), using: dependencies)
dependencies.mutate(cache: .libSession) { cache in
cache.wasKickedFromGroup(groupSessionId: SessionId(.group, hex: threadId))
}
),
groupIsDestroyed: (
threadVariant == .group &&
LibSession.groupIsDestroyed(groupSessionId: SessionId(.group, hex: threadId), using: dependencies)
dependencies.mutate(cache: .libSession) { cache in
cache.groupIsDestroyed(groupSessionId: SessionId(.group, hex: threadId))
}
),
threadCanWrite: true, // Assume true
using: dependencies
threadCanWrite: true // Assume true
)
self.pagedDataObserver = nil
self.dependencies = dependencies
Expand All @@ -287,8 +298,10 @@ public class ConversationViewModel: OWSAudioPlayerDelegate, NavigatableStateHold
self.pagedDataObserver = self.setupPagedObserver(
for: threadId,
userSessionId: (initialData?.userSessionId ?? dependencies[cache: .general].sessionId),
blinded15SessionId: initialData?.blinded15SessionId,
blinded25SessionId: initialData?.blinded25SessionId,
currentUserSessionIds: (
initialData?.currentUserSessionIds ??
[dependencies[cache: .general].sessionId.hexString]
),
using: dependencies
)

Expand Down Expand Up @@ -342,27 +355,25 @@ public class ConversationViewModel: OWSAudioPlayerDelegate, NavigatableStateHold
.map { viewModel -> SessionThreadViewModel in
let wasKickedFromGroup: Bool = (
viewModel.threadVariant == .group &&
LibSession.wasKickedFromGroup(
groupSessionId: SessionId(.group, hex: viewModel.threadId),
using: dependencies
)
dependencies.mutate(cache: .libSession) { cache in
cache.wasKickedFromGroup(groupSessionId: SessionId(.group, hex: viewModel.threadId))
}
)
let groupIsDestroyed: Bool = (
viewModel.threadVariant == .group &&
LibSession.groupIsDestroyed(
groupSessionId: SessionId(.group, hex: viewModel.threadId),
using: dependencies
)
dependencies.mutate(cache: .libSession) { cache in
cache.groupIsDestroyed(groupSessionId: SessionId(.group, hex: viewModel.threadId))
}
)

return viewModel.populatingPostQueryData(
db,
currentUserBlinded15SessionIdForThisThread: self?.threadData.currentUserBlinded15SessionId,
currentUserBlinded25SessionIdForThisThread: self?.threadData.currentUserBlinded25SessionId,
currentUserSessionIds: (
self?.threadData.currentUserSessionIds ??
[userSessionId.hexString]
),
wasKickedFromGroup: wasKickedFromGroup,
groupIsDestroyed: groupIsDestroyed,
threadCanWrite: viewModel.determineInitialCanWriteFlag(using: dependencies),
using: dependencies
threadCanWrite: viewModel.determineInitialCanWriteFlag(using: dependencies)
)
}
}
Expand Down Expand Up @@ -436,8 +447,7 @@ public class ConversationViewModel: OWSAudioPlayerDelegate, NavigatableStateHold
private func setupPagedObserver(
for threadId: String,
userSessionId: SessionId,
blinded15SessionId: SessionId?,
blinded25SessionId: SessionId?,
currentUserSessionIds: Set<String>,
using dependencies: Dependencies
) -> PagedDatabaseObserver<Interaction, MessageViewModel> {
return PagedDatabaseObserver(
Expand Down Expand Up @@ -505,8 +515,7 @@ public class ConversationViewModel: OWSAudioPlayerDelegate, NavigatableStateHold
orderSQL: MessageViewModel.orderSQL,
dataQuery: MessageViewModel.baseQuery(
userSessionId: userSessionId,
blinded15SessionId: blinded15SessionId,
blinded25SessionId: blinded25SessionId,
currentUserSessionIds: currentUserSessionIds,
orderSQL: MessageViewModel.orderSQL,
groupSQL: MessageViewModel.groupSQL
),
Expand Down Expand Up @@ -562,14 +571,9 @@ public class ConversationViewModel: OWSAudioPlayerDelegate, NavigatableStateHold
],
dataQuery: MessageViewModel.QuotedInfo.baseQuery(
userSessionId: userSessionId,
blinded15SessionId: blinded15SessionId,
blinded25SessionId: blinded25SessionId
),
joinToPagedType: MessageViewModel.QuotedInfo.joinToViewModelQuerySQL(
userSessionId: userSessionId,
blinded15SessionId: blinded15SessionId,
blinded25SessionId: blinded25SessionId
currentUserSessionIds: currentUserSessionIds
),
joinToPagedType: MessageViewModel.QuotedInfo.joinToViewModelQuerySQL(),
retrieveRowIdsForReferencedRowIds: MessageViewModel.QuotedInfo.createReferencedRowIdsRetriever(),
associateData: MessageViewModel.QuotedInfo.createAssociateDataClosure()
)
Expand Down Expand Up @@ -635,16 +639,11 @@ public class ConversationViewModel: OWSAudioPlayerDelegate, NavigatableStateHold
),
isLastOutgoing: (
cellViewModel.id == sortedData
.filter {
$0.authorId == threadData.currentUserSessionId ||
$0.authorId == threadData.currentUserBlinded15SessionId ||
$0.authorId == threadData.currentUserBlinded25SessionId
}
.filter { (threadData.currentUserSessionIds ?? []).contains($0.authorId) }
.last?
.id
),
currentUserBlinded15SessionId: threadData.currentUserBlinded15SessionId,
currentUserBlinded25SessionId: threadData.currentUserBlinded25SessionId,
currentUserSessionIds: (threadData.currentUserSessionIds ?? []),
using: dependencies
)
}
Expand Down Expand Up @@ -714,16 +713,14 @@ public class ConversationViewModel: OWSAudioPlayerDelegate, NavigatableStateHold
let interaction: Interaction = Interaction(
threadId: threadData.threadId,
threadVariant: threadData.threadVariant,
authorId: (threadData.currentUserBlinded15SessionId ?? threadData.currentUserSessionId),
authorId: (threadData.currentUserSessionIds ?? [])
.first { $0.hasPrefix(SessionId.Prefix.blinded15.rawValue) }
.defaulting(to: threadData.currentUserSessionId),
variant: .standardOutgoing,
body: text,
timestampMs: sentTimestampMs,
hasMention: Interaction.isUserMentioned(
publicKeysToCheck: [
threadData.currentUserSessionId,
threadData.currentUserBlinded15SessionId,
threadData.currentUserBlinded25SessionId
].compactMap { $0 },
publicKeysToCheck: (threadData.currentUserSessionIds ?? []),
body: text
),
expiresInSeconds: threadData.disappearingMessagesConfiguration?.expiresInSeconds(),
Expand Down Expand Up @@ -769,7 +766,8 @@ public class ConversationViewModel: OWSAudioPlayerDelegate, NavigatableStateHold
return dependencies[singleton: .openGroupManager].isUserModeratorOrAdmin(
publicKey: threadData.currentUserSessionId,
for: threadData.openGroupRoomToken,
on: threadData.openGroupServer
on: threadData.openGroupServer,
currentUserSessionIds: (threadData.currentUserSessionIds ?? [])
)

default: return false
Expand Down Expand Up @@ -915,12 +913,13 @@ public class ConversationViewModel: OWSAudioPlayerDelegate, NavigatableStateHold

return (try MentionInfo
.query(
userPublicKey: userSessionId.hexString,
threadId: threadData.threadId,
threadVariant: threadData.threadVariant,
targetPrefixes: targetPrefixes,
currentUserBlinded15SessionId: self?.threadData.currentUserBlinded15SessionId,
currentUserBlinded25SessionId: self?.threadData.currentUserBlinded25SessionId,
currentUserSessionIds: (
self?.threadData.currentUserSessionIds ??
[userSessionId.hexString]
),
pattern: pattern
)?
.fetchAll(db))
Expand Down Expand Up @@ -1017,8 +1016,7 @@ public class ConversationViewModel: OWSAudioPlayerDelegate, NavigatableStateHold
self.pagedDataObserver = self.setupPagedObserver(
for: updatedThreadId,
userSessionId: dependencies[cache: .general].sessionId,
blinded15SessionId: nil,
blinded25SessionId: nil,
currentUserSessionIds: [dependencies[cache: .general].sessionId.hexString],
using: dependencies
)

Expand Down
Loading