ndb: switch profile queries to use transactions
this should ensure no crashing occurs when querying profiles
This commit is contained in:
+31
-29
@@ -359,13 +359,18 @@ struct ContentView: View {
|
||||
// wallet with an associated
|
||||
guard let ds = self.damus_state,
|
||||
let lud16 = nwc.lud16,
|
||||
let keypair = ds.keypair.to_full(),
|
||||
let profile = ds.profiles.lookup(id: ds.pubkey),
|
||||
lud16 != profile.lud16
|
||||
let keypair = ds.keypair.to_full()
|
||||
else {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
let profile_txn = ds.profiles.lookup(id: ds.pubkey)
|
||||
|
||||
guard let profile = profile_txn.unsafeUnownedValue,
|
||||
lud16 != profile.lud16 else {
|
||||
return
|
||||
}
|
||||
|
||||
// clear zapper cache for old lud16
|
||||
if profile.lud16 != nil {
|
||||
// TODO: should this be somewhere else, where we process profile events!?
|
||||
@@ -378,15 +383,9 @@ struct ContentView: View {
|
||||
ds.postbox.send(ev)
|
||||
}
|
||||
.onReceive(handle_notify(.broadcast)) { ev in
|
||||
guard let ds = self.damus_state else {
|
||||
return
|
||||
}
|
||||
guard let ds = self.damus_state else { return }
|
||||
|
||||
ds.postbox.send(ev)
|
||||
if let record = ds.profiles.lookup_with_timestamp(ev.pubkey),
|
||||
let event = ds.events.lookup_by_key(record.noteKey)
|
||||
{
|
||||
ds.postbox.send(event)
|
||||
}
|
||||
}
|
||||
.onReceive(handle_notify(.unfollow)) { target in
|
||||
guard let state = self.damus_state else { return }
|
||||
@@ -488,10 +487,12 @@ struct ContentView: View {
|
||||
}
|
||||
.onReceive(handle_notify(.onlyzaps_mode)) { hide in
|
||||
home.filter_events()
|
||||
|
||||
guard let damus_state,
|
||||
let profile = damus_state.profiles.lookup(id: damus_state.pubkey),
|
||||
let keypair = damus_state.keypair.to_full()
|
||||
|
||||
guard let ds = damus_state else { return }
|
||||
let profile_txn = ds.profiles.lookup(id: ds.pubkey)
|
||||
|
||||
guard let profile = profile_txn.unsafeUnownedValue,
|
||||
let keypair = ds.keypair.to_full()
|
||||
else {
|
||||
return
|
||||
}
|
||||
@@ -499,7 +500,7 @@ struct ContentView: View {
|
||||
let prof = Profile(name: profile.name, display_name: profile.display_name, about: profile.about, picture: profile.picture, banner: profile.banner, website: profile.website, lud06: profile.lud06, lud16: profile.lud16, nip05: profile.nip05, damus_donation: profile.damus_donation, reactions: !hide)
|
||||
|
||||
guard let profile_ev = make_metadata_event(keypair: keypair, metadata: prof) else { return }
|
||||
damus_state.postbox.send(profile_ev)
|
||||
ds.postbox.send(profile_ev)
|
||||
}
|
||||
.alert(NSLocalizedString("User muted", comment: "Alert message to indicate the user has been muted"), isPresented: $user_muted_confirm, actions: {
|
||||
Button(NSLocalizedString("Thanks!", comment: "Button to close out of alert that informs that the action to muted a user was successful.")) {
|
||||
@@ -507,11 +508,12 @@ struct ContentView: View {
|
||||
}
|
||||
}, message: {
|
||||
if let pubkey = self.muting {
|
||||
let profile = damus_state!.profiles.lookup(id: pubkey)
|
||||
let name = Profile.displayName(profile: profile, pubkey: pubkey).username.truncate(maxLength: 50)
|
||||
let name = damus_state!.profiles.lookup(id: pubkey).map { profile in
|
||||
Profile.displayName(profile: profile, pubkey: pubkey).username.truncate(maxLength: 50)
|
||||
}.value
|
||||
Text("\(name) has been muted", comment: "Alert message that informs a user was muted.")
|
||||
} else {
|
||||
Text("User has been muted", comment: "Alert message that informs a user was d.")
|
||||
Text("User has been muted", comment: "Alert message that informs a user was muted.")
|
||||
}
|
||||
})
|
||||
.alert(NSLocalizedString("Create new mutelist", comment: "Title of alert prompting the user to create a new mutelist."), isPresented: $confirm_overwrite_mutelist, actions: {
|
||||
@@ -567,8 +569,9 @@ struct ContentView: View {
|
||||
}
|
||||
}, message: {
|
||||
if let pubkey = muting {
|
||||
let profile = damus_state?.profiles.lookup(id: pubkey)
|
||||
let name = Profile.displayName(profile: profile, pubkey: pubkey).username.truncate(maxLength: 50)
|
||||
let name = damus_state?.profiles.lookup(id: pubkey).map({ profile in
|
||||
Profile.displayName(profile: profile, pubkey: pubkey).username.truncate(maxLength: 50)
|
||||
}).value ?? "unknown"
|
||||
Text("Mute \(name)?", comment: "Alert message prompt to ask if a user should be muted.")
|
||||
} else {
|
||||
Text("Could not find user to mute...", comment: "Alert message to indicate that the muted user could not be found.")
|
||||
@@ -799,7 +802,7 @@ enum FindEventType {
|
||||
}
|
||||
|
||||
enum FoundEvent {
|
||||
case profile(Profile, NostrEvent)
|
||||
case profile(Pubkey)
|
||||
case invalid_profile(NostrEvent)
|
||||
case event(NostrEvent)
|
||||
}
|
||||
@@ -816,11 +819,10 @@ func find_event_with_subid(state: DamusState, query query_: FindEvent, subid: St
|
||||
|
||||
switch query {
|
||||
case .profile(let pubkey):
|
||||
if let record = state.profiles.lookup_with_timestamp(pubkey),
|
||||
let profile = record.profile,
|
||||
let event = state.events.lookup_by_key(record.noteKey)
|
||||
if let record = state.ndb.lookup_profile(pubkey).unsafeUnownedValue,
|
||||
record.profile != nil
|
||||
{
|
||||
callback(.profile(profile, event))
|
||||
callback(.profile(pubkey))
|
||||
return
|
||||
}
|
||||
filter = NostrFilter(kinds: [.metadata], limit: 1, authors: [pubkey])
|
||||
@@ -857,11 +859,11 @@ func find_event_with_subid(state: DamusState, query query_: FindEvent, subid: St
|
||||
switch query {
|
||||
case .profile:
|
||||
if ev.known_kind == .metadata {
|
||||
guard let profile = state.profiles.lookup(id: ev.pubkey) else {
|
||||
guard state.ndb.lookup_profile_key(ev.pubkey) != nil else {
|
||||
callback(.invalid_profile(ev))
|
||||
return
|
||||
}
|
||||
callback(.profile(profile, ev))
|
||||
callback(.profile(ev.pubkey))
|
||||
}
|
||||
case .event:
|
||||
callback(.event(ev))
|
||||
|
||||
Reference in New Issue
Block a user